Advertisement

扫雷小游戏制作全过程

阅读量:

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

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

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

一,开始游戏

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

复制代码
 int n;

    
 	printf("如果你要开始游戏,请输入1\n");
    
 	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("\n");
    
 	}
    
 }
    
 void Print_Init(char a[lens][talls])//打印棋盘
    
 {
    
 	for (int i = 0; i < 10;i++)
    
 	{
    
 		printf("%d ", i);
    
 	}
    
 	printf("\n");
    
 	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,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!即将为您开始下一局游戏\n");
    
 		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("\n");
    
 	i = Sum_Mine(a, n, m);
    
 	Change_Map(b, i,n,m);
    
 	t++;
    
 	Print_Init(b);
    
 	if (t == 71)
    
 	{
    
 		printf("You win!!\n 即将为您开始下一局游戏\n");
    
 		main();
    
 	}
    
 }

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

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

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

全部评论 (0)

还没有任何评论哟~