C语言初阶实践:扫雷游戏

前言

通过对C语言数组和函数的学习,我们可以初步实现扫雷游戏;

并可以利用多个文件协作,实现对代码的分开存放,加深对函数的理解。

文章目录

一. 游戏的分析和设计

1.使用控制台实现经典的扫雷游戏(9*9棋盘,10个雷)

2.可以通过菜单选择继续玩或者退出游戏

3.可以排查雷,排到雷被炸死,不是雷则显示周围有几个雷,找出雷之外71个方块排雷成功。

二.扫雷游戏代码的实现

1.test.c----游戏整体框架

//do while函数(图2)

   menu:设计函数menu用于打印菜单,不设返回值(viod)

   scanf:玩家输入选择,将玩家的选择(输入值:0/1)定义为变量imput

   do:打印菜单(menu函数),并完成玩家对游戏的选择scanf:1.play / 0.exit...

**do中的switch循环** (图二思路)

I.玩家选0,打印退出游戏,break跳到//***处,while中imput=0>>假>>程序退出。

II.玩家选1,先在do中玩游戏,break跳到//***处,while中imput=1>>真>>玩完可以再玩游戏

III.玩家选择其他数字,先打印"重选",while中imput非0>>真>>再回去重新选择

   game函数:用于实现游戏,其大体步骤为“初始化数组,打印棋盘,布置雷,排查雷”。

   srand在主函数中,在game中随机生成雷时起作用。

 **优化:将test.c和game.c的公共头文件放在game.h中,这样只需包含一个"game.h"即可

代码如下 :

                                                                     图一

                                                                    图二

2.game.h----游戏函数的声明

//对函数的声明

>函数InitBoard用于初始化棋盘

>函数DisplayBoard用于打印棋盘

>函数SetMine用于设置棋盘

>函数FindMine用于排查雷

//对行&列的定义

为了便于对游戏棋盘大小的更改,我们对棋盘的行和列进行定义(define)

为了便于改变雷的数量,我们对雷的数量进行定义>>定义为EASY_COUNT

**为了解决在排查雷时碰到边界无法排查的问题,我们要创建11*11的数组,以便于统一排查。

**如上文所述,我们把代码所需包含的头文件都放在game.h中,这样另外两个源文件只需包含game.h即可,使代码更加简洁。

代码如下 :

                                                                     图三

3.game.c----游戏函数的实现

//函数InitBoard—初始化棋盘

棋盘的设计思路:

**对于布置雷和排查雷,我们设计两个数组,其中mine数组用于布置雷的信息,show数组用于给玩家展示排查雷

**为了可以更方便显示排查后周围雷的信息,我们使用11*11的数组,将信息布置在中间9*9的方格内。

**对于雷和非雷 / 排查雷 的设计如下图(棋盘中的信息用字符表示)

                          雷----'1'                               图四                               没有排查----‘*’

                          非雷----‘0’                                                       排查后----‘数字字符’

**代码的设计:

看一眼下面的代码,可以轻易了解我们创建了一个ROW*COL的数组,并对其进行初始化,为了使用同一个函数给两个数组进行初始化不同元素我们将想要初始化的字符参数放在test.c中使用函数InitBoard处(见图一),并将字符传参给函数InitBoard通过字符变量set将我们在game.c(见图一)中‘0’ ‘*’两个字符通过这一个函数初始化进两个数组中,并通过for循环将字符初始化入数组的每行每列。

                                                                     图五

//函数DisplayBoard—打印棋盘

**代码的设计:打印时不仅要打印出雷,还要打印出行号和列号,以便玩家排查。

代码如下:

                                                                 图六

打印效果:

                     

                                                               图七

//函数SetMine—布置雷

**代码的设计:函数SetMine布置11*11的表格,只操作9*9的部分。

                        将mine数组其中的10个‘0’替换为‘1’,每替换一个count--,10个雷布置完结束。

代码如下 :

                                                                      图八

//函数FindMine—排查雷

**定义变量x,y。作为排查的坐标(x,y)。

**定义变量win,当win<row*col-EASY_COUNT(9*9-10=71)时可以一直while循环排查雷。

**第一个if:玩家输入想要排查的坐标后,第一个大的if语句判定坐标是否合法,if(坐标在棋盘内)进行排雷,else“重新输入”。

**第二个(内部)if:if玩家输入的坐标处对应mine数组中的‘1’(雷),则显示“被炸死”并打印10个雷的mine数组面板。else则显示玩家排查处周边有多少雷(见后文GetMineCount函数),每排查一个没被炸死,win++,直至win不再小于71 ,break到注释//***处。

**第三个(注释处)if: if(win=71) 打印“排雷成功”并显示完整mine数组.

代码如下 :

                                                                      图九

//函数GetMineCount—显示周围雷的数量

**根据ASCII码表,我们可以发现字符'0'对应48......因而得出如下规律:

图十

**可应用这一规律,在count(坐标周围雷的个数)+ ‘0’  可得字符 'count'。如1+‘0’=‘1’。

**如图十一可表示周围一圈字符的坐标,因为雷用1表示,故一圈相加之和就是周围雷的个数count,但字符无法相加,我们利用’1‘-’0‘=1,将字符变成数字,后相加得到数字count

**数字count需变成字符’count‘显示在数组中,用上面划线的方法即可实现转换,并在FindMine函数(图九)中94行代码实现数组中的替换和显示。

**GetMineCount函数返回值是雷的个数,用int做返回值。

图十一

代码如下 :

**注意:要把GetFindMine函数放在FindMine函数之前,因为FindMine中要用到GetFindMine函数

三.游戏的运行和扩展

如图,以下是玩家进行游戏的界面:

Tip:如果想要实现扫雷中展开一片的效果,需要用到函数递归的知识,可以自行尝试。

​​​​​


总结

以上就是对扫雷游戏的简单的代码实现,仅仅可以在调试面板上进行初级的扫雷,但通过代码中对函数和数组的操作,我们可以更好的理解和温习所学的C语言知识,加深对代码逻辑的熟悉程度。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的C语言扫雷游戏的实现步骤: 1. 定义游戏所需要的变量,如雷区大小、雷数、游戏状态、扫雷数组等。 ```c int row, col; // 雷区的行数和列数 int total_mines; // 雷区中的雷数 int game_state; // 游戏状态,0表示游戏正在进行,1表示游戏胜利,2表示游戏失败 int mine_field[MAX_ROW][MAX_COL]; // 扫雷数组,0表示没有雷,1表示有雷 ``` 2. 初始化雷区,将扫雷数组中的所有元素置为0,然后随机生成指定数量的雷,并将它们的位置标记在扫雷数组中。 ```c void init_mine_field() { int i, j, count = 0; // 将扫雷数组中的所有元素置为0 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { mine_field[i][j] = 0; } } // 随机生成指定数量的雷,并将它们的位置标记在扫雷数组中 while (count < total_mines) { int x = rand() % row; int y = rand() % col; if (mine_field[x][y] == 0) { mine_field[x][y] = 1; count++; } } } ``` 3. 实现用于显示雷区的函数,根据扫雷数组中的元素值,在控制台上输出相应的字符,如“#”表示未翻开的格子,“*”表示有雷的格子,“0”~“8”表示周围的雷数。 ```c void display_mine_field() { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (mine_field[i][j] == 0) { printf("# "); } else if (mine_field[i][j] == 1) { printf("* "); } else { printf("%d ", mine_field[i][j] - 2); } } printf("\n"); } } ``` 4. 实现用于翻开指定位置格子的函数,如果该位置有雷,则游戏失败;否则,统计周围的雷数并在扫雷数组中标记该位置的状态。 ```c void open_cell(int x, int y) { if (mine_field[x][y] == 1) { game_state = 2; // 游戏失败 printf("Game over!\n"); } else { int i, j, count = 0; // 统计周围的雷数 for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (i >= 0 && i < row && j >= 0 && j < col && mine_field[i][j] == 1) { count++; } } } // 标记该位置的状态 mine_field[x][y] = count + 2; if (count == 0) { // 如果周围没有雷,则递归翻开周围的格子 for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (i >= 0 && i < row && j >= 0 && j < col && mine_field[i][j] == 0) { open_cell(i, j); } } } } } } ``` 5. 主函数中首先初始化游戏变量,然后循环进行游戏,直到游戏结束为止。在每一轮循环中,先显示当前雷区的状态,然后读取玩家输入并翻开相应的格子。 ```c int main() { srand(time(NULL)); // 初始化随机种子 printf("Please enter row, col and total mines: "); scanf("%d %d %d", &row, &col, &total_mines); init_mine_field(); // 初始化雷区 game_state = 0; // 游戏正在进行 while (game_state == 0) { display_mine_field(); // 显示当前雷区的状态 int x, y; printf("Please enter cell position: "); scanf("%d %d", &x, &y); open_cell(x, y); // 翻开指定位置的格子 } return 0; } ``` 以上是一个简单的C语言扫雷游戏的实现示例,您可以根据自己的需求和喜好进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值