不是VIP会员,不能显示答案

题目解答

题目:
【扫雷游戏】(3+3+3+3+3+3=18)
Windows 中的扫雷游戏是大家都熟悉的小游戏,今天,味味也设计了一个简易的扫雷
游戏。味味设计的扫雷游戏功能如下:
1.程序一开始会读入扫雷的区域大小 n,表示扫雷区域有 n*n 个小方格组成, 接下来会读入 n 行信息,每行有 n 个整数(每个整数可能是 0, 也可能是 1) ,每两个整数之间用一个空格分隔。其中 0 表示所在位置的小方格内没有地雷, 1 表示所在位置的小方格内有地雷(游戏开始时,扫雷吉尔吉斯中必定包含至少一个地雷) 。
接下来每行输入两个用空格分开的正整数 i 和 j ,每一行的一对 i 和 j 表示用户用鼠标单击扫雷区域中第 i 行第 j 列位置上的小方格(就像我们 windows 中扫雷游戏一样) ,i和 j 表示的位置必定在扫雷区域内。程序每输入一对 i 和 j ,就马上进行相应的处理(就像我们在 windows 中鼠标单击某个小方块就会出现结果一样) 。
2.程序根据读入的一对 i 和 j 的值来对扫雷区域作相应处理,具体的处理规则如下:
(1)如果 i 和 j 表示的小方格内没有地雷、而且也没有被处理过(就是第 i 行第 j列的数值是 0) , 那么将以该小方格为中心的一个正方形区域内所有没有地雷的小方格都赋值为 -1(表示该区域的地砖被掀开) ,当然该正方形指的是在扫雷区域内的有效区域。如果在当前正方形区域内有一个位置号是 i1 和 j1( 注意,i1<>i 并且 j1<>j) 的小方格内恰好有地雷,则此地雷就被顺利扫除,将该位置标记为 -2。如果该正方形区域内某些小方格已经被处理过,则对这些小方格不再做任何处理。
举个例子来说明一下,假如输入信息如下左边所示,那么输出结果就如下右边所示:

(2)如果 i 和 j 表示的小方格已经被处理过(就是第 i 行第 j 列的数值是 -1 或者是-2) ,那么不作任何处理,继续去读取下一行的 i 和 j 的值。
(3)如果 i 和 j 表示的小方格刚好有地雷,并且该小主格没有被处理过(就是第 i行和第 j 列的数值是 1) ,那么表示用户触坜,输出信息“ GAME OVER ” ,程序结束。
3.如果在读入和处理 i 、j 的过程中一直没有触雷,那么就一直按照位置信息处理下去,直到满足下列条件之一,就输出相应信息并结束程序:
(1)读入的 i 和 j 的值都是 0(表示用户不再在某个小方格内单击右键了) ,则输出整个扫雷区域的状态(就是输出处理后来 n 行 n 列的方阵,每行中两个整数之间用一个空格分隔,末尾没有多余空格) ,然后程序结束。
(2)如果某次处理完后,游戏区域内所有的地雷都被扫除了,那么不必再读入一下行的信息,直接输出信息“ YOU ARE WINNER!! ” , 程序结束。
味味不小心把已经编好的程序误删了一些代码,请根据上面的功能要求,帮助味味
把下面的程序补充完整。
说明:
(1)halt 命令的功能是终止(结束)整个程序的运行。
(2)total 变量保存一开始扫雷区中地雷的总数, ok 变量保存当前已经被扫除的地雷总数。
输入样例: 6
0 0 0 0 0 0
0 0 1 0 0 0
1 0 0 0 1 0
0 0 0 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
1 1
3 4
5 5
4 6
5 2
输出样例 1:
GAME OVER!
输入样例: 5
0 0 1 1 0
1 0 0 0 0
0 0 1 0 1
0 0 0 0 0
0 1 1 0 1
2 2
2 4
4 4
5 5
3 1
0 0
输出样例 2:
-1 -1 -2 -2 -1
-2 -1 -1 -1 -1
-1 -1 -2 -1 -2
0 0 -1 -1 -1
0 1 -2 -1 -2 9
program test6; 
var i,j,total,ok,x,y,n:integer; 
a:array[1..50,1..50]of integer; 
procedure pro_1; 
var x,y,k:integer; 
begin 
for x:=  i-1  to i+1 do 
for j:=y-1 to y+1 do 
if (x>=1) and (y>=1) and (x<=n) and (y<=n) then  
begin 
 if  a[x,y]=0 或者 a[x,y]<>1 then a[x,y]=-1; 
if a[x,y]=1 then begin a[x,y]:=-2;   inc(ok)   ;end; 
end; 
end; 
begin  {main program  主程序 } 
readln(n); 
 total:=0;ok:=0; 
for x:=1 to n do 
begin 
  for y:=1 to n do  
begin  
read(a[x,y]); 
      if a[x,y]=1 then total:=total+1; 
   end; 
readln; 
end; 
  readln(i,j) ; 
while(i<>0)and (j<>0)do 
  begin 
    if  a[i,j]=0  then pro_1; 
if total=ok  then begin writeln( ‘YOU ARE WINNER!! ’);halt;end ; 
    if a[I,j]=1 then begin  writeln( ‘GAME OVER!’);halt;end ; 
    readln(i,j); 
    end; 
   for x=:1 to n do 
    begin 
    for y:=1 to n do write(a[x,y], ’ ‘); 
    writlen; 
    end; 
   end. 
 
考点:
分析:
解答:
评论:
老师: