C语言实现经典游戏扫雷(简易版)

文章介绍了如何使用C语言实现一个简易的扫雷游戏。通过设置两个数组分别表示雷区和玩家可见的棋盘,利用随机数设置雷的位置,以及计算相邻雷的数量。玩家交互通过输入坐标进行,游戏结束条件是踩到雷或者清除所有非雷格子。
摘要由CSDN通过智能技术生成

主体思路

玩家界面

由于是简易版本,我们直接将菜单打印出来就行,代码如下

void menu()
{
	printf("***************************\n");
	printf("******  1. play     *******\n");
	printf("******  2. exit     *******\n");
	printf("***************************\n");
}

在后续进阶版中我们可以在主函数中加入一个分支语句来调节难度,实现原理就是修改棋盘大小和雷的数量。(分支语句详解请看我的另一篇文章:http://t.csdn.cn/eYtpZ

主要模块

设置雷区

在这一次编写中我们需要设置两组数组来分别表示给玩家呈现的和用来设置雷区的初始化数组的代码如下

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

 对于这一个函数我们需要向其中传递四个值分别是:一个数组,长,宽,和一个我们要填入的字符。具体填入格式如下

Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');

 这就让mine(玩家看不到我们用来布置雷的数组)和show(玩家看到的数组)分别初始化为0和*

设置雷的位置的代码如下

void Set(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--;
		}
	}
}

显示玩家看到的模板

在这一方面我们要注意一些细节,比如格子是9*9玩家会不太好数位置,所以我们要给它加上快速得到位置的参考物,最后实现代码如下

void Showboard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("---------扫雷--------\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("---------扫雷--------\n");
}

 最后的效果如上所示。

让玩家决定排查哪里

void Find(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;

	while (win < col * row - EASY_COUNT)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			system("cls");
			if (mine[x][y] = '1')
			{
				printf("很遗憾,你踩到了雷\n");
				Showboard(mine, ROW, COL);
				break;
			}
			else
			{
				int c = Minecount(mine, ROWS, COLS);
				show[x][y] = c + '0';
				Showboard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标不存在,请重新输入\n");
		}
	}
	if (win == col * row - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	}
}

 这一段代码包含了玩家可能遇到的所有情况,也定义了胜利条件。但它只能一次一格的慢慢玩,不能像我们常见的扫雷一样一点就显示一片,在后续我会进行优化。

显示周围有几颗雷

决定排查地点后,我们也要知道这个地点周围八个格子中有几个雷,实现代码如下

int Minecount(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] +
		mine[x - 1][y] +
		mine[x - 1][y + 1] +
		mine[x][y - 1] +
		mine[x][y + 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] - 8 * '0';
}

 这里用到了ASCII码值来判断周围的雷数,我们知道在ASCII值中0比1小1所以我们用周围8个格子加起来再减去8个0的ASCII码值就得到了周围雷的数量。

然后我们再用一个函数来储存这个数量,最后将它给那一个格子所对应的数组元素就行了

int c = Minecount(mine, ROWS, COLS);
show[x][y] = c + '0';

 这样再输出一遍棋盘就得到了带数字的格子

游戏结束

如果玩家踩到了雷那就将我们布雷的棋盘输出出来,让玩家知道布雷的位置。如果完全将雷排出那就直接结束便可以了。

感谢阅读,求一个赞。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木易杨MYY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值