C语言-扫雷游戏的实现

		break;

	}
//case 1 和 default 都是非零
//里层switch语句走完 就会走while语句
} while (input);
return 0;
//如果while 后面为0,程序就会自动退出游戏
//非0   1就打印扫雷    其他值则重新打印菜单让用户选择

}


**运行效果:![](https://img-blog.csdnimg.cn/bf957ee5bc304196b10a29ccc260c03b.png)**


##### **棋盘打印\*️⃣:**


**头文件game.h 的代码:**



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#pragma once

#define ROW 9
#define COL 9

#define ROWS ROW + 2
#define COLS COL + 2

// 函数的声明

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);

//打印棋盘的
void DisplayBoard(char board[ROWS][COLS],int rows, int cols);


**源文件game.c 的代码:**



#define _CRT_SECURE_NO_WARNINGS

#include “game.h”

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}

//打印棋盘,就是打印数组
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 1; i <= row; i++)
{
int j = 0;
for (j = 1; j <= col; j++)
{
printf(“%c “, board[i][j]);
}
printf(”\n”);
}
}


**源文件 test.c 的代码:**



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include “game.h”

//扫雷页面都实现
void menu()
{
printf(“\n");
printf("
1. play \n");
printf("
0. exit \n");
printf("
**\n”);
}

void game()
{
//数组
char mine[ROWS][COLS];//“0”
char show[ROWS][COLS];//""
InitBoard(mine, ROWS, COLS,‘0’);
InitBoard(show, ROWS, COLS,'
');
//棋盘打印
DisplayBoard(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
//布置雷
//排查雷

}

int main()
{
int input = 0;
do
{
menu();
printf(“请选择:<”);
scanf_s(“%d”, &input);
switch (input)
{
case 1:
printf(“扫雷\n”);
game();//游戏代码模块化
break;
case 0:
printf(“退出游戏\n”);
break;
default:
printf(“选择错误,请重新选择\n”);
break;

	}
//case 1 和 default 都是非零
//里层switch语句走完 就会走while语句
} while (input);
return 0;
//如果while 后面为0,程序就会自动退出游戏
//非0   1就打印扫雷    其他值则重新打印菜单让用户选择

}


**打印结果:![](https://img-blog.csdnimg.cn/9978c65d715b4b5e829c8ffcdf56f32b.png)**


##### **给棋盘加坐标:🔢**


**在原来打印棋盘上加上坐标,进行定位,只需修改game.c部分的代码:**



#define _CRT_SECURE_NO_WARNINGS

#include “game.h”

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}

//打印棋盘,就是打印数组
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf(“-----------扫雷游戏-----------\n”);
//打印棋盘序号
for (i = 0; i <= row; i++)
{
printf(“%d “, i);
}
printf(”\n”);
//打印9*9的棋盘
for (i = 1; i <= row; i++)
{
printf(“%d “, i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf(”%c “, board[i][j]);
}
printf(”\n”);
}
printf(“-----------扫雷游戏-----------\n”);
}


**打印结果:**


**![](https://img-blog.csdnimg.cn/060c1aa567e940adbb31d20c080047b7.png)**


##### **布置雷💣:**


**game.h:**



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//标准库头文件
#include<time.h>

//布置雷
void SetMine(char mine[ROWS][COLS],int row , int col);
//虽然布置雷是在99的格子里面布置—>row 和 col
//但是,数组传参还是11
11的格子,即ROWS和COLS


**game.c:**



//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;

while (count)
{
	int x = rand() % row + 1;
	int y = rand() % col + 1;
	if (mine[x][y] == '0')//如果该位置无雷才在这个位置放雷
	{
		mine[x][y] = '1';
		count--;
	}
}

}


**test.c文件:**



//布置雷
SetMine(mine, ROW, COL);
DisplayBoard(mine, ROW, COL);

**打印结果:![](https://img-blog.csdnimg.cn/cddcc05502e84516a8cd90b1907f4adf.png)**


##### **排雷💥:**



> 
> **![](https://img-blog.csdnimg.cn/5040c9cee31240b9869d997859134d50.png)**
> 
> 
> **通过观察,ASCII表可知:**
> 
> 
> **字符'0'-->ASCII值:48**
> 
> 
> **字符'1'-->ASCII值:49**
> 
> 
> **字符'2'-->ASCII值:50**
> 
> 
> **字符'3'-->ASCII值:51**
> 
> 
> **依此类推**
> 
> 
> **得出规律:'1' - '0' = 49-48 = 1**
> 
> 
> **'3' - '0' = 51-48 = 3**
> 
> 
> **字符-字符=数字   ----------> 反推: 数字+字符=字符**
> 
> 
> 



> 
> **![](https://img-blog.csdnimg.cn/2e4b2692fafb4c4fa03898e034412269.png)**
> 
> 
> **统计 x y 周围有几个雷 --->**
> 
> 
> **把其周围的字符值'0'和'1'加起来即可** 
> 
> 
> **然后减去8个字符'0' 得到数字,去代替  x y 处的 '\*'.**
> 
> 
> 


**![](https://img-blog.csdnimg.cn/894ce29474dd49abb40732d8ed2dfd1e.png)**


**game.h:**



//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);


**game.c:**



//实现GetMineCount数组
static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return(mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * ‘0’);
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
while (1)//死循环排雷
{
printf(“请输入要排查的坐标:>”);
scanf(“%d %d”, &x, &y);
//注意:x y 要在有效的排查范围(9*9)之内
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//开始排查是否是雷
if (mine[x][y] == ‘1’)
{
printf(“很遗憾,你被炸死了\n”);
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + ‘0’;
DisplayBoard(show, ROW, COL);
//count + 字符’0;变成对应的数字字符放到show数组里
}

	}
	else
	{
		printf("坐标非法,重新输入\n");
	}
}

}


**test.c:**



//排查雷
FindMine(mine, show, ROW, COL);

**注意:GetMineCount 没有在其它文件中声明是因为,我们只希望它在game.c处悄悄使用它,所以前加static**


**运行结果:![](https://img-blog.csdnimg.cn/1049670cf1cb420786d6ecdecd2f7f0a.png)**


**上面的排雷,未限制排雷次数,即可无限循环下去,这样子的游戏设计显然不合理~**


**于是,我们可以根据,雷和非雷的数量关系进行排雷循环次数的限制.**


**game.h:**



//布置80个雷
#define EASY_COUNT 80


**game.c:**



//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<rowcol-EASY_COUNT)//根据雷和非雷的数量关系限制循环次数
{
printf(“请输入要排查的坐标:>”);
scanf(“%d %d”, &x, &y);
//注意:x y 要在有效的排查范围(9
9)之内
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//开始排查是否是雷
if (mine[x][y] == ‘1’)
{
printf(“很遗憾,你被炸死了\n”);
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + ‘0’;
DisplayBoard(show, ROW, COL);
//count + 字符’0;变成对应的数字字符放到show数组里
win++;
}

	}
	else
	{
		printf("坐标非法,重新输入\n");
	}
}
if (win == row * col - EASY_COUNT)
{
	printf("恭喜你,扫雷成功\n");
	DisplayBoard(mine, ROW, COL);
}

}


**我们可以通过改变雷的个数,然后根据mine的数组打印的结果对照着进行排雷成功的结果输出,检查是否有误.**


**运行结果:**


**![](https://img-blog.csdnimg.cn/9fed4c0797244958bf78141571e28f19.png)**


### **3.扫雷游戏的完整代码✨**


**game.h:**



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//标准库头文件
#include<time.h>
#pragma once

#define ROW 9
#define COL 9

#define ROWS ROW + 2
#define COLS COL + 2

//布置10个雷
#define EASY_COUNT 10

// 函数的声明

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);

//打印棋盘的
void DisplayBoard(char board[ROWS][COLS],int rows, int cols);




---


**game.c:**



#define _CRT_SECURE_NO_WARNINGS

#include “game.h”
#include <stdio.h>

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}

//打印棋盘,就是打印数组
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf(“-----------扫雷游戏-----------\n”);
//打印棋盘序号
for (i = 0; i <= row; i++)
{
printf(“%d “, i);
}
printf(”\n”);
//打印9*9的棋盘
for (i = 1; i <= row; i++)
{
printf(“%d “, i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf(”%c “, board[i][j]);
}
printf(”\n”);
}
printf(“-----------扫雷游戏-----------\n”);
}

//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;

while (count)
{
	int x = rand() % row + 1;
	int y = rand() % col + 1;
	if (mine[x][y] == '0')//如果该位置无雷才在这个位置放雷
	{
		mine[x][y] = '1';
		count--;
	}
}

}

//实现GetMineCount数组
static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return(mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * ‘0’);
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<rowcol-EASY_COUNT)//根据雷和非雷的数量关系限制循环次数
{
printf(“请输入要排查的坐标:>”);
scanf(“%d %d”, &x, &y);
//注意:x y 要在有效的排查范围(9
9)之内
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//开始排查是否是雷
if (mine[x][y] == ‘1’)
{
printf(“很遗憾,你被炸死了\n”);
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + ‘0’;
DisplayBoard(show, ROW, COL);
//count + 字符’0;变成对应的数字字符放到show数组里
win++;
}

	}
	else
	{
		printf("坐标非法,重新输入\n");
	}
}
if (win == row * col - EASY_COUNT)
{
	printf("恭喜你,扫雷成功\n");
	DisplayBoard(mine, ROW, COL);
}

}




---


**test.c:**



#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include “game.h”

//扫雷页面都实现
void menu()
{
printf(“\n");
printf("
1. play \n");
printf("
0. exit \n");
printf("
**\n”);
}

void game()
{
//数组
char mine[ROWS][COLS];//“0”
char show[ROWS][COLS];//""
InitBoard(mine, ROWS, COLS,‘0’);
InitBoard(show, ROWS, COLS,'
');
//棋盘打印
//DisplayBoard(mine, ROW, COL); 雷的位置注释掉不打印出来,保持神秘感
DisplayBoard(show, ROW, COL);
//布置雷
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
//排查雷
FindMine(mine, show, ROW, COL);

}

int main()
{
int input = 0;
srand((unsigned int)time(NULL));//强制转换成无符号整型
do
{
menu();
printf(“请选择:<”);
scanf_s(“%d”, &input);
switch (input)
{
case 1:
printf(“扫雷\n”);
game();//游戏代码模块化
break;
case 0:
printf(“退出游戏\n”);
break;
default:
printf(“选择错误,请重新选择\n”);
break;

	}
//case 1 和 default 都是非零
//里层switch语句走完 就会走while语句
} while (input);
return 0;
//如果while 后面为0,程序就会自动退出游戏
//非0   1就打印扫雷    其他值则重新打印菜单让用户选择

}


 ![](https://img-blog.csdnimg.cn/c801fd988460436d952371f01d76ecd2.jpeg)


**🌻今天的扫雷游戏就分享到这里啦~🌻**


**🌻喜欢就一键三连支持一下吧♥~🌻**


**🌻附上今天的日落图☺️🌻**


**🌻谢谢家人们!🌻**







**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/60109f04e8e26155431e9f39af5c5184.png)
![img](https://img-blog.csdnimg.cn/img_convert/c8c2ac5582d3e4446cd1f6fb555c65bb.png)
![img](https://img-blog.csdnimg.cn/img_convert/273f0f07f438418247137229d3df3d88.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)**
![img](https://img-blog.csdnimg.cn/img_convert/168f6fee6b48fb77241b528ef114eff7.png)

**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**








**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中...(img-NFjchigw-1712828819091)]
[外链图片转存中...(img-SOmCk9zx-1712828819091)]
[外链图片转存中...(img-lBWXIB9b-1712828819092)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)**
[外链图片转存中...(img-j3i917F4-1712828819092)]

**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值