步骤一:初步明确游戏的功能
先粗略罗列本次扫雷游戏的相关功能(参考类似扫雷游戏的基本玩法)。
1 | 使用控制台实现简单扫雷游戏 |
2 | 能够通过菜单实现继续玩或退出游戏 |
3 | 规定扫雷棋盘的范围9x9方格 |
4 | 实现随机布置设定数量的地雷 |
5 | 排查位置是雷,炸死,游戏结束 |
6 | 排查位置不是雷,显示该位置周围一圈方格的地雷数量 |
7 | 找到所有非雷时,排雷成功,游戏结束 |
8 | (5-7项均为排查雷,O表示地雷,P表示非地雷) |
步骤二:数据结构的分析
众所周知,扫雷游戏的核心就是布置地雷和排查地雷的位置,所以布置的雷和排查的雷的信息都需要移动数据结构进行储存。
已知布雷和排雷的操作均在9x9的棋盘上,所以可以创建一个9x9的二维数组进行存放。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | |||||||||
1 | |||||||||
2 | |||||||||
3 | |||||||||
4 | |||||||||
5 | |||||||||
6 | |||||||||
7 | |||||||||
8 |
根据自己规划设置:如果布置雷,存放O;没有布置雷,存放P
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | P | P | P | P | P | P | P | P | P |
1 | P | P | P | P | P | P | P | P | P |
2 | P | P | O | P | P | O | P | P | P |
3 | P | P | P | P | P | P | O | P | P |
4 | P | P | P | P | P | P | P | P | P |
5 | P | P | P | P | P | P | O | P | P |
6 | O | P | O | P | O | P | P | P | P |
7 | P | O | P | P | O | P | O | P | P |
8 | P | P | P | P | P | P | P | P | P |
假设排查(2,5)坐标的位置,访问周围一圈8个位置,统计周围地雷数量是1
假设排查(8,6)坐标的位置,访问周围一圈8个位置,统计周围个数时,最下面3个坐标会出现越界情况。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
0 | P | P | P | P | P | P | P | P | P |
1 | P | P | P | P | P | P | P | P | P |
2 | P | P | O | P | P | O | P | P | P |
3 | P | P | P | P | P | P | O | P | P |
4 | P | P | P | P | P | P | P | P | P |
5 | P | P | P | P | P | P | O | P | P |
6 | O | P | O | P | O | P | P | P | P |
7 | P | O | P | P | O | P | O | P | P |
8 | P | P | P | P | P | P | P | P | P |
为防止越界,出现超出数组元素最大数值,在保证布雷范围9x9的基础上扩大数组,扩大范围不布雷,解决越界问题,所以此处数组可以扩大为11x11
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
1 | |||||||||||
2 | P | P | P | P | P | P | P | P | P | ||
3 | P | P | P | P | P | P | P | P | P | ||
4 | P | P | O | P | P | O | P | P | P | ||
5 | P | P | P | P | P | P | O | P | P | ||
6 | P | P | P | P | P | P | P | P | P | ||
7 | P | P | P | P | P | P | O | P | P | ||
8 | O | P | O | P | O | P | P | P | P | ||
9 | P | O | P | P | O | P | O | P | P | ||
10 | P | P | P | P | P | P | P | P | P | ||
11 |
继续分析,已知在棋盘上布置好了雷O和非雷P,存在以下情况:
排查的位置不是雷O时,但周围有雷,需要把排查出的雷的数量存储并打印,作为排雷的依据。此时,排查出的雷不能放入布置雷的数组,不然数据会混淆,打印混乱。
针对这个问题,采取的方案是把布置的雷的信息和排查的雷的信息分开存放,分别放入两个不同数组棋盘中,把雷布置到mine,排查出的雷放到show。此时就不存在干扰,也可以单独打印show数组来参考。
为了保持隐秘性,show数组开始初始化为字符'#',mine数组初始化为字符'P',布置雷改成'O'
为保证两个数组类型一致,建议使用同一函数处理。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
1 | |||||||||||
2 | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | ||
3 | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | ||
4 | 'P' | 'P' | 'O' | 'P' | 'P' | 'O' | 'P' | 'P' | 'P' | ||
5 | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'O' | 'P' | 'P' | ||
6 | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | ||
7 | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'O' | 'P' | 'P' | ||
8 | 'O' | 'P' | 'O' | 'P' | 'O' | 'P' | 'P' | 'P' | 'P' | ||
9 | 'P' | 'O' | 'P' | 'P' | 'O' | 'P' | 'O' | 'P' | 'P' | ||
10 | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | 'P' | ||
11 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
1 | |||||||||||
2 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
3 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
4 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
5 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
6 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
7 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
8 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
9 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
10 | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | '#' | ||
11 |
步骤三:文件结构分析
本次游戏设计3个文件:
test.c //文件中写游戏的测试逻辑
game.c //文件中写游戏中函数的实现
game.h //文件中定义需要的数据类型和函数声明
文多件书写的好处:
(1)逻辑清晰
(2)方便多人协同
(3)适当隐藏代码(保护源代码)
步骤四:搭建整体思路框架
此处思路大致分为三部分:
1、菜单框架分析,即在主函数内需要实现游戏的顺序
(1)游戏开始-->菜单menu(此处需要1个函数实现,打印文字或字符来实现该功能)
(2)出现菜单-->提示选择的选项-->输入对应数字来与选项互动(需要有scanf函数来实现)
(3)根据输入数字的不同,实现不同的游戏操作(此处可以使用switch函数实现)
选项1时,开始游戏,此时需要一个实现游戏的函数;
选项0时,退出游戏。
2、游戏框架分析,即实现各游戏功能的函数组成
(1)需要2个数组:一个放置布置的雷mine,一个放置查找出的雷show
(2)初始化棋盘:mine最开始全部为'0',即符号0,show最开始全部为'*',即符号*。为实现需要2个函数
(3)打印棋盘:需要一个打印show棋盘的函数,显示全部为'*',即打印的结果是我想给你看到的内容
(4)布置雷:此处需要一个布置雷的函数
(5)排查雷:此处需要一个排查雷的函数
3、游戏函数代码实现
至此,关于控制台扫雷游戏的整体分析与框架结构已全部梳理清晰,具体游戏代码实现详见下篇“<C语言>关于使用控制台实现扫雷游戏的代码实现”