(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

前言

  这是本人第一篇博客,更多的是对现阶段c语言学习的一个总结,相当于一篇笔记,代码以及博客文章都存在着很大的不足,望各位大佬指出,本人一定及时纠正并加以补充,愿共同进步!

目录

一:扫雷游戏的基本逻辑

二:游戏的分析与设计

1.分文件编写

2.创建菜单

3.创建棋盘

4.显示棋盘


一:扫雷游戏的基本逻辑

想必大家都有接触过扫雷游戏

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

  我们要想用代码实现一款扫雷游戏,首先便要理清这款游戏的逻辑。

1.一张地图,且地图上有一定数量的雷,在此我们设置地图为9*9,一共有10个雷。

2.游玩方式:如果位置是雷,就炸死了。游戏失败。

                     如果不是雷,会统计该坐标周围雷的个数,并通过数字显示出来

                     如果成功找到所有非雷的位置。游戏胜利。

二:游戏的分析与设计

🚀1.分文件编写

  不同功能的函数封装到不同的文件中。 一个.c文件和一个.h文件被称为一个模块。 开发C程序时,稍微大型的项目就需要使用多文件开发(模块化编程)。 当代码量较大功能较复杂时,单一文件程序会使得文件非常巨大,代码量非常大,成千上万行的代码在一个文件中不便于修改和维护,因此需要将不同的功能模块放在不同的文件中。(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

🥦好处:

 1.程序更加简洁明了

 2.利于小组团队共同完成项目

 3.便于进行调试

🚀2.创建菜单

便于进行后续操作

void menu()
{
	printf("--------------------------\n");
	printf("--------------------------\n");
	printf("---------1.play-----------\n");
	printf("---------2.quit-----------\n");
	printf("--------------------------\n");
	printf("--------------------------\n");
}

用do…while循环实现菜单使用,switch语句进行菜单选择

int main()
{
	
	int input = 0;
	do
	{
		menu();
		int n = 0;
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			Sweepmine();
			break;
		case 2:
			printf("欢迎您下次游玩!");
			break;
		deafault:
			break;
		}
	} while (input);
	return 0;
}

🚀3.创建棋盘

由于考虑到边缘有雷的情况,防止访问出界棋盘应制作9+2=11大小的规格

0 0 0 0 0 0 0 0 0
0 0

0

0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0  1 0 0
0 0 0

先创建数组

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

注:由于行,列使用频率较高 在game.h中进行宏定义

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

🍉数组1 初始化 使其全部填充“*”视为遮挡、

🍉数组2 初始化 使其全部填充0,视为无雷,后续填充1作为雷

初始化 函数

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

🚀4.显示棋盘

  我们很容易利用for循环实现对棋盘的打印,为方便后续的体验以及游玩,我们也可以先打印序号,建立一个平面直角坐标系。

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

棋盘打印效果如下:

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

🚀5.布置雷

  要想生成雷,我们先利用生成指定范围的随机数的道理生成两个介于1~9的数字,作为埋雷的坐标,并进行替换。

  生成随机坐标,并将坐标位置替换为1。

(c语言)数组和函数的实践:扫雷游戏 思路与逻辑

注:进入while循环每设置一个雷,count减一,直到雷设置完毕跳出循环。

     🍉  调用rand()需要srand()

🚀6.排查雷

  输入坐标,可以设置输入坐标范围以确保坐标在棋盘范围内否则重新输入,判断棋盘范围内坐标是否重复输入,若未重复输入判断是否踩雷,.若踩雷”炸死“游戏结束,放入while循环,若雷没有排查完持续循环,若所有雷被排查出则排雷成功。

void CheckMine(char arr1[ROWS][COLS],char arr2[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win = 1 && x = 1 && y <= col)
		{
			if (mine[x][y] != '*')
			{
				printf("输入坐标重复,请重新输入\n");
			}
			else if (board[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				break;
			}
			else
			{
				//不是雷,就统计x,y坐标周围有几个雷
				int c = Display(mine, x, y);
				board[x][y] = c + '0';
				Show(board, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("输入坐标错误,请重新输入\n");
		}
	}
	if (win == ROW*COL-10)
	{
		printf("排雷成功\n");
		Show(board, ROW, COL);
	}
}

统计坐标的方法如下:

因为坐标内输入的是字符‘0’,所以统计出个坐标数‘1’之和减去‘0’及为周围雷数

int CheckMine(char arr1[ROWS][COLS], int x, int y)
{
	return  arr1[x + 1][y] + arr1[x - 1][y] + arr1[x][y + 1]
    + arr1[x][y - 1] + arr1[x + 1][y + 1] + arr1[x - 1][y - 1]
    + arr1[x + 1][y - 1] + arr1[x - 1][y + 1]-(8*'0');
}

游戏即可正常运行

三:总结与反思

  此扫雷小游戏属于简化版,并不能做到像WINDOWS系统自带的扫雷游戏那样。代码也有更多提升的地方以上是本篇文章的全部内容了,如果这篇文章对你有些许帮助你的点赞,收藏,评论都是对我最大的支持与鼓励,另外文章的不足之处也希望大佬们能给我一点小小的建议,我会努力的检查并改进。感谢你的阅读。

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/1ce8c352d7.html