一.大方向
主函数--test():目的是使主函数整洁干净,把游戏的设置全写在子函数里。
test函数--menu():菜单函数,给出0/1的选择--选0--break;选1--进入game函数。
game函数--根据产生棋盘的过程分为--1.分成开发者设置的棋盘和用户使用的棋盘;
2.初始化两个棋盘;
3.布置雷;
4.让用户输入坐标并判断是否有雷最后判断输赢;
5.计数周围8个坐标的个数;
二. game函数内部对棋盘的操作
1.初始化
1-1.棋盘的规模:
当我们玩扫雷游戏时总认为是9*9的方格,其实不然。用户输入一个坐标,游戏要统计周围8个坐标的雷个数,如果只有9*9,那第一行和第一列周围是少于8个坐标的。所以初始化棋盘时,应该设置成11*11,显示棋盘或者给用户操作时,再显示9*9。
1.2 如何表示有雷与否?
在开发者设置的棋盘(用mine表示):用0表示无,1表示有,简单直观。
在用户游戏的棋盘(用show表示):用*表示未曾输入的坐标,输入坐标后,用周围8个坐标的雷数代替输入坐标。
注意:这里初始化是一个函数但是有两个数组需要调用它,于是我们定义char sign来接受初始化的字符。
另外:我们可以用打印的方式来写显示函数(void xianshi()),用于随时检查自己写的函数代码是否达到自己想要的样子。但是要注意显示函数和其他函数调用的顺序问题。
2.布置棋盘
也就是安排雷到随机的坐标,此时需要调用srand函数来生成随机数,再通过随机数产生1~9的坐标。
安排几个雷呢?我们可以给游戏设置一个难度,如简单模式就布置10个雷(宏定义一个EAST_COUNT 10),每布置一个雷,总雷个数减少1。count--一定要放在if内部!!放在外面布置雷的个数就不对。
3.让用户输入坐标并判断是否有雷最后判断输赢
3.1 while的条件:
首先用户要输入坐标,输入几次呢?10个雷,最少1次(即输入第一次就被炸死),最多9*9-10次,也就是避开了所有的雷成功了。所以定义一个rest来计数输入坐标的次数,rest<71,加上while循环,一旦输入的坐标有雷就跳出循环,当rest==71时输出成功的信息。
3.2 while的内部构成:
输入坐标+打印用户show棋盘
判断坐标--¥1 是否有效:1~9
¥2 此坐标是否被输入过:show[x][y]=='*'
¥3 此坐标是否是有雷的:mine[x][y]==‘0’ 安全,安全了以后rest++,打印show棋盘提示用户继续输入坐标,而show棋盘需要展示周围雷的个数,所以在这里调用查看雷函数并将周围雷个数等于输入的坐标上,然后在用显示函数显示show棋盘。
以上,¥3嵌套再¥2内,¥2嵌套再¥1内,用if嵌套。
至此,扫雷函数完成,测试时可以将EASY_COUNT设置成80,这样输入一次就可以完成游戏并输入结果来测试。