用c语言实现简化版扫雷游戏

1.
先构建一个全由字符‘0‘’组成的9乘9方阵,便于存放地雷,名为"mine";同理,为了直观观察排雷情况,再创建一个全由字符星号组成的9乘9方阵,名为"show"。
在这里插入图片描述
2.
在“mine”中随机将10个‘0’变为‘1’,其中‘1’表示地雷,从而打印一张完整雷图。
红色框内是横竖坐标
(红色框内是横竖坐标)
接着输入“mine”中的一个字符所对应的下标,开始逐一排雷,如果该字符不是雷,则记录该字符周围8个格子的雷的总数,将图“show”中的与“mine”中下标对应的‘*’变为周围8个格子雷的总数。在这里插入图片描述
(此处输入(4,5)坐标,显示周围共有1个雷)
3.
接着就可以开始排雷了,多组输入,最多可以输入71次,输入71次后没踩到雷游戏胜利。
(为了快速通关,我设置了71个雷,即只要输入10次,毕竟输入71次真的太费时间了😭)

4.
雷阵的具体布置:由于要设置9*9的雷阵,在寻找坐标字符的周围雷数时,在边缘的坐标字符不能检查8个周围格子情况,如图所示:
在这里插入图片描述
(蓝色格子包围的格子周围不足8个字符,只有5个,无法正常查询周围雷总数)
所以,为了避免这种边缘字符无法正常检查周围雷数的情况,就要初始化一个11乘11的字符全为‘0’的“mine”雷图,再在(i,j)[2<=i<=10,2<=j<=10]中选10个位置布置雷,最边缘字符全初始为零,这样边缘字符就可以正常查周围雷数了,如图:
在这里插入图片描述
最后.
“talk is cheap,show me the code ”前面是思路陈述,下面就展示代码:

//游戏规则:在9*9的方形格子中布置10个雷,排除其他非雷格子后扫雷成功。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void chushihua(char board[11][11], char set);
void printboard(char board[11][11]);
void setmine(char board[11][11]);
void findmine(char mine[11][11],char show[11][11]);

void game()
{
	char mine[11][11];
	char show[11][11];
	chushihua(mine,'0');//初始化mine使其全为‘0’
	chushihua(show,'*');//初始化show使其全为‘*’
	printboard(show);//打印图show,更好观察排雷情况
	setmine(mine);//在图mine中布置地雷
	findmine(mine, show);
}
void menu()
{
	printf("****************\n");
	printf("*****1.play*****\n");
	printf("*****0.over*****\n");
	printf("****************\n");
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do {
	menu();//打印菜单。
	printf("请选择:>");//提示输入
	scanf_s("%d", &input);
	switch(input)
	{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误\n");
			break;
	}
	} while (input);//do...while函数实现多组输入
	
}
void chushihua(char board[11][11], char set)
{
	int i = 0;
	for (i = 0; i < 11; i++)
	{
		int j = 0;
		for (j = 0; j < 11; j++)
		{
			board[i][j] = set;
		}
		printf("\n");
	}
}
void printboard(char board[11][11])
{
	int i = 0;
	printf("**********扫雷游戏********\n");
	for (i = 0; i < 10; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i < 10; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j < 10; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("**********扫雷游戏********\n");
}
void setmine(char board[11][11])
{
	int count = 10;
	while (count)
	{
		int x = 0; int y = 0;
		x = rand() % 9 + 1;
		y = rand() % 9 + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}
static int countmine(char mine[11][11], 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');
}
void findmine(char mine[11][11], char show[11][11])
{
	int count =81;
	while (count>10)
	{
		int x = 0; int y = 0;
		printf("请输入:>");
		scanf_s("%d%d", &x, &y);
		if (x >= 1 && x <= 10 && y >= 1 && y <= 10)
		{
			if (mine[x][y] == '1')
			{
				printf("你被炸死了,游戏失败\n");
				break;
			}
			else
			{
				int r = countmine(mine, x, y);
				show[x][y] = '0' + r;
				printboard(show);
				count--;
			}
		}
		else
			printf("输入有误,重新输入:>\n");
	}
	if (count == 10)
	{
		printf("游戏胜利\n");
	}
}

最后,看完了希望大家能点个赞😊

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值