首先,我们将代码分成三个模块:测试游戏模块test.c(主要用来写mian函数 和game函数大体框架)、实现游戏模块game.c(主要用来写函数具体内容)、函数声明模块game.h(头文件)
第一步
详解:1、打出main函数--引出test()函数
2、写出test函数的具体内容:游戏不可能只玩一次,用do while循环,循环的第一件事就是菜单函数
3、将菜单函数具体写出
第二步
详解:
1、既然菜单中出现需要进行选择的,为了告知玩家,自然而然需要打印出“请选择”
2、玩家选择时,需用到scanf函数,则需要设置变量(变量input要设置到do while循环外面,否则while后面的input显示错误)
3、选择后出现的多种情况,用switch语句
question:为什么while后用input,因为若输入1,1为真,break后则重新开始循环,若输入0,0为假,break后则循环结束,若输入其他数字,则都是非零为真,循环可重新开始
第三步:
首先我们要理清游戏的逻辑,我们需要一个棋盘,并且把雷的坐标布置好,然后开始扫雷,统计周围的雷数(tip:玩家的1,1坐标代表计算机的0,0;布置雷和扫雷要分两个数组)
1、具体写出game函数的内容,设置两个二维数组,用来布置雷和排查雷,并将两个数组简单初始化为{0},接着初始化mine和show数组,加入参数‘*‘和’0’,在其他文件中显示为set(为什么要这样?因为在game.c文件中board[i][j]=不知道该等于‘*’还是‘0’,所以在初始化函数的时候直接再加一个参数,即可解决问题),然后对其展示。
2、在头文件中声明行和列(为什么要定义ROWS、COLS?因为扫雷是以任意一位置为中心,周围八个来排查的,正是如此,所以边缘的位置实际上无法有周围的八个,因此我们假设给其外周再添上一圈,那么行列就自然都要加2)、在头文件中声明函数(注意要写类型void)( 形参一定要写[][],后面的要小写)(为什么DisplayBoard的[][]中是ROWS和COLS,而不是[ROW][COL]?展示的不应该是九行吗?因为传过来的函数mine就是ROWS和COLS,不可以变)
3、在game.c完善函数具体内容
先设置两个变量,然后两个嵌套的for循环(先行后列)
tip:DisplayBoard函数需要打印并且注意换行
再继续完善,用for循环打印列号(注意从0开始,否则会歪)
4、开始布置雷
首先要确定雷的个数,设置变量EASY_COUNT,然后随机生成雷的坐标(rand()%row是什么意思?首先row=9,一个数模上9等于0~8之间的数,+1后是1~9之间的数,符合x坐标的范围。)(为什么把time设置在test()函数中?因为game()函数在test()函数中,而SetMine在game函数中)
(count--是什么意思?count由原来的10多次循环-1,变为0后,所有雷扫出)
数组小tip:1、传参的时候只能传数组名,不加【】,只有形参才会有arr【】
2、一维数组【】可以为空,但二维数组行可省列不可省
5、开始扫雷啦
设置函数FineMind,用户需自己输入雷的坐标,所以有scanf函数且设置变量x,y,既然要输入,就存在输的对与不对,所以有选择语句,显示炸死后,要显示雷的坐标,若没有炸死,需要计算周围雷的个数,于是有了get_mine_count()函数
具体优化函数
首先要知道‘3’-‘0’=3,因为‘’加数组表示ASCII码表中的值,相减为数字,利用周围八个坐标代表的‘1’、‘0’和‘0’的差值可以计算出雷的数目
最后的完善