扫雷游戏制作
1
(7,3)
2
(7,4)
2
(7,5)
2
(7,6)
1
(7,7)
1
(7,8)
0
(7,9)
0
(8,0)
1
(8,1)
1
(8,2)
1
(8,3)
1
(8,4) (8,5)
2
(8,6) (8,7)
1
(8,8)
0
(8,9)
1
(9,0)
1
(9,1) (9,2)
1
(9,3)
1
(9,4)
1
(9,5)
1
(9,6)
1
(9,7)
扫雷游戏制作
一、分析扫雷游戏的基本功能
• • • • • • • • • • 1、从外观上分析: 方块 笑脸 地雷数目显示 计时器 有雷标识 无雷标识 红旗显示 胜利画面 失败画面
一、分析扫雷游戏的基本功能
• 2、从操作上分析:
单击 鼠标 右击 双击
点击鼠标左键于未知 区域,如果未知区域有 雷,游戏停止,显示所 有的地雷。如果没雷, 则显示周围雷数,如果 周围没雷,则再查看周 围八个区域是否有雷 直到有雷为止,并显 示雷的数目。
0
(2,4)
0
(2,5)
0
(2,6)
1
(2,7)
1
(2,8)
1
(2,9)
1
(3,0)
0
(3,1)
0
(3,2)
1
(3,3)
0
(3,4)
0
(3,5)
0
(3,6)
1
(3,7) (3,8)
1
(3,9)
0
(4,0)
1
(4,1) (4,2)
1
(4,3)
0
(4,4)
1
(4,5)
1
(4,6)
1
(4,7)
1
(4,8)
二、需求分析
• • • • • • • 3、功能模块: (1)游戏界面 (2)布雷 (3)鼠标事件 (4)地雷判断 (5)游戏胜利 (6)游戏结束
二、需求分析
• 3、功能模块: • (7)游戏设置。 • (8)查看英雄榜,帮助。
三、总体设计
• • • • • 1、游戏总体流程图 用圆角矩形代表数据开始和结束。 用矩形代表数据处理。 用菱形代表判断。 用带方向的箭头代表数据流向。
0
(9,9)
0
1
1
1
0
0
0
0
0
0
(0,0)
(0,1)
(0,2)
(0,3)
(0,4)
(0,5)
(0,6)
(0,7)
(0,8)
(0,9)
1
(1,0)
1
(1,1)
1
(1,2)
0
(1,3)
0
(1,4)
0
(1,5)
0
(1,6)
0
(1,7)
0
(1,8)
0
(1,9)
1
(2,0) (2,1)
1
(2,2)
0
(2,3)
1
(9,8)
0
(9,9)
0
1
1
1
0
0
0
0
0
0
int ShowWhite(int i,int j)/*显示无雷区的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就 不对该格进行任何判断*/ return; NmineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子 当所有格子都处理过了表示胜利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/ { DrawEmpty(i,j,1,7); Mine[i][j].num=0; } else if(Mine[i][j].roundnum!=0)/*输出雷数*/ { DrawEmpty(i,j,0,8); sprintf(randmineNUM,"%d",Mine[i][j].roundnum); setcolor(RED); outtextxy(195+j*20,95+i*20,randmineNUM); Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/ return ; }
二、需求分析
• 2、功能需求: • (6)点击鼠标右键于未知区域,则显示小红 旗,将其置为有雷。在该位置再次点击右 键则视为不确定,显示问号,点击第三次, 取消设置,问号消失。 • (7)如果该数字方块周围地雷已经完全标 识出,双击该数字所在方块,将快速翻开 所有周围不是地雷的方块,并显示,直到 有雷为止。
2
(4,9)
1
(5,0)
1
(5,1)
1
(5,2)2(5,)1(5,4)
2
(5,5) (5,6)
1
(5,7)
1
(5,8) (5,9)
1
(6,0) (6,1)
1
(6,2)
1
(6,3) (6,4)
2
(6,5)
1
(6,6)
1
(6,7)
1
(6,8)
1
(6,9)
1
(7,0)
1
(7,1)
1
(7,2)
1
(7,3)
三、总体设计
• 3、布雷 • (2) 核心算法的实现 ) • 整个游戏程序包含3个阶段:布雷、扫雷过程和结果 (并不是操作结果展示,而是在扫雷过程中,玩家通 过与游戏交互后的操作结果展示)。 • 首先定义雷方块的数据结构,具体描述如下所示。 • struct • { int num;/*格子当前处于什么状态,1有雷,0已经显 示过数字或者空白格子*/ • int roundnum;/*统计格子周围有多少雷*/ • int flag;/*右键按下显示红旗的标志,0没有红旗标 志,1有红旗标志*/ • }Mine[10][10];然后定义雷方块的状态类别和属性类别。
二、需求分析
• 1、功能概述: • 按功能将游戏区域分成两个区域:雷区和 提示区。提示区包括一个计数器和一个按 键操作。游戏过程中,当玩家用鼠标点击 相应的方块,程序就会作出相应的鼠标响 应事件,而众多鼠标事件的处理,都是围 绕着实现扫雷程序的算法而衍生的。
二、需求分析
• 1、功能概述: • 游戏开始时,系统会在雷区的某些小方块 中随机布下若干个地雷。安放好地雷的小 方块称之为雷方块,其他的称之为非雷方 块。部署完毕后,系统会在其他非雷方块 中填充一些数字。某一个具体数字表示与 其紧邻的8个方块中有多少雷方块。玩家可 以根据这些信息去判断是否可以打开某些 方块,并把认为是地雷的方块打上标识。 如果某个数字方块周围的地雷全都标记完, 可以指向该方块并同时点击鼠标左右键, 将其周围剩下的方块挖开。
/*8个方向递归显示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1) ShowWhite(i-1,j); if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1) ShowWhite(i-1,j+1); if(j!=9&&Mine[i][j+1].num!=1) ShowWhite(i,j+1); if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1) ShowWhite(i+1,j+1); if(i!=9&&Mine[i+1][j].num!=1) ShowWhite(i+1,j); if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1) ShowWhite(i+1,j-1); if(j!=0&&Mine[i][j-1].num!=1) ShowWhite(i,j-1); if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1) ShowWhite(i-1,j-1);}
二、需求分析
2、功能需求: • (1)雷区上部左侧显示总雷数,并减去被 标明有雷区域的数目。 • (2)雷区上部中间位置显示一按钮用于开 局和显示鼠标动作的结果。 • (3)雷区上部右侧显示扫雷的时间。
二、需求分析
• 2、功能需求: • (4)将雷全部扫清后,则显示一对话框将你 的姓名记入排行榜。以时间排序。 • (5)点击鼠标左键于未知区域,如果未知区 域有雷,游戏停止,显示所有的地雷。如果没 雷,则显示周围雷数,如果周围没雷,则再查看 周围八个区域是否有雷直到有雷为止,并 显示周围雷的数目。
鼠标左击事件流程图
空白格子拓展
(0,0)
(0,1)
(0,2)
(0,3)
(0,4)
(0,5)
(0,6)
(0,7)
(0,8)
(0,9)
1
(1,0)
1
(1,1)
1
(1,2)
0
(1,3)
0
(1,4)
0
(1,5)
0
(1,6)
0
(1,7)
0
(1,8)
0
(1,9)
1
(2,0) (2,1)
1
(2,2)
0
(2,3)
三、总体设计
• 游戏总体流程图
三、总体设计
• 1、游戏界面 • (1)提示区 • (2)雷区