扫雷的代码思路

一、test.c

1、引用的头文件

#include"game.h"

2、创建一个主函数,用来判断是否进入游戏

int main()
{
	srand((int)time(NULL));
	int option;
	do
	{
		system("cls");//清屏函数
		menu();
		printf("输入选项\n");
		scanf("%d", &option);
		if (option == 1)
		{
			game();
			Sleep(2000);
		}
		else if (option != 0)
			printf("输入错误,重新输入\n");
		Sleep(1000);
	} 
	while (option);
	return 0;
}

3、创建菜单函数

void menu()
{
	printf("*****************\n");
	printf("*     1.play    *\n");
	printf("*     0.exit    *\n");
	printf("*****************\n");
}

4、游戏函数

void game()
{
	formad(mine,'0');
	formad(show,'*');
	print(show);
	rank(mine);
	print(mine);
	player(mine,show);
}

二、game.h

1、引用的头文件

#include<stdio.h>//输入输出函数的头文件
#include<stdlib.h>//随机数生成函数的头文件
#include<time.h>//Sleep函数的头文件
#include<windows.h>//清屏函数的头文件

2、定义的宏

#define high 11//创建二维数组行的个数
#define li 11//创建二维数组列的个数
#define highs (high-2)//打印出数组的行数
#define  lis (li-2)//打印除数组的列数
#define leve 10//生成雷的个数

3、二维数组的创造

char mine[high][li];
char show[high][li];

4、声明的函数

void formad(char a[high][li],char y);//格式化数组函数
void print(char a[high][li]);//打印二维数组函数
void rank(char a[high][li]);//生成雷函数
void player(char a[high][li], char b[high][li]);//玩家排雷函数

三、game.c

1、引用的头文件

#include"game.h"

2、格式化数组函数

void formad(char a[high][li], char c)
{
	int x, y;
	for (x = 1; x <= highs; x++)
		for (y = 1; y <= lis; y++)
			a[x][y] = c;
}

3、打印数组函数

void print(char a[high][li])
{
	int x, y;
	printf("--------扫雷-------\n");
	printf("  1 2 3 4 5 6 7 8 9\n");
	for (x = 1; x <= highs; x++)
	{
		printf("%c ", x+48);
		for (y = 1; y <= lis; y++)
			printf("%c ", a[x][y]);
		printf("\n");
	}
}

4、 生成雷函数

void rank(char a[high][li])
{
	int x, y;
	int i = 0;
	while (i < leve)
	{
		x = rand() % 9 + 1;
		y = rand() % 9 + 1;
		if (a[x][y] == '1')
			continue;
		else
			a[x][y] = '1';
		i++;
	}
}

5、玩家排雷函数

void player(char a[high][li], char b[high][li])
{
	while (number(show, '*') > leve)
	{
		int x, y, u, l, num;
		printf("输入坐标\n");
		scanf("%d %d", &x, &y);
		if (a[x][y] == '1')
		{
			printf("被雷炸了\n");
			print(mine);
			break;
		}
		else if (b[x][y] != '*')
		{
			printf("排查过了,请重新坐标\n");
			continue;
		}
		else
		{
			num = 0;
			for (u = x - 1; u <= x + 1; u++)
				for (l = y - 1; l <= y + 1; l++)
					if (a[u][l] == '1')
						num++;
			if(num==0)
				bloom(mine, show,x,y);
			b[x][y] = num+48;
		}
		print(show);
	}
	if (number(show, '*') == leve)
		printf("排雷完\n");
}

1、查找还没排查区域的数量

int number(char a[high][li], char b)
{
	int x, y, num;
	num = 0;
	for (x = 0; x < high; x++)
		for (y = 0; y < li; y++)
			if (a[x][y] == b)
				num ++;
	return num;
}

2、如果排查到了一个周围都没有雷的区域,就会扩散直到出现周围有雷的区域或者这个区域达到了边界函数

void bloom(char a[high][li], char b[high][li], int x, int y)
{
	int u, g, j, l, num;
	a[x][y] = '2';
	if (x <= 0 || y <= 0 || x >= highs - 1 || y >= lis - 1 || b[x][y] != '*')
		return 0;
	for(u=x-1;u<=x+1;u++)
		for (g = y - 1; g <= y + 1; g++)
		{
			if (a[u][g] == '2')
				continue;
			a[u][g] = '2';
			num = 0;
			for (j = u - 1; j <= u + 1; j++)
				for (l = g - 1; l <= g + 1; l++)
					if (a[j][l] == '1')
						num++;
			if (num == 0)
				bloom(a,b,u,g);
			b[u][g] = num + 48;
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值