C语言实现简易扫雷小游戏

扫雷(简易版):

游戏规则:电脑随机生成雷,玩家随机扫一个坐标,如果该坐标是生成雷的位置,则踩到雷。如果没有则显示该坐标附近八个坐标雷的总数,一直循环至所有不是雷的坐标全部扫完

下面图片红色代表雷,黑色代表非雷

C语言实现简易扫雷小游戏_第1张图片

思路:

一、创建两个二维数组存放棋盘(一个为玩家操作棋盘,另一个用来存放雷的棋盘)

二、初始化棋盘

三、打印玩家操作棋盘

四、电脑随机生成雷

五、玩家操作并判断该坐标周围有多少雷,如果玩家操作的坐标在存放雷的棋盘中是雷,那么就踩到雷,是否踩到雷需要两个棋盘比较,如果没有踩到雷,则打印出操作后的棋盘。

六、胜利的条件为操作的步数等于棋盘的总格数减去雷占用的格数,即如果全部非雷的坐标都被扫过并没有踩到雷,那么就胜利

#include
#include
#include

#define hang 10
#define lie 10
#define hangs hang+2
#define lies lie+2


void chushi(char arr[hangs][lies], int h, int l,char set);//初始化

void print(char arr[hangs][lies], int h, int l);//打印棋盘

void computer(char arr[hangs][lies],int p);//电脑随机生成雷

int jud(char arr[hangs][lies], int x, int y);//判断坐标周围雷的总数

void play(char arr[hangs][lies], char arr2[hangs][lies], int h, int l,int p);//玩家操作

首先初始化棋盘函数,将两个棋盘全部初始化

void chushi(char arr[hangs][lies], int h, int l,char set)//初始化棋盘
{
	int x, y;
	for (x = 0; x < h; x++)
	{
		for (y = 0; y < l; y++)
		{
			arr[x][y] = set;
		}
	}
}

 打印棋盘函数,根据自己想要的效果可修改

void print(char arr[hangs][lies], int h, int l)//打印棋盘
{
	int x = 0, y = 0;
	for (y = 1; y < l - 1; y++)
	{
		printf(" %d  ", y);
	}
	printf("\n");
	printf("|");
	for (y = 1; y < l - 1; y++)
	{
		printf("---|");
	}
	printf("\n");
	for (x = 1; x < h - 1; x++)
	{
		printf("|");
		for (y = 1; y < l - 1; y++)
		{
			printf(" %c |", arr[x][y]);
		}
		printf("%d", x);
		printf("\n");
		printf("|");
		for (y = 1; y < l - 1; y++)
		{
			printf("---|");
		}
		printf("\n");
	}
}

棋盘效果如下

 C语言实现简易扫雷小游戏_第2张图片

 接着电脑随机生成雷的坐标,这里用1来表示雷,以下代码中 p为玩家自定义雷的总数

void computer(char arr[hangs][lies], int p)//电脑布置雷
{
    //p为雷的总数,由玩家赋值
	do
	{
		//电脑随机生成雷的位置的下标
		int x = rand() % hang + 1;
		int y = rand() % lie + 1;
		if (arr[x][y] == '#')
		{
			arr[x][y] = '1';
			p--;
		}
	} while (p);
}

 判断玩家操作的坐标附近有多少个雷,如果附近的其中一个坐标是雷(雷用1来表示),则总数加1(变量i为总数)

int jud(char arr[hangs][lies], int x, int y)//判断扫雷的坐标附近八个坐标一共有多少个雷
{
	int i = 0;
	if (arr[x - 1][y - 1] == '1')
		i++;
	if (arr[x - 1][y] == '1')
		i++;
	if (arr[x - 1][y + 1] == '1')
		i++;
	if (arr[x][y - 1] == '1')
		i++;
	if (arr[x][y + 1] == '1')
		i++;
	if (arr[x + 1][y - 1] == '1')
		i++;
	if (arr[x + 1][y] == '1')
		i++;
	if (arr[x + 1][y + 1] == '1')
		i++;
	return i;
}

 最后玩家操作

void play(char arr[hangs][lies], char arr2[hangs][lies], int h, int l,int p)//玩家操作
{
	int x = 0, y = 0;
	int a, win = 0;
	//胜利的条件为操作的步数等于棋盘的总格数减去雷占用的格数
	while (win= 1 && x <= h && y >= 1 && y <= l)//判断输入的坐标是否有效
		{
			a = jud(arr2, x, y);//记录坐标附近有多少雷
			//如果该坐标上存放雷的棋盘为1,则踩到雷
			if (arr2[x][y] == '1')
			{
				printf("踩到雷了\n");
				break;
			}
			//如果该坐标上操作的棋盘还未扫过,则记录并打印附近雷的总数
			if (arr[x][y] == '*')
			{
				arr[x][y] = a + '0';
				print(arr, hangs, lies);
				win++;
			}
			//若该坐标已被占用
			else
				printf("这个坐标已被占用\n");
		}
		//判断输入的坐标是否有效
		else
			printf("输入坐标有误\n");
	}
	if (win == hang * lie - p)
		printf("恭喜你,赢了\n");
}

 以上代码就是游戏功能所用到的函数,接下来是主函数部分

void meu()//打印选择菜单
{
	printf("*****************************\n");
	printf("***1、玩游戏   0、退出游戏***\n");
	printf("*****************************\n");
}

void game()
{
	int p;
	printf("请输入雷的总数:");
	scanf("%d", &p);
	//创建数组
	char arr1[hangs][lies] = { 0 };//操作棋盘
	char arr2[hangs][lies] = { 0 };//存放雷的棋盘
	//初始化数组
	chushi(arr1, hangs, lies, '*');
	chushi(arr2, hangs, lies, '#');
	//打印棋盘
	print(arr1, hangs, lies);
	//电脑生成随机雷
	computer(arr2, p);
	//玩家操作
	play(arr1, arr2, hang, lie, p);
}

int main()
{
	int i = 0;
	srand((unsigned)time(NULL));//设置随机种子
	do
	{
		meu();
		printf("请输入你的选择:");
		scanf("%d", &i);
		switch (i)
		{
		case 0:
			printf("退出成功\n");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (i);
	return 0;
}

这就是一个完整的简易版扫雷过程,可以在单个c文件里完成,不过建议分文件完成。

进阶版:利用递归实现坐标展开功能

C语言--扫雷进阶版,实现周围坐标展开_标仔22的博客-CSDN博客

你可能感兴趣的:(C语言入门,c语言)