扫雷小游戏(只需数组加函数就能搞定、老铁们快来尝试吧)

各位老铁,大家早上好、中午好、下午好、晚上好。今天给大家分享一份简化版扫雷游戏的C语言实现。这个游戏通过数组和函数就基本能搞定,铁子们都可以尝试起来,对代码能力的提升会很有帮助!

扫雷游戏的规则

这里我们要实现的扫雷游戏是在一个规定的区域内随机布置几个雷,然后玩家随机选中某块区域,如果这个区域是雷就炸死了,而如果不是雷,就统计出周围区域的雷的个数,直到把不是雷的所有区域全部排查出来游戏结束!

代码的实现思路

假设要在9*9的方格中布置10个雷,然后排雷:

1:首先要在方格中存放雷的信息和不是雷的信息,我们可以考虑使用二维数组,例如在数组中用*表示雷,用0表示不是雷。

2:但如果排雷的时候,直接把这个数组打印在屏幕上,雷的信息就直接展现在我们眼前了, 为了方便,我们再用一个和原数组一模一样的数组负责在屏幕上打印,在排雷的时候使用存放雷的那个数组就可以了。

3:当我们开始排雷的时候,如果这个位置是雷,就炸死了,游戏结束;但如果这个位置不是雷,就要统计这个位置周围雷的个数,雷的个数最后要放在负责打印的数组里面。

4:因为在数组中要存放雷的信息,所以我们考虑用字符数组,而为了方便,负责打印的那个数组我们也用字符数组,这样两个数组就能使用同一套函数,代码实现起来也更加容易。

代码实现

这里我们采用多文件的形式,把对游戏部分的声明和实现统一放到game.h和game.c中,而在test.c中则用来测试整个代码的逻辑。在test.c文件中想要使用游戏部分的代码只需要包含game.h的头文件就行了。(注:包含我们自己写的头文件用双引号" ")

先写出游戏的框架

在test.c的源文件中完成,代码如下:

#include "game.h"
void menu()//打印菜单
{
	printf("************************\n");
	printf("********1:play*******\n");
	printf("********0:exit**********\n");
	printf("************************\n");
}
void test()
{
	int input = 1;
	while (input)
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)//选择1玩游戏,选择0退出游戏
		{
		case 1:
            game();//进行扫雷游戏,在测试框架的时候先不写
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	}
}
int main()
{
	test();
	return 0;
}

1:游戏开始先会打印菜单提示:选择1玩游戏,选择0退出游戏。

2:选择1进入游戏,在游戏结束后又会再次提示,直到玩家选择0退出游戏为止。

运行结果如下:

游戏部分的实现

游戏部分的实现我们都采用一个一个的函数的形式,这样整个代码看起来也不会特别冗余。

在game.h的头文件中完成对每一个函数的声明:
//把所有会用到的头文件都放到game.h的头文件中,在其他文件中只调用game.h就行了
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdlib.h>

//扫雷部分的行
#define ROW 9
//扫雷部分的列
#define COL 9
//整个数组的行
#define ROWS ROW + 2
//整个数组的列
#define COLS COL + 2
//雷的个数
#define COUNT 10

//初始化数组
void InitArr(char arr[ROWS][COLS], int rows, int cols, char set);
//打印数组(只打印能布置雷的部分)
void PrintArr(char arr[ROWS][COLS], int row, int col);
//布置雷的个数
void LayMine(char arr[ROWS][COLS], int row, int col, int count);
//遍历整个数组,如果没有雷就给出周围雷的个数
void CalMine(char arr[ROWS][COLS], int row, int col);
//统计一个坐标周围雷的个数
char FindNum(char arr[ROWS][COLS], int x, int y);
//排雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);

在排雷的时候,如果这个位置不是雷就给出周围雷的个数,但是统计在边上的坐标的时候就会发生数组越界的情况,这里为了避免这种情况,我们可以将数组整个都扩大一圈,并保证周围一圈不会布置雷,这样就不用判断数组越界的情况了。

所以在头文件中的ROW代表数组会布置雷的区域的行数,COL代表数组会布置雷的区域的列数;ROWS和COLS则代表数组真正的行数和列数。

在game.c的源文件中完成游戏部分的代码实现

在game函数中调用不同的函数来实现扫雷的整个功能:

1:定义两个数组,一个存放雷的信息,一个存放打印在屏幕上的信息,这两个数组的大小是一样的

char mine[ROWS][COLS] = {'0'};
char show[ROWS][COLS] = {'0'};

2:初始化数组

InitArr(mine, ROWS, COLS, '0');
InitArr(show, ROWS, COLS, '#');

这里对存放雷的数组初始化为'0',而对要打印屏幕信息的数组初始化为'#'。

3:打印数组(只打印布置了雷的区域)

PrintArr(mine, ROW, COL);
PrintArr(show, ROW, COL);

可以测试一下代码有没有问题。

4:布置雷

LayMine(mine, ROW, COL, COUNT);

这里会用到随机数的生成函数rand,在C语言小游戏中有详细讲到

5:计算布置了雷的数组中没有雷的地方周围雷的个数

CalMine(mine, ROW, COL);

6:计算一个(不是雷)坐标周围雷的个数

FindNum(arr, i, j);

这里是先把不是雷的坐标周围雷的个数算了出来,所以FindNum函数要和CalMine函数配合使用,铁子们也可以在排雷的时候再算要排的坐标周围雷的个数

7:排雷

FindMine(mine, show);

具体在game.c中的函数实现和函数调用代码如下:

#include "game.h"

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	int count = COUNT;
	int x = 0;
	int y = 0;
	while(count)
	{
		printf("请输入要排查的坐标:\n");
		scanf("%d%d", &x, &y);
		if (mine[x][y] == '*')
		{
			printf("你被炸死了!\n");
			break;
		}
		else
		{
			show[x][y] = mine[x][y];
			system("cls");
			PrintArr(show, ROW, COL);
			PrintArr(mine, ROW, COL);
			count--;
		}
	}
	if(count == 0)
	{
		printf("恭喜你排雷成功!\n");
	}
	system("cls");//清理屏幕
}
char FindNum(char arr[ROWS][COLS], int x, int y)
{
	char count = '0';
	int i = 0;
	for (i = (x - 1); i <= (x + 1); i++)
	{
		int j = 0;
		for (j = (y - 1); j <= (y + 1); j++)
		{
			if (arr[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count;
}
void CalMine(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			if (arr[i][j] != '*')
			{
				arr[i][j] = FindNum(arr, i, j);
			}
		}
	}
}
void LayMine(char arr[ROWS][COLS], int row, int col, int count)
{
	srand((unsigned int)time(NULL));
	while (count)
	{
		int x = (rand() % row) + 1;
		int y = (rand() % col) + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '*';
			count--;
		}
	}
}
void PrintArr(char arr[ROWS][COLS], int row, int col)
{
	printf("======================\n");
	int i = 0;
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("======================\n");
}
void InitArr(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}
void game()
{
	char mine[ROWS][COLS] = {'0'};//存放雷的信息
	char show[ROWS][COLS] = {'0'};//存放在屏幕上打印的信息
	InitArr(mine, ROWS, COLS, '0');//初始化存放雷的数组为'0'
	InitArr(show, ROWS, COLS, '#');//初始化负责打印的数组为'#'
	PrintArr(show, ROW, COL);//把负责打印的数组打印到屏幕上
	LayMine(mine, ROW, COL, COUNT);布置雷的信息
	CalMine(mine, ROW, COL);//遍历整个数组,如果不是雷,就计算周围雷的个数
	FindMine(mine, show);//排查雷
}

下面是运行结果:

以上的这些代码供老铁们参考使用!

  • 67
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 75
    评论
评论 75
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值