C语言扫雷的实现

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的值?

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值