目录
‘一.排雷思路
(1)在地图上布置10个雷。
(2)排查雷:如果位置是雷,就炸死了,游戏结束.不是雷,就统计这个坐标周围的雷的个数,并显示。
(3)如果,把所有非雷找到游戏结束,获胜。
(4)排查雷,是排查周围8个坐标一圈有几个雷。
二.游戏分析
(1)假如我们设计1个9x9的游戏.那就是一个9x9的二维数组
(2)布置雷,存放1,没有雷布置0。
(3)存放雷的信息和不是雷的信息,涉及:二维数组。
三.采用多文件
(1)game.c函数调用 -- 游戏模块
(2)fufu.c函数定义 -- 游戏模块
(3)gamen.h声明
四.游戏菜单
我们要先写个大概的游戏框架,再来写排雷游戏
这3个必须在循环里面,要是你输入的不是1也不0,走default每次循环都会打印输出游戏菜单,喊你输入值
因为扫雷游戏代码量200+所以我们不可能全部代码写完了来判断,可以自己打印下结果看下有木有问题。
我们走case 1:肯定不是打印扫雷游戏这么简单,只是为了验证前面代码是否正确。创建个game函数,在函数内部实现这个游戏。
五.面临的问题
(1)当我们去排雷,如果不是雷0,是雷1,但是还要统计周围几个雷,要是统计周围的雷1个了?
到底是雷的1,还是周围坐标雷的1.冲突;要放雷的信息,非雷的信息,还要放排查雷的信息。
一个组数放3类数组,容易产生歧义。存放数据类型太多,容易产生歧义
(2)你在排查雷的时候,每个坐标都要统计周围8个坐标雷的个数的时候,可能会越界。怎么办 ?
六.解决问题
(1)越界问题:本来是9 * 9的棋盘;但我们创建数组的时候11 * 11的棋盘;行上下多了2行,列上下多2列
(2)存放数据类型太多,容易产生歧义:创建2个数组,一个存放雷的信息,另一个存放排查出雷的信息
(3)虽然我们创建的11*11棋盘,最后用户看见,体验的是9*9棋盘,所以这里初始化11*11的棋盘,打印输出是9*9棋盘
七.实现 -- 在gamen.c函数实现
1.排查出雷信息的数组:为了神秘性打印的时候全初始化为'*',周围几个雷显示几
2.char mine[11][11]; 雷--'1', 非雷-- '0'
3.char show[11][11];全部初始话'*'
这里虽然创建了数组大小,但是写死了,不方便后期修改代码。
我们可以去我们game.头文件,用define定义常量,我们要用的库函数也可以写在game.h文件对应我们的.c文件只需要包含咋们创建的头文件,自己创建的头文件要用双引号包含比如:#include"game.h"
大写;ROW , COL =9;大写ROWS,COLS=11。
注意:我们所有的内容都是放在9*9的棋盘上,只是为了排查周围几个防止越界。
八.创建和初始化
重点:这里利用了函数的复用,不用为了2个数组初始化,创建2个函数。只需要i把数组初始化的值传过来就行ret。
容易出错点:
(1)大家在game.h文件定义常量,在game.c文件写名字或者大写错误;
(2)对于刚没学过,或者没用多久多文件使用的,很容易头昏,写着写着不知该干嘛了
(3)要分清使用的是函数调用,函数定义,和声明。
(4)函数调用就是实参,传递自己创建变量名字,函数定义和声明是形参,接收传递过来的值和地址名字可以自己改变。
九.打印棋盘
(1)创建个函数实现打印功能
(2)头文件声明
(3)实现函数功能
要打印每行的行号。
可以运行一下程序,看下自己代码有木有错误,有错误进行调试修改。
核心:
(1)布置雷:边上一圈是不用放雷的,雷需要放在9x9棋盘
(2)排查雷
十.布置雷
(1)要用坐标随机布置雷;x = rand()%9+1=1--9 ,y = rand()%9+1=1--9.
补充:模9的余数是0 - 8,加个1就是1 - 9;模10的余数是0-9,加个1 1--10
(2)用rand函数生成坐标,要用srand(( unsigned int) time(NULL))
(3)要判断一下这个位置有木有雷,没有雷才布置.
十一.排查雷
1.数组mine排查雷,信息放到数组show里面。
2.涉及2个数组,涉及排查和存放信息的时候只涉及9*9格式
3.要输入的合法坐标排查,所以要判断是否合法
4.合法之后判断你输入的坐标有木有雷
5.有雷你被炸死,打印雷所在的位置,然后break出去
6.如果没踩中雷你要排查周围八个坐标,有几个雷
7.你知道周围有几个雷,假如你周围有4个雷,要把数字4转换字符4
8.字符转换数字:'0'-'0'=0,'1'-'0'=1,'4'-'0'=4,数字字符 - 字符0 等于本身数字
9.数字转换字符:4+'0'=4,数字 + 字符0等于本身数字字符
10.排查周围雷的信息放到show数组里面
总结:可以先慢慢练习,对于新手来说有点难,要结合调试多试试。