1、正数表示此方格已经被挖开或被标记。矩阵元素数字表示的具体含义请见下表:数字含义正整数被标记的方格已被挖开的周围没有地雷的方格已被挖开的周围有1至8个地雷的方格零地图边界负整数未被挖开的周围有1至8个地雷的方格未被挖开的周围没有地雷的方格有地雷的方格游戏保存实现:将“需要记录的数据”用另一个矩阵记录起来。按键检测方法:使用“Getkey”命令获取按键后,因为该命令返回的数值最大为79且一定为非负整数,所以创建一个793的矩阵Mat H来判断按键。通过读取Mat HK,3(K为“Getkey”命令的返回值)即可立即判断按键是否有效。若按键有效,则可以非常方便地利用矩阵的数据移动光标。挖开方格的实现
2、(广度优先搜索的实现):当玩家挖开的方格周围八个方格都没有地雷,程序将自动挖开这个八个方格,也就是说对这八个方格的处理和对玩家挖开的方格的处理是一样的。具体实现时,用一个队列储存待挖开的方格,先将光标所在的方格加入队首。如果队列不为空,从队尾中取出一个方格,判断该方格周围八个方格是否有地雷。如果没有,则这八个方格加入到队首,对应方格显示一个空格;否则,只显示该方格上的数字。用深度优先搜索算法也可以实现方格的挖开,但考虑到广度优先搜索的动态显示效果比深度优先搜索的好,所以选择了广度优先搜索算法。自动挖开和自动标记的实现:统计光标周围八个方格中的标记数和未挖开的方格数。存在未挖开方格的前提下,如果
3、标记数等于光标所在方格上的数字,则将未挖开的方格加入到队首(即挖开这些方格);如果标记数加上未挖开的方格等于方格上的数字,则在未挖开的方格上添加标记。3.使用图形计算器编程实现。4.进行程序调试。5.游戏试用。具体实现步骤如下:1.打开图形计算器,按1进入“计算矩阵”模式。2.按e进入矩阵存储器。并创建矩阵:矩阵名尺寸用途Mat A239程序运行时保存地图信息Mat C82八个方向的相对偏移量Mat D游戏存档存放位置Mat E100广度搜索时用作储存队列Mat H793按键判断Mat C的初始化:Mat H的初始化:第27行为1,0,2;第28行为0,-1,1;第37行为0,1,3;第38行
4、为-1,0,4;第52行为1,1,-1;第53行为1,0,2;第54行为1,-1,-1;第62行为0,1,3;第64行为0,-1,1;第72行为-1,1,-1;第73行为-1,0,4;第74行为-1,-1,-1;其余矩阵元素为0。3.返回主菜单,进入“程序”模式。4.创建程序“MINE”,代码请参考“程序代码分析”或附件。5.创建程序“MDUG”,代码请参考“程序代码分析”或附件。6.创建程序“MINIT”,代码请参考“程序代码分析”或附件。7.创建程序“MSIGN”,代码请参考“程序代码分析”或附件。程序代码分析一、主程序MINEProgramMode:RUN_Mat _C,D,A,E,H(
5、-)1Z 变量Z记录设定的地雷个数,-1表示未定义Lbl 1“7 i”是程序MINIT的调用标志,表示此次调用由程序调用,以防误操作以致程序MINIT被单独运行7i:Prog MINIT游戏循环,M记录的是没标记或未挖开的方格数,N记录的是未标记的地雷个数While MNDo 按键获取循环,同时使当前选中的方格闪烁,以显示光标位置Locate X,Y, Red Locate X,Y,Str 2GetkeyKLpWhile K=0If Mat HK,3:Then 判断是否按下了方向键光标发生移动,根据矩阵里的数据,恢复光标目前所在方格的显示Mat AX+1,Y+1R If RMagenta Lo
6、cate X,Y,5IfEnd:IfEndX+Mat HK,1X 光标移动Y+Mat HK,2YIf Mat AX+1,Y+1=0:Then 判断是否到达了地图边界,由于左上角有两个方格显示未标记的地雷个数,这种情况需要特殊处理If X=22:If Y=1:Then 3XElse 1X:Else X=0 Or (X=2 And Mat HK,1=(-)1)=21XIf Y=8:If X=3:Then 1YElse 2Y:Else Y=0 Or (Y=1 And Mat HK,2=(-)1)=7YMat AX+1,Y+1R0 根据光标所在方格的状态,修改字符串2Then Str 1Str 2El
7、se If R=1 And R9=Str 3Str 2Else If K=63 Or K=31 Or K=29:按下了按键u、5或l,调用程序MDUGMDUGIf Mat AX+1,Y+1=(-)10:判断游戏是否结束了,程序MDUG执行完毕后,如果光标停在了地雷上则游戏结束LoseStr 4显示错误的标记和所有地雷的所在位置For 2J To 8For 2I To 22If Mat AI,J90=Red Locate I-1,J-1,NextBreak按下了按键y或m,标记地雷Else If K=43 Or K=39:Then Prog MSIGN Else If K=48:按下了p,暂停游
8、戏Menu Pause,Continue,3,Exit,4Lbl 3WhileEndFor 1I To 300:While Getkey=0Menu Str 4,Play again,1,2 游戏结束后的菜单Lbl 4 游戏保存的实现Mat AMat DMMat D1,1NMat D1,2XMat D1,3YMat D1,4Lbl 2:Stop二、子程序MINIT此子程序主要用于游戏前的初始化,主要是地图的随机生成和游戏存档的读取Ans7i=MINE:0 调用标志判断,如果不是由程序调用,则调用主程序ZGoto 4 地雷数已定义,直接开始随机生成地图字符串1保存未挖开且无标记方格的字符,字符串
9、3保存标记地雷用的字符Str 1:Str 3没有游戏存档时,询问地雷数的设置Mat D1,1=0=The num of mines3135,2,User-defined,3Goto 5 有游戏存档时直接读取游戏存档Lbl 1:31Z:Goto 435Z:Lbl 3:Num of mines=?ZLbl 4Int ZNN99=Goto 3ClrTextYou winStr 4 初始化游戏结果,用于游戏结束时显示Str 1Str 2 初始化字符串2,字符串2保存当前光标位置的字符初始化矩阵A,并随机生成地图Fill(0,Mat A)For 1I To NDoRanInt#(2,22)XRanInt
10、#(2,8)YLpWhile (Y=2 And (X=2 Or X=3) Or (Mat AX,Y(-)9Mat AI,J定义边界For 1I To 230Mat AI,10Mat AI,9For 2I To 8显示地图,因为未挖开任何一个方格,所以全为黑色的正方形。用这种方法显示可以加快显示速度Locate 1,I-1,0Mat A1,I0Mat A23,I0Mat A2,20Mat A3,2显示未标记的地雷个数If N9:Locate 1,1,NElse Locate 1,1,0Locate 2,1,N30 And N=60:使总地雷数在范围内时,光标所在方格及其周围八个方格上没有地雷Ra
11、nInt#(1,21)XRanInt#(1,7)YLpWhile (Y=1 And (X=1 Or X=2) Or (Mat AX+1,Y+1StrMid(N的显示地图的显示For 1J To 7For 1I To 21Mat AI+1,J+1RThen Locate I,J,Str 1=30:Then Red Locate I,J,Str 3Then Green Locate I,J,1Then Cyan Locate I,J,2Then Blue Locate I,J,3Then Yellow Locate I,J,4Else If R=5:Then Magenta Locate I,J,
12、5=6 And RRed Locate I,J,R三、子程序MDUG按下按键u、5或l后的所有操作都由这个子程序实现RReturn 如果当前方格有地雷或标记,则返回主程序If R当前方格显示数字,则统计未挖开方格数A和标记数B0P 变量P记录队首在矩阵E中的位置0A:0BFor 1I To 8If Mat AX+Mat CI,1+1,Y+Mat CI,2+1=30=1+BBIf A0 And R=B:实现自动挖开功能X+Mat CI,1XY+Mat CI,2Y挖开了地雷说明标记有错误,返回主程序,游戏结束Mat AX+1,Y+11+PPX+1Mat EP,1Y+1Mat EP,2(-)Mat
13、AX+1,Y+1Mat AX+1,Y+1X-Mat CI,1XY-Mat CI,2YElse If A,Mat AX+1,Y+1,1)Str 2(-)RMat AX+1,Y+1将当前方格加入队首1PX+1Mat E1,1Y+1Mat E1,20Q 变量Q记录队尾的下一个位置While P=0 And S已挖开的方格不能标记If S=0Then Locate 1,1,0总结1.扫雷游戏能在图形计算器上实现最重要的基础是利用了矩阵储存数据,矩阵的作用相当于内存和硬盘在计算机中的作用。在笔者编写的其他的较复杂的图形计算器程序中,矩阵都起到了不可或缺的作用。2.对矩阵元素储存地图信息的方法的设计影响到程序的编写复杂度。正负数表示地图上的方格是否已被挖开或标记,使得程序中可以方便地判断方格的状态;当挖开该方格时,只需将其数值取相反数即可。加上一个大数表示标记方格的方法,既保存了原有的地图信息,又立即标记了该方格。3.通过读取矩阵里的信息可以立即判断按键是否有效,同时矩阵元素储存的数据提供了坐标的偏移量。这个方法可以减少程序中的判断,加快程序的运行速度,使代码更简短,更易编写,更易读。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1