当前位置:首页 >> 数学 >> 辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏扫雷

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏扫雷


辽宁省沈阳市第十五中学 2013 年高中数学论文 图形计算器应用能 力测试活动学生 图形计算器游戏扫雷
利用图形计算器的编程功能,在 CASIO fx-CG20 图形计算器平台上实现了扫雷游戏。 本文中的程序利用了图形计算器中的矩阵来储存数据,通过模拟法和广度搜索算法实现扫 雷游戏,游戏中提供了自动挖开和自动标志功能,并能中途保存游戏。 [关键词] 图形计算器;扫雷; [前言] 观察过以前的获奖论文,大多数的论文只利用到图形计算器的画图功能和小部分的编 程功能。图形计算器编程功能的强大之处并未充分体现出来,而本文正是利用了图形计算 器强大的编程功能,从而在图形计算器上实现了扫雷游戏。 [研究目的] 利用图形计算器的编程功能,在图形计算器上实现扫雷游戏,从而锻炼编程能力和算 法能力,加深对广度优先搜索算法的理解,同时增强了 CASIO 图形计算器的娱乐功能,丰 富同学们的课余生活。 [程序功能说明] 游戏功能:玩家通过数字键 1、3、7、9、2、4、6 和 8 或 B、N、!和$移动光标选择 方格,按 u、5 或 l 可以挖开当前选定的方格。如果挖到地雷则游戏结束并显示所有地雷 的位置和标记错误的地方;如果当前方格挖开后显示一个数字 n 表示这个方格周围 8 个方 块里总共有 n 个地雷;如果当前方格和周围 8 个方块里都没有地雷,则会自动挖开一片没 有地雷的区域。按 y 或 m 标记当前方格,在有标记的方格再按一次 y 或 m,则取消标记。 (如图 1)

图1 自动挖开和自动标记功能:如果玩家选择了一个已挖开的显示数字的方格,并按下按 键 u、5 或 l,则程序会自动判断周围 8 个方格的情况,从而进行自动标记或自动挖开周 围的方格。 游戏保存功能:游戏中途按 p 可暂停游戏,选择“Exit”可退出并保存游戏。(如图 2)下次运行程序时,程序会自动读取存档。(如图 3)

1

图 2 暂停游戏菜单 特色:

图 3 游戏存档读取中

1. 游戏运行时,左上角会显示未标记的地雷个数。(如图 1) 2. 随机生成地图的游戏模式下,开始游戏时光标所在的方格一定没有地雷。如果总地 雷数在范围内,则光标周围八个方格也没有地雷。这个设计是为了降低游戏难 度。 3. 程序根据方格上的数字的大小用不同的颜色显示。(如图 4)

图4 [研究过程] 1. 确定程序功能,请参考“游戏功能说明”。 2. 构思算法: 本程序在游戏实现方面使用模拟法,挖开方格时用非递归的广度搜索算法实现。 使用一个矩阵保存游戏时的地图,一个矩阵元素对应地图上的一个方格。 需要记录的数据:光标位置、地图信息、未标记的地雷数、未挖开且无标记的方 格数 矩阵记录地图信息的方法:矩阵元素上的数字表示地图对应方格的当前状态:用 负数表示此方格还没有被标记或被挖开;零表示表示地图的边界,对应地图上不显示 的地方;正数表示此方格已经被挖开或被标记。矩阵元素数字表示的具体含义请见下 表: 数字 含义

2

正整数

被标记的方格 已被挖开的周围没有地雷的方格 已被挖开的周围有 1 至 8 个地雷的方格

零 负整数

地图边界 未被挖开的周围有 1 至 8 个地雷的方格 未被挖开的周围没有地雷的方格 有地雷的方格

游戏保存实现:将“需要记录的数据”用另一个矩阵记录起来。 按键检测方法:使用“Getkey”命令获取按键后,因为该命令返回的数值最大为 79 且一定为非负整数,所以创建一个 79×3 的矩阵 Mat H 来判断按键。通过读取 Mat H[K,3](K 为“Getkey”命令的返回值)即可立即判断按键是否有效。若按键有效, 则可以非常方便地利用矩阵的数据移动光标。 挖开方格的实现(广度优先搜索的实现):当玩家挖开的方格周围八个方格都没 有地雷,程序将自动挖开这个八个方格,也就是说对这八个方格的处理和对玩家挖开 的方格的处理是一样的。具体实现时,用一个队列储存待挖开的方格,先将光标所在 的方格加入队首。如果队列不为空,从队尾中取出一个方格,判断该方格周围八个方 格是否有地雷。如果没有,则这八个方格加入到队首,对应方格显示一个空格;否 则,只显示该方格上的数字。用深度优先搜索算法也可以实现方格的挖开,但考虑到 广度优先搜索的动态显示效果比深度优先搜索的好,所以选择了广度优先搜索算法。 自动挖开和自动标记的实现:统计光标周围八个方格中的标记数和未挖开的方格 数。存在未挖开方格的前提下,如果标记数等于光标所在方格上的数字,则将未挖开 的方格加入到队首(即挖开这些方格);如果标记数加上未挖开的方格等于方格上的 数字,则在未挖开的方格上添加标记。 3. 使用图形计算器编程实现。 4. 进行程序调试。 5. 游戏试用。

具体实现步骤如下: 1. 打开图形计算器,按 1 进入“计算·矩阵”模式。 2. 按 e 进入矩阵存储器。并创建矩阵: 矩阵名 Mat A Mat C 尺寸 23×9 8×2 用途 程序运行时保存地图信息 八个方向的相对偏移量

3

Mat D Mat E Mat H

23×9 100×2 79×3

游戏存档存放位置 广度搜索时用作储存队列 按键判断

Mat C 的初始化:

Mat H 的初始化: 第 27 行为 1,0,2;第 28 行为 0,-1,1; 第 37 行为 0,1,3;第 38 行为-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. 创建程序“M~DUG”,代码请参考“程序代码分析”或附件。 6. 创建程序“M~INIT”,代码请参考“程序代码分析”或附件。 7. 创建程序“M~SIGN”,代码请参考“程序代码分析”或附件。 [程序代码分析] 一、


主程序 MINE

'ProgramMode:RUN '_Mat _C,D,A,E,H (-)1→Z Lbl 1 '“7 i”是程序 M~INIT 的调用标志,表示此次调用由程序调用,以防误操作以致程序 M~INIT 被单独运行 7i:Prog "M~INIT" '游戏循环,M 记录的是没标记或未挖开的方格数,N 记录的是未标记的地雷个数 '变量 Z 记录设定的地雷个数,-1 表示未定义



为了便于阅读和交流,笔者将由计算器转换成 txt 文件得出的代码加以修改并增加缩进,同时还添加了 程序注释。如需将代码导入计算器中,请参见附件。

4

While M>N Do '按键获取循环,同时使当前选中的方格闪烁,以显示光标位置 Locate X,Y," " Red Locate X,Y,Str 2 Getkey→K LpWhile K=0

If Mat H[K,3]:Then

'判断是否按下了方向键

'光标发生移动,根据矩阵里的数据,恢复光标目前所在方格的显示 Mat A[X+1,Y+1]→R If R<0:Then Locate X,Y,Str 1 Else If R=9:Then Locate X,Y," " Else If R=1:Then Green Locate X,Y,1 Else If R=2:Then Cyan Locate X,Y,2 Else If R=3:Then Blue Locate X,Y,3 Else If R=4:Then Yellow Locate X,Y,4 Else R=5=>Magenta Locate X,Y,5 IfEnd:IfEnd:IfEnd:IfEnd:IfEnd:IfEnd X+Mat H[K,1]→X Y+Mat H[K,2]→Y If Mat A[X+1,Y+1]=0:Then '判断是否到达了地图边界,由于左上角有两个方格显示未标记的地 雷个数,这种情况需要特殊处理 If X=22:Then If Y=1:Then 3→X Else 1→X:IfEnd Else X=0 Or (X=2 And Mat H[K,1]=(-)1)=>21→X IfEnd If Y=8:Then If X>=3:Then 1→Y Else 2→Y:IfEnd Else Y=0 Or (Y=1 And Mat H[K,2]=(-)1)=>7→Y
5

'光标移动

IfEnd IfEnd

Mat A[X+1,Y+1]→R If R<0 '根据光标所在方格的状态,修改字符串 2

Then Str 1→Str 2 Else If R>=1 And R<=9 Then StrMid("12345678·",R,1)→Str 2 Else R>9=>Str 3→Str 2 IfEnd:IfEnd

Else If K=63 Or K=31 Or K=29:Then '按下了按键 u、5 或 l,调用程序 M~DUG Prog "M~DUG" If Mat A[X+1,Y+1]<=(-)10:Then '判断游戏是否结束了,程序 M~DUG 执行完毕后,如果光标停在了地雷上则游戏结束 "Lose"→Str 4 '显示错误的标记和所有地雷的所在位置 For 2→J To 8 For 2→I To 22 If Mat A[I,J]<=(-)10 Then Red Locate I-1,J-1,"" Else Mat A[I,J]>90=>Red Locate I-1,J-1,"×" IfEnd Next Next Break IfEnd '按下了按键 y 或 m,标记地雷 Else If K=43 Or K=39:Then Prog "M~SIGN" Else If K=48:Then '按下了 p,暂停游戏

6

Menu "Pause","Continue",3,"Exit",4 Lbl 3 IfEnd:IfEnd:IfEnd:IfEnd WhileEnd For 1→I To 300:Next While Getkey=0 WhileEnd Menu Str 4,"Play again",1,"Exit",2 Lbl 4 Mat A→Mat D M→Mat D[1,1] N→Mat D[1,2] X→Mat D[1,3] Y→Mat D[1,4] Lbl 2:Stop 二、 子程序 M~INIT '游戏保存的实现 '游戏结束后的菜单

'ProgramMode:RUN '此子程序主要用于游戏前的初始化,主要是地图的随机生成和游戏存档的读取 Ans<>7i=>Prog "MINE":0 Z<>(-)1=>Goto 4 '调用标志判断,如果不是由程序调用,则调用主程序 '地雷数已定义,直接开始随机生成地图

'字符串 1 保存未挖开且无标记方格的字符,字符串 3 保存标记地雷用的字符 "■"→Str 1:" "→Str 3

'没有游戏存档时,询问地雷数的设置 Mat D[1,1]=0=>Menu "The num of mines","31",1,"35",2,"User-defined",3 Goto 5 '有游戏存档时直接读取游戏存档

Lbl 1:31→Z:Goto 4 Lbl 2:35→Z:Goto 4 Lbl 3:"Num of mines="?→Z Lbl 4 Int Z→N N<=0 Or N>99=>Goto 3
7

ClrText "You win"→Str 4 Str 1→Str 2 '初始化游戏结果,用于游戏结束时显示 '初始化字符串 2,字符串 2 保存当前光标位置的字符

'初始化矩阵 A,并随机生成地图 Fill(0,Mat A) For 1→I To N Do RanInt#(2,22)→X RanInt#(2,8)→Y LpWhile (Y=2 And (X=2 Or X=3)) Or (Mat A[X,Y]<=(-)10) (-)10→Mat A[X,Y] For 1→J To 8 '将周围八个矩阵元素上的数值减去一,表示这八个方格周围的地雷数增加了一 Mat A[X+Mat C[J,1],Y+Mat C[J,2]]-1→Mat A[X+Mat C[J,1],Y+Mat C[J,2]] Next Next For 2→J To 8 For 2→I To 22 '数值为零的位置,表示周围没有地雷,以防与边界混淆,用-9 表示 Mat A[I,J]=0=>(-)9→Mat A[I,J] Next Next '定义边界 For 1→I To 23 0→Mat A[I,1] 0→Mat A[I,9] Next For 2→I To 8 '显示地图,因为未挖开任何一个方格,所以全为黑色的正方形。用这种方法显示 可以加快显示速度 Locate 1,I-1,"■■■■■■■■■■■■■■■■■■■■■"

8

0→Mat A[1,I] 0→Mat A[23,I] Next 0→Mat A[2,2] 0→Mat A[3,2] '显示未标记的地雷个数 If N>9:Then Locate 1,1,N Else Locate 1,1,0 Locate 2,1,N IfEnd If N>30 And N<=60:Then '使总地雷数在范围内时,光标所在方格及其周围八个方格上没有地雷 Do RanInt#(1,21)→X RanInt#(1,7)→Y LpWhile (Y=1 And (X=1 Or X=2)) Or (Mat A[X+1,Y+1]<>(-)9) Else '使光标所在的方格一定没有地雷 Do RanInt#(1,21)→X RanInt#(1,7)→Y LpWhile (Y=1 And (X=1 Or X=2)) Or (Mat A[X+1,Y+1]<=(-)10) IfEnd 145→M:0→E:0→F Return Lbl 5 "You win"→Str 4 '游戏存档的读取 Mat D→Mat A

9

Mat A[1,1]→M:Mat A[1,2]→N Mat A[1,3]→X:Mat A[1,4]→Y 0→Mat D[1,1]: 0→Mat A[1,1]: 0→Mat A[1,2]: 0→Mat A[1,3]: 0→Mat A[1,4] Mat A[X+1,Y+1]→R If R<0 Then Str 1→Str 2 Else If R>30 Then Str 3→Str 2 Else R>=1 And R<=9=>StrMid("12345678·",R,1)→Str 2 IfEnd:IfEnd 'N 的显示 If N>9:Then Locate 1,1,N Else Locate 1,1,0 Locate 2,1,N IfEnd '地图的显示 For 1→J To 7 For 1→I To 21 Mat A[I+1,J+1]→R If R<0:Then Locate I,J,Str 1 Else If R>=30:Then Red Locate I,J,Str 3 Else If R=1:Then Green Locate I,J,1 Else If R=2:Then Cyan Locate I,J,2 Else If R=3:Then Blue Locate I,J,3 Else If R=4:Then Yellow Locate I,J,4 Else If R=5:Then Magenta Locate I,J,5 Else R>=6 And R<=8=>Red Locate I,J,R IfEnd:IfEnd:IfEnd IfEnd:IfEnd:IfEnd

10

IfEnd: Next Next 三、 子程序 M~DUG

'ProgramMode:RUN '按下按键 u、5 或 l 后的所有操作都由这个子程序实现 Mat A[X+1,Y+1]→R R<=(-)10 Or R>=9=>Return If R>0:Then 0→P 0→A:0→B For 1→I To 8 If Mat A[X+Mat C[I,1]+1,Y+Mat C[I,2]+1]<0:Then 1+A→A Else Mat A[X+Mat C[I,1]+1,Y+Mat C[I,2]+1]>=30=>1+B→B IfEnd Next '如果当前方格有地雷或标记,则返回主程序

'当前方格显示数字,则统计未挖开方格数 A 和标记数 B '变量 P 记录队首在矩阵 E 中的位置

If A<>0 And R=B:Then '实现自动挖开功能 For 1→I To 8 X+Mat C[I,1]→X Y+Mat C[I,2]→Y If Mat A[X+1,Y+1]<0:Then '挖开了地雷说明标记有错误,返回主程序,游戏结束 Mat A[X+1,Y+1]<=(-)10=>Return 1+P→P X+1→Mat E[P,1] Y+1→Mat E[P,2] (-)Mat A[X+1,Y+1]→Mat A[X+1,Y+1] IfEnd X-Mat C[I,1]→X

11

Y-Mat C[I,2]→Y Next

Else If A<>0 And R=A+B:Then '实现自动标记功能 For 1→I To 8 X+Mat C[I,1]→X Y+Mat C[I,2]→Y Mat A[X+1,Y+1]<0=>Prog "M~SIGN" X-Mat C[I,1]→X Y-Mat C[I,2]→Y Next StrMid("12345678· ",Mat A[X+1,Y+1],1)→Str 2 IfEnd:IfEnd

Else (-)R→Mat A[X+1,Y+1] StrMid("12345678·",Mat A[X+1,Y+1],1)→Str 2 '将当前方格加入队首 1→P X+1→Mat E[1,1] Y+1→Mat E[1,2] IfEnd

0→Q While P<>Q

'变量 Q 记录队尾的下一个位置 '当队列不为空时执行循环

'取出队尾方格 MOD(Q,100)+1→Q Mat E[Q,1]→S Mat E[Q,2]→T Mat A[S,T]→R

12

If R>=1 And R<9:Then M-1→M:S-1→S:T-1→T

'方格为数字直接将其显示出来

If R=1:Then Green Locate S,T,1 Else If R=2:Then Cyan Locate S,T,2 Else If R=3:Then Blue Locate S,T,3 Else If R=4:Then Yellow Locate S,T,4 Else If R=5:Then Magenta Locate S,T,5 Else If R>=6 And R<=8:Then Red Locate S,T,R IfEnd:IfEnd:IfEnd IfEnd:IfEnd:IfEnd Else If R=9:Then M-1→M Locate S-1,T-1," " For 1→I To 8 S+Mat C[I,1]→A T+Mat C[I,2]→B Mat A[A,B]→R If R<0:Then '方格符合条件则加入队首 '方格周围八个方格没有地雷

(-)R→Mat A[A,B] MOD(P,100)+1→P A→Mat E[P,1] B→Mat E[P,2] IfEnd Next IfEnd:IfEnd WhileEnd 四、 子程序 M~SIGN

'ProgramMode:RUN '此子程序实现标记地雷 Mat A[X+1,Y+1]→S S>=0 And S<30=>Return '已挖开的方格不能标记

13

If S<0:Then '当前方格未被标记,进行标记 S+100→Mat A[X+1,Y+1] '将矩阵 A 上对应的矩阵元素加上 100,以 表示此方格已被标记,同时可以通过减去 100 恢复未标记的状态 N-1→N:M-1→M Red Locate X,Y,Str 3 Str 3→Str 2 Else '当前方格已被标记,则取消标记 Locate X,Y,Str 1 S-100→Mat A[X+1,Y+1] N+1→N:M+1→M Str 1→Str 2 IfEnd '更新 N 的显示 If N>=10 Then Locate 1,1,N Else If N>=0 Then Locate 1,1,0 Locate 2,1,N IfEnd:IfEnd [总结] 1. 扫雷游戏能在图形计算器上实现最重要的基础是利用了矩阵储存数据,矩阵的作用相 当于内存和硬盘在计算机中的作用。在笔者编写的其他的较复杂的图形计算器程序 中,矩阵都起到了不可或缺的作用。 2. 对矩阵元素储存地图信息的方法的设计影响到程序的编写复杂度。正负数表示地图上 的方格是否已被挖开或标记,使得程序中可以方便地判断方格的状态;当挖开该方格 时,只需将其数值取相反数即可。加上一个大数表示标记方格的方法,既保存了原有 的地图信息,又立即标记了该方格。 3. 通过读取矩阵里的信息可以立即判断按键是否有效,同时矩阵元素储存的数据提供了 坐标的偏移量。这个方法可以减少程序中的判断,加快程序的运行速度,使代码更简 短,更易编写,更易读。

14

4.

15


赞助商链接
更多相关文档:

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 转动的风车_数学_高中教育_教育专区。辽宁省沈阳市第十五中学 2013 年高中数学论文 图形...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 图形计算器游戏扫雷_数学_高中教育_教育专区。辽宁省沈阳市第十五中学 2013 年高中数学论...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 探究出手角度对抛物运动的影响_数学_高中教育_教育专区。今日...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生“乐动达人”简易版的编制_数学_高中教育_教育专区。辽宁省沈阳市第十五中学 2013 年高中...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学 2013 年高中数学论文 图形计算器应用能 力测试活动学生 利用图形计算器绘制微笑女孩 “人生是一串由无数小烦恼组成的念珠, 乐观的人是笑着...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学 2013 年高中数学论文 图形计算器应用能 力测试活动学生 卡西欧计算器之图形 神州火箭研究目的 利用简单有趣的图形来研究图像的形态太小,...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学 2013 年高中数学论文 图形计算器应用能 力测试活动学生 愤怒小鸟中的数学知识【摘要】本短文利用图形计算器对愤怒的小鸟的飞行轨迹进行了...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学 2013 年高中数学论文 图形计算器应用能力测试活动 学生 对“万箭穿心”图像的探究 引言 《廊桥遗梦》里有一句经典对白——爱情并不遵从我们...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 外星入侵 暂无评价|0人阅读|0次下载|举报文档 辽宁省沈阳市第十五中学 2013 年高中数学...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器...

辽宁省沈阳市第十五中学2013年高中数学论文 图形计算器应用能力测试活动学生 零点问题的研究_数学_高中教育_教育专区。今日推荐 157份文档 2015...

更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com