扫雷,扫雷

第一件事:写出我们的main函数

//主函数
int main()
{
	test();//进入游戏的测试
	return 0;
}

进入游戏的测试当中,为了让游戏可以多次游玩,使用我们的do...while循环

进入do...while循环后要建立一个简易的菜单,让玩家能够选择进入游戏或退出游戏。

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

//游戏测试

void test()
{
	int input = 0;

	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("欢迎来到扫雷游戏\n");
			game();//扫雷游戏的逻辑
			break;
		case 0:
			printf("退出扫雷游戏\n");
			break;
		default:
			printf("请重新输入\n");
			break;
		}
	} while (input);
}

看完我们简易的菜单之后,需要我们输入相对应的值,输入1则进入我们的扫雷游戏,输入0就退出我们的循环,输入其他的就要让玩家重新输入。while的表达式和switch的表达式一致,能够让输入其他的数字时,让循环继续。

那么再进入我们game函数的逻辑思路:

首先,扫雷游戏应是一个二维数组构成的游戏,所以我们要创建一个放置雷的棋盘,和一个让我们看的棋盘

若只创建一个棋盘,那么雷和棋盘上的数字可能会冲突。

char mine[ROWS][COLS] = { 0 };//布置好的雷的信息
	char show[ROWS][COLS] = { 0 };//排查出的雷的信息

之后,我们要初始化我们的两个棋盘:

void InitBoard(char board[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++)
		{
			board[i][j] = set;
		}
	}
}

我们的set就是我们放置的符号。

初始化了我们的棋盘之后,我们就要去打印我们的棋盘,但是我们不会去打印放置雷的棋盘。

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("---------扫雷----------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("---------扫雷----------\n");
}

打印完我们的棋盘之后,我们就要开始布置我们的雷

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		//1. 生成随机下标
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		//2. 布置雷
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

布置雷,用我们的rand函数来布置雷的坐标。rand()%row + 1可以让我们的雷布置的范围在我们棋盘的任意位置。

而且每次游戏不能都重复上次的随机位置,所以我们可以用srand((unsigned int)time(NULL)),让我们的每次游戏都是随机的

那么布置完雷之后,就到了我们紧张刺激的扫雷环节

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row * col - EASY_COUNT))
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("该坐标被排查过了\n");
				continue;
			}
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int n = get_mine_count(mine, x, y);
				show[x][y] = n + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == (row * col - EASY_COUNT))
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

我们排查雷的时候,会出现一下几种情况:

1.我们排查的位置就是雷,那么我们就会被炸死,然后游戏结束,并且应该告诉我们整个棋盘的数据,所有雷的位置。

2.我们排查的位置不是雷,那么我们的游戏会继续,并再次打印我们的棋盘,并且打印了上一个步骤的结果。

3.我们排查的位置被我们重复排查,那么我们就应该被告诉,位置已被排查过。

4.我们排查的位置是非法的,不在我们整个棋盘规定的范围内。

5.我们最终会将所有的雷全部排查干净,也相当于,我们排查了所有的安全区域,那么要告诉我们排雷成功。

你可能感兴趣的:(C语言的学习,算法)