1.使用的编译器和调试环境
visual studio 2022
2.所需要的文件
如图所示需要创建一个game.c的头文件,用来声明关于扫雷游戏的函数
需要创建一个game.c的源文件,用来实现扫雷游戏的函数
需要创建一个test.c的源文件,用来测试扫雷游戏
3.所涉及的相关知识
头文件;源文件;函数的声明,实现,调用;生成随机值的rand()函数,time()函数,srand()函数;二维数组;宏定义;do_while循环,for循环,while循环;switch语句;
4.游戏实现
1.搭建一个框架
一般来说创建游戏都是以循环方式搭建的,因此我们可以用一个do_while循环来实现,搭建框架一一般都是在test.c(主函数)中实现
首先我们定义一个input(输入)变量,来记录用户输入的数字,然后我们用do_while开始函数的主循环
然后我们创建并调用menu函数来实现用户和电脑的交互,引导用户作出选择
接着用scanf函数接收用户输入的值,不要忘记取地址符
然后用switch语句应对用户不同的选择做出不同的回应
最后在while中填入input,当input不为0时程序将一直进行下去,当input为0时将跳出循环,游戏结束,注意这里正好和menu中给的提示 [0.exit(退出)]相对应
接着完善switch语句中的内容,需求应是当用户输入1(play)时进行游戏,我们可以创建并调用game()函数来实现游戏功能,当用户输入0时退出游戏,当用户输入其他数时提示一下,让用户重新输入
2.初始化数据并利用函数分装功能
1.存储数据
1.由于扫雷是一个二维游戏,因此我们可以用二维数组来存储数据
我们分别创建了两个字符数组mine 和show 分别用来储存雷的信息和显示在屏幕上的信息,为了使扫雷更加灵活,我们可以在game.h中宏定义Row,Col,Rows,Cols.
Row代表显示出来扫雷的行数,Col代表显示出来扫雷的列数
Rows代表存储的扫雷的行数,Cols代表存储扫雷的列数(具体这么做是因为后面要判断周围雷的个数,防止数组越界的问题)
2.初始化数据
我们创建一个Initboard()函数来实现初始化的功能
首先在game.h中声明函数
参数分别是要初始化的数组,行,列,初始化的内容
接下来在game.c中实现函数
我们用两个循环初始化初始化数组的内容,使数组所有元素都改成flag(初始化的内容,可以是“!@#¥%&*等符号”)
接着在test.c中调用该函数
我们将雷的数组全部改成字符0(0代表没有雷,1代表有雷)
我们将显示的数组改成*,这样我们后面打印出来的时候给人一种雷隐藏在后面的感觉(当然这里的符号可以根据个人喜好)
3.设置雷阵
同上,我们在game.h中声明函数setmine(),在game.c中实现该函数,在test.c中调用该函数,这里主要讲述实现该函数
首先因为我们要设置雷,因此参数要把雷的数组传进去
接着我们要确定雷的数量,因此创建一个变量count来确定雷的数量,这里同上使用了宏定义,方便以后的修改
接着的逻辑就是先判断该位置是不是雷,如果不是雷,把它改成雷,雷的数量-1,直到把所有雷布置好。那么如何随机布置雷呢?
首先我们需要用srand函数初始化随机数生成器
接着用rand函数创造随机的x和y坐标
最后做出判断
有关函数的介绍可以点击下面的链接
C语言随机数的介绍(rand函数,srand函数,time函数)-CSDN博客
4.打印mine和show
我们将数据储存后,如何检验我们写的是否正确呢?我们可以分装一个Showboard()函数来实现功能
函数的参数设置成board(写给自己看的),意味着可以展示雷阵或展示出来的雷的个数(根据个人需求),接着将这个数组打印出来(注意i和j是从1开始的,到相应的行和列结束,不打印最外面一圈(因为最外面一圈只用来计算雷的个数)),如下图
5.排雷过程
我们用Finemine这个函数实现这个功能,逻辑如下
1.要求用户输入x,y坐标,如果碰到雷游戏结束,并显示雷阵,否则还需要排的雷-1,直到需要排的雷为0游戏胜利
2.在函数中调用Getminenum()函数实现返回用户选择坐标旁边雷的个数
计算完成并改变数据后显示展现出来雷的个数
3.注意每次用户输入的时候都要考虑越界问题并给予用户反馈
下面是参考代码
5.注意事项
time()函数需要引用头文件<time.h>
srand()函数需要引用头文件<stdlib.h>
可以在game.h引用所有需要的头文件和宏定义,这样test.c和game.c只需要引用game.h就行了
6.思考问题
在Getminenum中为什么不多设置一个参数char show[Row][Col],代码改成show[x][y]=代码改前return的值?