C语言数组实现扫雷

C语言数组->实现扫雷

  • 包含头文件

    #include <stdio.h>
    #include <stdlib.h>		//用于生成随机数
    #include <time.h>		//用于产生随机种子
    
  • 创建数组

    int board[11][11];		//存放随机生成的“雷区”
    int boardu[11][11];		//与用户交互的“雷盘”
    
    • 需要创建两个数组,一个用于存放随机生成的“雷区”,一个用于与用户交互的“雷盘”
    • 如果后期有兴趣丰富游戏内容(比如不同难度等),可以使用宏定义常量定义数组,这里只讲数组
    • 这里设计的是9×9的雷盘,创建的是11×11的数组是为了 后面计算每个位置周围的雷数时,不产生越界访问

这里简单举个栗子:

如果我们要计算1×1这个位置周围的总雷数,难免会产生越界访问

我们可以给数组加上一圈

这样就很好的避免了越界访问

  • 游戏框架设计(主程序框架、游戏进程框架)
//游戏进程框架函数
void game()
{
	srand((unsigned)time(NULL));		//产生随机种子,用于后面随机数的生成
	initBoard();						//初始化“雷区”、“雷盘”
	do
	{
		printBoard();					//打印“雷盘”
		int temp = 0;
		while (1)
		{
			int x = 0, y = 0;
			printf("Please enter coordinate->");
			scanf("%d %d", &x, &y);
			if (x > 0 && x < 10 && y > 0 && y < 10)
			{
				temp = sweeping(x, y);	//排雷内部,变量接收返回值
				break;
			}
		
			else
				printf("Input error!Please enter again!->");
		}
		if (temp == -1)					//如果用户“踩雷”,则退出循环
		{
			printBoard();
			printf("You DIE!!\n");
			break;
		}

		
	} while (1);
	
}
//主程序框架函数
int main()
{
	do
	{
		int i = 0;
		printf("1.Start the game!\n");
		printf("2.Quit the game!\n");
		printf("Please enter your choose->\n");
		scanf("%d", &i);
		switch (i)
		{
			case 1:
				game();
				break;
			case 2:
				return 0;
				break;
			default:
				printf("Input error!Please enter again!->\n");
				break;
		}
	} while(1);
}
  • 初始化
void  initBoard()
{
	int i = 0, j = 0;
	for (i = 0; i < 11; i++)
	{
		for (j = 0; j < 11; j++)
		{
			board[i][j] = 0;			//0代表 无雷
			boardu[i][j] = -2;			//-2代表用户未“开拓"
		}
	}
	int temp  = 0;
    while (1)
	{
        //随机生成 10 个雷,存放至“雷区”
		int x =	rand() % 8 + 1;			
		int y = rand() % 8 + 1;
		if (board[x][y] == 0)
		{
			board[x][y] = -1;
			temp++;
		}
		if (temp == 10)
			break;	
	}
	for (i = 1; i < 10; i++)
	{
		for (j = 1; j < 10; j++)
		{
            //计算每个 无雷的位置 周围(9个格子) 雷的数量,并存放至“雷区”
			if (board[i][j] == -1)
				continue;
			int x = 0, y = 0,value = 0;
			for (x = 0; x < 3 ; x++)
			{
				for (y = 0; y < 3; y++)
				{
					if (board[i - 1 + x][j - 1 + y] == -1)
						value++;
				}
			}
			board[i][j] = value;
		}
	}	
}
  • 打印“雷盘”

是时候展现真正的 艺术 了!这里简单打印一下,有兴趣的 帖子 可以升级一下

void printBoard()
{
	int i = 0, j = 0;
	printf("# 1 2 3 4 5 6 7 8 9 #\n");			//让用户能清晰对应坐标
	for (i = 1; i < 10; i++)
	{
		printf("%d", i);
		for (j = 1; j < 10; j++)
		{
			if (boardu[i][j] == -2)				//如果“雷盘”中数值为初始值-2,说明用户还未“开采”此处,则打印 * 
				printf(" %c", '*');
			else if (boardu[i][j] == -1)		//如果“雷盘”中数值变成了-1,说明用户“开采”了此处,且此处是雷,则用 $ 表示
				printf(" %c", '$');
			else if (boardu[i][j] == 0)			//如果“类盘”中数值变为0;也说明用户“开采”了此处,且此处无雷,用 空格 表示
				printf(" %c", ' ');
			else								//此处打印用户开采出来的 周围雷的信息
				printf(" %d", boardu[i][j]);
		}
		printf(" #\n");
	}
	printf("# # # # # # # # # # #\n");
}
  • 游戏核心(怎样扫雷)
int sweeping(int x,int y)				//传入用户输入的坐标
{
	int i = 0, j = 0;
	if (board[x][y] == -1)				//判断是不是“踩雷”了
	{
		for (i = 1; i < 10; i++)
		{
			for (j = 1; j < 10; j++)
			{
				if (board[i][j] == -1)	//如果“踩雷”了,将剩余所有的雷先显示出来
					boardu[i][j] = -1;
			}
		}
		return -1;				//返回个-1,用来结束本局游戏
	}
	else						//如果没踩雷,那就把周围 隐藏 的 信息 显示出来
	{
		for (i = x - 1; i < x + 2; i++)
		{
			for (j = y - 1; j < y + 2; j++)
			{
				if (board[i][j] != -1)  
				boardu[i][j] = board[i][j];
			}
		}
		return 0;
	}
}
posted on 2021-10-02 22:15  isadids  阅读(79)  评论(0编辑  收藏  举报