扫雷游戏的思路及代码实现

游戏思路:

扫雷游戏是在一个方形区域发现掩藏着的地雷的游戏,除去开始选择点击一个位置时没有任何提示,后面我们都会得到点击过的位置附近藏着多少颗地雷,我们需要根据这些提示一步步的排雷,误触雷后游戏结束,安全发现全部雷后游戏通关。

通过对游戏规则的理解,可以知道,方形区域实质上可以看成是二维数组。我们可以初始化两个二维数组,一个用于埋雷(board数组),赋值字符‘1’表示是有雷,字符‘0’表示无雷,另一个二维数组(arr数组)用于赋值字符‘*’表示藏雷。

总体的思路是:

首先创造雷区,也就是二维数组。

其次是埋下地雷,即在board数组中随机赋值字符’1‘,有几个1表示几个雷。

然后将雷区藏好,也就是将arr数组全部赋值字符’*‘。

再则是展示arr数组。

最后是找雷,在找雷时,如果查找的位置无雷,就统计board数组这个位置附近的雷,并求和赋值给arr数组的这个位置,并且再次展示arr数组,再次找雷,若被雷区炸死则游戏结束并且展示board数组,否则继续该操作,直到排完所有雷游戏结束并且展示board数组。

思路括展:

扫雷游戏的思路及代码实现_第1张图片

由上图可知,为了方便代码的实现,要实现9*9的扫雷区域应该初始化11*11的二维数组。

下面是模拟实现9*9的二维数组的扫雷游戏的代码实现。

宏定义

#define ROWS 9+2
#define COLS 9+2
#define ROW 9
#define COL 9
#define EASY_COUNT 10

游戏菜单

void menu()//菜单,输入1开始游戏,0结束游戏
{
	printf("****************扫雷***************\n");
	printf("*********   1 :开始游戏   *********\n");
	printf("*********   0 :退出游戏   *********\n");
	printf("****************扫雷***************\n");
}

数组初始化

char board[ROWS][COLS];//埋雷
char arr[ROWS][COLS];//藏雷

void InitBoard(char arr[ROWS][COLS], char board[ROWS][COLS])//初始化
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			arr[i][j] = '0';//初始化全是无雷
			board[i][j] = '0';
		}
	}
}

给board数组埋雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置10个雷
	//⽣成随机的坐标,布置雷
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;//rand()函数的返回值是一个int型的整数
		int y = rand() % col + 1;//x,y赋值为1到9的整数

		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;            //只有成功在没有埋雷的地方埋雷count才减1
		}
	}
}

藏雷

void FoggyBorad(char arr[][COLS])//隐藏雷
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			arr[i][j] = '*';
		}
	}
}

找雷

int GetCount(char board[][COLS], int m, int n)//得到附近有多少个雷
{
	return board[m + 1][n] + board[m - 1][n] + board[m][n + 1] + board[m][n - 1] + board[m + 1][n + 1] + board[m - 1][n - 1] + board[m - 1][n + 1] + board[m + 1][n - 1] - 8 * '0';
}


void FindMine(char board[ROWS][COLS], char arr[ROWS][COLS], int row, int col)
{
    //找雷
	int x = 0;
	int y = 0;
	int cnt = 0;
	while (cnt < row * col - EASY_COUNT)//9*9的二维数组,埋10个雷,最多只能找71次
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(board);
				printf("\n");
				printf("\n");
				printf("\n");
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有⼏个雷
				int count = GetCount(board, x, y);
				arr[x][y] = count + '0';
				DisplayBoard(arr);
				cnt++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (cnt == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(board);
		printf("\n");
		printf("\n");
		printf("\n");
	}
}

主函数

#include "stdio.h"
#include "stdlib.h"
#include 

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//防止埋雷时rand()函数产生相同的随机值
	 do
		 {
		 menu();
		 printf("请选择:->");
		 scanf("%d", &input);
		 switch (input)
			 {
		 case 1:
			 game();
			 break;
		 case 0:
			 printf("退出游戏\n");
			 break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

代码实现

#include "stdio.h"
#include "stdlib.h"
#include 

#define ROWS 9+2
#define COLS 9+2
#define ROW 9
#define COL 9
#define EASY_COUNT 10

char board[ROWS][COLS];
char arr[ROWS][COLS];

void InitBoard(char arr[ROWS][COLS], char board[ROWS][COLS])//初始化
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			arr[i][j] = '0';
			board[i][j] = '0';
		}
	}
}

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置10个雷
		//⽣成随机的坐标,布置雷
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}
void DisplayBoard(char arr[][COLS])//打印雷盘
{
	for (int i = 0; i < ROWS - 1; i++)
	{
		for (int j = 0; j < COLS - 1; j++)
		{
			if (i == 0)
				printf("%d ", j);
			else if (j == 0)
				printf("%d", i);
			else
				printf(" %c", arr[i][j]);
		}
		printf("\n");
	}
}

void FoggyBorad(char arr[][COLS])//隐藏雷
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			arr[i][j] = '*';
		}
	}
}


int GetCount(char board[][COLS], int m, int n)
{
	return board[m + 1][n] + board[m - 1][n] + board[m][n + 1] + board[m][n - 1] + board[m + 1][n + 1] + board[m - 1][n - 1] + board[m - 1][n + 1] + board[m + 1][n - 1] - 8 * '0';
}
void FindMine(char board[ROWS][COLS], char arr[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int cnt = 0;
	while (cnt < row * col - EASY_COUNT)
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(board);
				printf("\n");
				printf("\n");
				printf("\n");
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有⼏个雷
				int count = GetCount(board, x, y);
				arr[x][y] = count + '0';
				DisplayBoard(arr);
				cnt++;
			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (cnt == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(board);
		printf("\n");
		printf("\n");
		printf("\n");
	}
}

void game()
{
	InitBoard(arr, board);
	SetMine(board, ROW, COL);
	FoggyBorad(arr);
	DisplayBoard(arr);
	FindMine(board, arr, ROW, COL);
}

void menu()//菜单
{
	printf("****************扫雷***************\n");
	printf("*********   1 :开始游戏   *********\n");
	printf("*********   0 :退出游戏   *********\n");
	printf("****************扫雷***************\n");
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	 do
		 {
		 menu();
		 printf("请选择:->");
		 scanf("%d", &input);
		 switch (input)
			 {
		 case 1:
			 game();
			 break;
		 case 0:
			 printf("退出游戏\n");
			 break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

成果展示

​​​​​​​扫雷游戏的思路及代码实现_第2张图片

你可能感兴趣的:(游戏,c语言)