手把手教你-C语言实现扫雷游戏(初级)

 一、概况

要实现扫雷游戏,首先需要打印一个界面:

0b0d5405f85d4133afbb76566588b1fb.png

因为需要输入坐标进行排雷,最好在行和列打印一下相关数字,像这样:

65bdef6a14c748d286640124cc4cc90c.png

然后需要埋地雷,再实现探查。

二、问题预测和解决方案

1.在书写过程中,我们可能会遇到:

(1).统计一个坐标周围雷的个数时(因为打印列表要用二维数组),可能会出现数组的越界问题

(2).存放的数据有重叠性,容易乱(数组打印隐蔽用字符和是否是雷,两组数据叠加起来)

(3)头文件繁杂,函数众多,书写占地很大

2.针对这三个问题,我们采取对应的解决方案

解决(1).打印的时候,使用比目标行和列多两行的数组,例如

目标:ROW行,COL列

数组: 

ROWS=ROW+2;

COLS=COL+2;

show[ROWS][COLS]

解决(2).两组数据分别存到一个数组,例如:

隐蔽用数组:show[ROWS][COLS]

埋雷数组:mine[ROWS][COLS]

解决(3).建立两个源文件

game.c存储过程中复杂的函数

test.c实现主函数

建立一个头文件

game.h实现头文件的整合

三、代码实现

1.首先创建main函数,函数中实现:

①打印菜单(在此笔者选用函数来实现打印菜单,当然也可以直接打印,不过主函数会不够简洁)

②读入用户输入数据决定是否运行

a527e524cca448528324a74943d51c86.png

09d19d1eeb404a31be25d00e39b5179a.png

2.进行二维数组的定义:

 

①给出两个数组的定义:

34dec215215c4f048f0d67b08ee6c083.png

在此,我们在game.h头文件中用#define将行和列设置为ROWS和COLS,方便之后修改行数和列数

2fc2b27ef7f54f8f99c81012e09440ba.png

3.进行隐藏数组和埋雷数组的初始化:

因为要隐藏地雷需要用字符来作为数组的元素,

因此,为了数据转换方便(隐藏字符转雷),

我们采用字符'0'来进行初始化,字符'1'来表示雷。

首先要在game.h中声明要写的函数

5c536e8bb454480a9c2c5b7722eb85c2.png

(小提示:此处声明不可以传参int COLS亦或是int ROWS,因为我们是在头文件game.h中定义的ROWS和COLS,下文传参row和col也是同理)

函数存储初始化过程

94bab1c826f644429e32e345598fd3d1.png

(小技巧:可使用多传一个字符char set的方式来用一个函数同时初始化两个数组)

在主函数game()中,加上

3cbb96b39cd1484e9eb9ef5c9d1bce4c.png

4.打印棋盘

       初始化完毕以后,数组便可以进行打印了,但因为我们所定义的数组实际上比需要打印的多出来两行两列,所以可以在打印时for循环从1开始,到需要的行/列数ROW/COL结束。

       我们在打印完后还需要添加数字,方便玩家确认坐标位置更加方便一些,因此,下文笔者将一气呵成给出打印符号+行号列号的代码

主函数传参

28fd8ed41fb745939f07b8b33f90fa7e.png

game.h声明

9a16f1e13b954c90991878fb58e0df9f.png

函数实现

4d0cf66b2a2849b480506792cf47be44.png

5.布置雷

布置雷的时候,我们可以利用随机生成数来为mine[ROWS][COLS]数组实现元素的替换,

{

注:①随机生成数我们使用rand()函数,同时用srand()来为其修改作为“种子”的基准值,来确保rand()函数生成的随机数不会呈现一定规律

②电脑中的time()函数所表示的时间戳是一个不具备重复性的数字,我们可以利用其来获得为srand传递的数字

头文件新加

3a935e21b50b4c0e87edabd481db9a24.png

主函数新加

7eff8d21d87d43eeb69267c5d831e752.png

③准备完毕,我们可以开始进行生成地雷了,提前在头文件定义好

dbfdb4a3d467403bb91604f8dd17fa37.png

方便以后修改雷的个数。

}

主函数传参

2b4acc3133374fd783c307231e0f7852.png

game.h声明

df8cc6e9660c451a979417417b8e6be2.png

函数实现(利用变量s值的变化来实现控制雷的个数)

注:任意数除以row(传来的其实是ROW)再加一都会保证生成的数在1~row之间,col同理。

4a8b1482548744ca9529d62557ef5ca5.png

6..排查雷

{

①排查的过程,需要保证玩家输入的坐标正确,可以使用if语句来进行限制

②初级扫雷程序:一次扫一个格,所以扫过ROW*COL-MineNumber就是胜利

③每次扫雷都要统计格子周围雷的个数,可以使用一个函数来实现

}

主函数传参

9b86cf91d5bd4b91acba3df10d16dc62.png

game.h声明

fae3e8bcc92049beaf592986e12e7091.png

排查雷函数实现

81dfe269fd204a69af876c8ee1896748.png

9b52feda1a3045ceb623df79f576bba8.png

统计雷个数函数实现

ac0c5a413ae8406089b34be202aba9ef.png

至此,函数便可以运行了。

四、源码(供copy)

请查看gitee

九州空城 (kyushu-empty-city) - Gitee.com

仓库c_code_yv

test_10_29(扫雷)

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值