扫雷小游戏制作全过程

在练习了几十个小短句,和其他小项目之后,我开始了第一个比较大的,也比较经典的小游戏——扫雷

首先需要分析,制作这个小项目所需要的大致流程

  1. 开始游戏
  2. 初始化棋盘
  3. 给地图中增加雷
  4. 用户交互,输入坐标,判断坐标是否有雷
  5. 胜利/失败

一,开始游戏

我们可以通过switch选择语句来让玩家开始游戏,并通过printf函数来让可视化界面尽量美观

int n;
	printf("如果你要开始游戏,请输入1
");
	scanf("%d", &n);
	
	switch (n)
	{
	case 1:game(); break;
	default:printf("Thanks your play");
		break;
	}

二,初始化棋盘

我们准备写一个可改变棋盘大小的游戏,因此我们可以将数组的变量在头文件中定义,长和宽都定义为9,但这个时候就有问题了,我们很难确定边界的坐标周围有多少个‘雷’,因此我们实际的棋盘大小要更大一些,但呈现在玩家面前的只有中间那一块的棋盘。

#define len 9
#define tall 9
#define lens len+2
#define talls tall+2

首先,我们需要两个数组分别作为玩家可视化的界面和棋盘资料,并将一个全部置0,另一个则全部置*作为用户可视化的界面,并将其打印出来

char game1[lens][talls];
char game2[lens][lens];
void Init_news(char a[lens][talls],char n)//初始化全场为一个数符
{
	for (int i = 0; i < lens; i++)
	{
		for (int j = 0; j < talls; j++)
		{
			a[i][j] = n;
			//printf("%d", a[i][j]);
		}
		//printf("
");
	}
}
void Print_Init(char a[lens][talls])//打印棋盘
{
	for (int i = 0; i < 10;i++)
	{
		printf("%d ", i);
	}
	printf("
");
	for (int i = 1; i <= len; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= tall; j++)
		{
			printf("%c ", a[i][j]);
		}
		printf("
");
	}
}

三,给地图中增加地雷

我们需要随机给地图中增加地雷数量,可以将地雷数量设置为n,n可以改变

void Product_Mine(char a[lens][talls],int Num)//为地图里初始化地雷
{
	int m =0, n =0;
	while (Num--) 
	{	
		n = rand() % len + 1;
		m = rand() % tall + 1;
		a[n][m] = 1;//1的意思为有雷	
	}

}

四,用户交互,输入坐标

由于我们已经将棋盘全部置0,地雷置1,因此只需要将其周围的1加起来,数字大小即为周围地雷数量

int Sum_Mine(char a[lens][talls], int n, int m)
{
	if (a[n][m] == 1)
	{
		printf("GAME OVER!即将为您开始下一局游戏
");
		main();
	}
	int sum = 0;
	for (int i = -1; i < 2; i++)
	{
		for (int j = -1; j < 2; j++)
		{
			sum = sum + a[n + i][m + j] - 0;

		}
	}
	return sum;
}

五,胜利/失败

怎么确定胜利或者失败呢?当棋盘总格子-地雷数量=排雷次数。此时地图上全都是地雷,此时胜利。

如果输入的坐标和地雷坐标一致时,此时失败。

当然,如果一次猜完之后,接下来又要猜的话需要循环,则应该将本函数置于死循环之中。

void Guess_Number(char a[lens][talls], char b[lens][talls],int t)
{
	int n,m,i;
	printf("请输入你所要排查的坐标:");
	scanf("%d %d", &n, &m);
	printf("
");
	i = Sum_Mine(a, n, m);
	Change_Map(b, i,n,m);
	t++;
	Print_Init(b);
	if (t == 71)
	{
		printf("You win!!
 即将为您开始下一局游戏
");
		main();
	}
}

以上就是我这次小小的实践的收获和结果

ps题外话,后续优化的一些思路

当我这个程序运行时,一次只会判断一个坐标,设想一下,如果点一个坐标,便能让他周围的空格子都呈现出来其数字,玩起来应该会更轻松一点吧

经验分享 程序员 微信小程序 职场和发展