扫雷小游戏

        今天我又给大家介绍款小游戏——扫雷。扫雷作为一款非常经典的电脑小游戏,深受大家喜爱,想必大家都玩过这款游戏。今天我们将用C语言实现扫雷游戏。


我们先通过游戏来分析一下要做什么。

 通过三张图片我们可以看出,首先我们需要一9*9的表格,需要在表格中放入数字和雷,当玩家点击表格时,如果没有雷,我们在点击的格子中显示格子周围的其余八个格子中有无雷,如果有显示对应雷的个数,如果没有则显示0。如果有雷,我们将终止游戏并将所以雷的位置全部显示。

分析完之后,我们将写我们的代码。(此次代码将进行分装进行,game.c main.c game.h)


创建完善主函数

我们在主函数中,可以使用do while循环让游戏重复进行,创建一个菜单函数与玩家进行交互。给予一个switch函数嵌套在do while函数中让玩家在选择不同的情况下进入不同的地方。选择1则进入游戏,选择0则退出游戏,剩下的数为非法输入,将继续进行循环直到输入正确为止。

void meau(void)
{
	printf("*********************\n");
	printf("*****1.扫雷**********\n");
	printf("*****2.退出**********\n");
	printf("*********************\n");
}

int main(void)
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		meau();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("非法输入\n");
			break;
		}
	} while (input != 0);
	return 0;
}

 当玩家选择1时,我们将进入到game()函数中去。


创建游戏函数和完善

当进入游戏函数时,我们应该首先得将扫雷的表格创建完成。表格相当于一个二维数组,那我们应该创建一个多大的二维数组呢?我们在游戏分析中说到,当玩家点开一个表格并且不是雷时我们应该显示周围雷的个数,但当我们在点开边缘的格子时,我们计算雷的体系会被9*9的格子打破,因为边界格子并没有8个,我们得进行分类讨论,不然就会数组越界产生bug。但是分类讨论太过于繁琐,我们不妨创建一个大小为11*11的二维数组,将表格放在下标为1——9的二维数组中去。

雷到底应该用什么来表示呢?用0和1还是#和*呢,当用数字0和1时我们可以很好的将周围的雷进行统计,但是使用0和1时我们应该怎么区分“1"到底是雷还是统计的数字,所以不好用。若用#和*时有很好的观赏性,但是不好统计雷的个数。如果我们将两个表格进行结合,我们就可以让0和1这个表格,然后将雷的个数传给为#和*这个表格。为了更好的传值,我们可以创建两个二维字符数组,第一个数组存放字符1和0,第二个数组存放#和*。

第一个表格值给程序员检查时候用,只给玩家提供表格2。

#define ROW 9 
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY 10

char mine[ROWS][COLS]; //存放雷的表格

char show[ROWS][COLS];//给玩家展示的表格

 接下来就可以创建Dearray函数来初始化两个二维数组,使用for循环将两个数组分别初始化为0和#号,在for循环中加入每行每列的坐标可以给玩家更好的使用有观赏性。

void Dearray(char arr[ROWS][COLS], int rows, int cols, char gets)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arr[i][j] = gets;
		}
	}
}
void Showme1(char mine[ROWS][COLS], int row, int col)
{
	for (int i = 0; i <= row; i++)
		printf("%d ", i);
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", mine[i][j]);
		}
		printf("\n");
	}
	
}

 接下来就应该埋雷了,给第一个二维数组10个随机数将里面的零变成1,这就需要rand(),srand()函数了,引用头文件#include<stdlib.h>和#include<time.h>,在主函数中添加srand((unsigned int) time(NULL));即可在函数中使用。

定义两个变量x,y。因为我们需要在数组的1——9中添加雷,所以让随机数模9加1即可。添加在while循环中,跳出条件为成功添加10个随机数即可。但是有时随机数会重复,这时我们使用if进行判断,如果格子中的为’0‘即可变为为’1‘,并且成功添加一个雷,至少循环十次。

void Choosemine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0; 
	int count = 10;
	while (1)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (mine[x][y] == '0')
			mine[x][y] = '1';
		count--;
		if (count < 0)
		{
			break;
		}
	}
}

接下来我们就应该进行人机交互了,创建Choose函数,玩家可以选择相应的坐标排雷了。将玩家选择放入循环中,进行循环,但是玩家的选择应需要有合法性,如果小于1大于9就算非法输入,也不能输入相同的坐标。当输入合法时我们就要继续进行判断,玩家的选择是否为雷,如果是雷就要终止游戏,并且展示棋盘中所以雷的位置(第一个数组的打印),如果没有选择有雷的格子,我们就要将这个格子周围雷的数量传到第二个棋盘中去,然后给玩家展示第二个棋盘。

如何计算出格子周围有多少雷呢,我们创建一个Swapmine函数,然后在Choose函数中调用这个函数,使用这个函数将格子周围的雷数量计算出然后返回给 Choose函数即可。将玩家选择的两个坐标x、y和第一个二维数组传给Swapmine函数,因为数组为字符数组,’0‘代表48’,1‘代表49。雷的位置为mine[x][y],四周的位置分别就可以表示出来并相加在减去8个’0‘就可以算出雷的个数,即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'。将得到的雷的个数返回到Choose函数,创建一个变量接收,然后传到第二个数组中去(函数接收的是int变量,如果想变成字符,给int变量加’0‘即可),展示给玩家就ok了。依次循环就可以完成扫雷。

但是游戏都有结束的时候,第一种情况就是被雷炸死我们已经考虑过了,还有一种可能就是扫雷成功。那我们要怎么实现呢?

我们设计的扫雷有81个格子,其中10个是雷,那玩家只需要成功点击71个格子就可以完成扫雷。所以循环的限制条件就可以使用ROW*COL-EASY,使用define可以方便修改,调整难度。在交换的else体中放入变量++即可,等到71就可以跳出循环然后恭喜玩家扫雷成功,并且展示一下棋盘二。

int Swapmine(char mine[ROWS][COLS], int x, int y)
{
	int count = (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');
	return count;
}

void Choose(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0; 
	while (a < row * col - EASY)
	{
		printf("请输入对应坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y>=1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("你被炸死啦\n");
				Showme1(mine, ROW, COL);
				break;
			}
			else if (show[x][y] != '*')
			{
				printf("这个坐标已被选择,请重新输入");

			}
			else
			{
				int count = Swapmine(mine, x, y);
				show[x][y] = count + '0';
				//Showme1(mine, ROW, COL);
				Showme2(show, ROW, COL);
				a++;
			}
		}
		else
		{
			printf("非法输入\n");
		}
	}
	if (a == row * col - EASY)
	{
		printf("扫雷成功\n");
		Showme1(mine, ROW, COL);
	}
}

game函数的主体: 

void game(void)
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	Dearray(mine, ROWS, COLS, '0');
	Dearray(show, ROWS, COLS, '*');
//	Showme1(mine, ROW, COL);
	Showme2(show, ROW, COL);
	Choosemine(mine, ROW, COL);
//	Showme1(mine, ROW, COL);
//	Showme2(show, ROW, COL);
	Choose(mine, show, ROW, COL);
		
}

程序的头文件:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY 10

void Dearray(char arr[ROWS][COLS], int rows, int cols, char gets);
void Showme1(char mine[ROWS][COLS], int row, int col);
void Showme2(char show[ROWS][COLS], int row, int col);
void Choosemine(char mine[ROWS][COLS], int row, int col);
void Choose(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
int Swapmine(char mine[ROWS][COLS], int x, int y);


 

下面让我们来玩一下:

很不幸,选择第一个就被炸死啦。

这个游戏非常的好玩,小伙伴们快来体验一下吧!!! 

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1扫雷小游戏1

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

W…Y

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

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

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

打赏作者

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

抵扣说明:

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

余额充值