用C语言实现扫雷

news2024/10/6 5:53:06

本篇适用于C语言初学者,主要涉及对于函数,数组,分支循环的运用。

目录

设计思想:

总代码(改进后):

运行结果展示:

分布介绍:

声明:

代码主体部分:

功能模块实现:

初始化模块:

打印模块:

埋雷模块:

判断模块:

总结:


设计思想:

首先要有一个游戏菜单,输入1表示开始,0表示结束,其它数字则提示输入错误,请重新输入;其次要有雷盘,雷盘用二维数组表示,开始时要有初始化模块对二维数组初始化,要有埋雷模块放置雷,要有判断输赢及返回结果模块,要有打印模块向玩家展示雷盘,为了更容易实现这些模块,我们选择两个二维数组表示雷盘,其中一个埋雷,其中一个向玩家展示。为了方便计算周围雷的个数,空用 '0' 表示,;雷用 '1'表示。

总代码(改进后):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9
#define COL 9

#define ROWS ROW + 2
#define COLS COL + 2

#define Easy_Mine 10

void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch);
void DisplayBorad(char borad[ROWS][COLS], int row, int col);
void SetMine(char borad[ROWS][COLS], int row, int col);
void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col);

//初始化
void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch)
{
	int i = 0;

	for (i = 0; i < rows; i++)
	{
		int j = 0;

		for (j = 0; j < cols; j++)
		{
			borad[i][j] = ch;
		}
	}
}

//打印拓展
void DisplayBorad(char borad[ROWS][COLS], int row, int col)
{
	int i = 0;
	//列标
	for (i = 0; i <= col; i++)
	{
		printf(" %d |", i);
	}
	printf("\n");
	for (i = 0; i <= col; i++)
	{
		printf("---|", i);
	}
	printf("\n");
  
	for (i = 1; i <= row; i++)
	{
		//行标
		printf(" %d |", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf(" %c |",borad[i][j]);
		}
		printf("\n");
		
		for (j = 0; j <= col; j++)
		{
			printf("---|", i);
		}
		printf("\n");
	}
	printf("\n");
}

//放置雷
void SetMine(char borad[ROWS][COLS], int row, int col)
{
	int count = Easy_Mine;

	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (borad[x][y] == '0')
		{
			borad[x][y] = '1';
			count--;
		}
	}

}

//改进判断法

//递归实现扫雷的展开一片
void GetMineCount(char mine_borad[ROWS][COLS], char show_borad[ROWS][COLS], int x, int y, int* count)
{
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL && show_borad[x][y] == '*')
	{
		int i = x - 1;
		int j = y - 1;
		int sum = 0;
		//计算周围有几个雷
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				sum = sum +(mine_borad[i][j] - '0');
			}
		}
		//如果周围没有雷,将此坐标置为空格,递归查找周围的周围是否有雷...
		if (sum == 0)
		{
			show_borad[x][y] = ' ';
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					//更正循环次数
					(*count)--;
					GetMineCount(mine_borad, show_borad, i, j, count);
				}
			}
		}
		//如果周围有雷,将此坐标字符该为对应雷的个数的字符
		else
		{
			//更正循环次数
			(*count)--;
			show_borad[x][y] = sum + '0';
		}
	}
}

void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = row * col - Easy_Mine;
	//实现主体
	while (count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine_borad[x][y] == '1')
			{
				printf("嘭!你被炸死了!\n");
				DisplayBorad(mine_borad, ROW, COL);
				break;
			}
			else if (mine_borad[x][y] == '0' && show_board[x][y] == '*');
			{
				GetMineCount(mine_borad, show_board, x, y, &count);
				//count = count_number(show_board, row, col);
				//DisplayBorad(mine_borad, ROW, COL);
				DisplayBorad(show_board, ROW, COL);
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	if (count == 0)
	{
		printf("恭喜你,你赢了!\n");
		DisplayBorad(mine_borad, row, col);

	}
}

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

void game()
{
	//此二维数组用来放置雷
	char mine[ROWS][COLS] = { 0 };
	//此二维数组用于像玩家展示
	char show[ROWS][COLS] = { 0 };

	//初始化两个二维数组
	InitBorad(mine, ROWS, COLS, '0');
	//DisplayBorad(mine, ROW, COL);
	InitBorad(show, ROWS, COLS, '*');

	//放置雷
	SetMine(mine, ROW, COL);

	//打印棋盘
	DisplayBorad(show, ROW, COL);

	//DisplayBorad(mine, ROW, COL);
	//游戏实现主体
	FindMine(mine, show, ROW, COL);
}

//主函数
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;
}

运行结果展示:

 

 

 

分布介绍:

声明:

如果想要更改雷盘大小,放置雷个数,只需对ROW , COL , Easy_Mine作相应的修改即可。 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//标识符定义行与列
#define ROW 9
#define COL 9
//雷盘实际大小
#define ROWS ROW + 2
#define COLS COL + 2
//雷的个数
#define Easy_Mine 10
//主要函数声明
void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch);
void DisplayBorad(char borad[ROWS][COLS], int row, int col);
void SetMine(char borad[ROWS][COLS], int row, int col);
void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col);

代码主体部分:

关于作为9 * 9的雷盘为什么要选择11 * 11的二维数组表示,是为了防止越界访问,以及更容易地实现扫雷后的判断和返回结果。用字符0将要放置雷的二维数组初始化,用字符*将向玩家展示的二维数组初始化,用字符1表示雷。

//游戏菜单
void menu()
{
	printf("******************************\n");
	printf("********   1.paly   **********\n");
	printf("********   0.exit   **********\n");
	printf("******************************\n");
}
//实现主体
void game()
{
	//此二维数组用来放置雷
	char mine[ROWS][COLS] = { 0 };
	//此二维数组用于像玩家展示
	char show[ROWS][COLS] = { 0 };

	//初始化两个二维数组
	InitBorad(mine, ROWS, COLS, '0');
	//DisplayBorad(mine, ROW, COL);
	InitBorad(show, ROWS, COLS, '*');

	//放置雷
	SetMine(mine, ROW, COL);

	//打印棋盘
	DisplayBorad(show, ROW, COL);

	//DisplayBorad(mine, ROW, COL);
	//游戏实现主体
	FindMine(mine, show, ROW, COL);
}
//主函数
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;
}

功能模块实现:

初始化模块:

通过嵌套for循环用传过来的字符将传过来的数组初始化。

//初始化
void InitBorad(char borad[ROWS][COLS], int rows, int cols, char ch)
{
	int i = 0;

	for (i = 0; i < rows; i++)
	{
		int j = 0;

		for (j = 0; j < cols; j++)
		{
			borad[i][j] = ch;
		}
	}
}

打印模块:

原始打印模块:

先利用for循环打印列标,再利用嵌套for循环打印行标及二维数组。代码及雷盘展示如下:

//打印
void DisplayBorad(char borad[ROWS][COLS], int row, int col)
{
	int i = 0;
    //列标
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
        //行标
		printf("%d ", i);
        //遍历二维数组
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", borad[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

雷盘:

改进打印模块:

原理如上,加以修饰,代码及雷盘展示如下:

//打印拓展
void DisplayBorad(char borad[ROWS][COLS], int row, int col)
{
	int i = 0;
	//列标
	for (i = 0; i <= col; i++)
	{
		printf(" %d |", i);
	}
	printf("\n");
	for (i = 0; i <= col; i++)
	{
		printf("---|", i);
	}
	printf("\n");
  
	for (i = 1; i <= row; i++)
	{
		//行标
		printf(" %d |", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf(" %c |",borad[i][j]);
		}
		printf("\n");
		
		for (j = 0; j <= col; j++)
		{
			printf("---|", i);
		}
		printf("\n");
	}
	printf("\n");
}

 雷盘:

埋雷模块:

要实现在雷盘上随机放置雷,需要srand()和time()库函数来确定随机数生成期起点,rand()库函数来生成随机数,将获得的随机数大小控制在1~9之间(雷盘逻辑大小),获得要放置雷的坐标后,找到与之对应的二维数组元素,将其置为字符1。(字符0表示不是雷,字符1表示雷)模块代码及放置雷的二维数组展示:

//放置雷
void SetMine(char borad[ROWS][COLS], int row, int col)
{
    //要放置的雷的个数
	int count = Easy_Mine;

	while (count)
	{
        //获得要放置雷的坐标
		int x = rand() % row + 1;
		int y = rand() % col + 1;
        //如果此坐标未放置雷,则放置雷,否则重新获得坐标
		if (borad[x][y] == '0')
		{
			borad[x][y] = '1';
			count--;
		}
	}
}

放置雷的二维数组:

判断模块:

原始判断模块;

此模块需要将真雷盘和假雷盘二维数组都传过去。玩家输入要扫雷的坐标,如果坐标不合法,提示输入错误,重新输入。如果坐标合法,与放置雷的二维数组的相应坐标对照,如果此坐标是雷,则输出玩家扫雷失败,并将埋雷的二维数组向玩家展示,游戏结束,如果此坐标不是雷,则判断此坐标周围一圈有无雷,如果无雷,返回0,有雷的话,返回雷的个数,并将向玩家展示的二维数组的对应的坐标更改为雷的个数,更正循环控制条件,继续游戏。当循环控制条件不再满足(及已将所有不是雷的坐标扫出)则获得游戏胜利,游戏结束。

//原始判断法

//返回此坐标周围雷的个数
int GetMineCount(char borad[ROWS][COLS], int x, int y)
{
	//字符1~9减去一个字符0就可以得到整型数1~9,这也是选择用字符0和1表示是否有雷的原因
	return (borad[x - 1][y] + borad[x - 1][y - 1] + borad[x][y - 1] + borad[x + 1][y - 1]
		+ borad[x + 1][y] + borad[x + 1][y + 1] + borad[x][y + 1] + borad[x - 1][y + 1] - 8 * '0');
}

//判断输赢
void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	//循环控制条件
	int count = row * col - Easy_Mine;
	while (count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		//判断输入坐标是否合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//此坐标是雷
			if (mine_borad[x][y] == '1')
			{
				printf("嘭!你被炸死了!\n");
				//打印放置雷的二维数组
				DisplayBorad(mine_borad, ROW, COL);
				break;
			}
			//此坐标不是雷
			else if (mine_borad[x][y] == '0' && show_board[x][y] != ' ');
			{
				//函数调用返回雷的个数
				int ret = GetMineCount(mine_borad, x, y);
				//将向玩家展示的二维数组的对应坐标更改为雷的个数(将整型数1~9加一个字符0就可转换成字符1~9)
				show_board[x][y] = ret + '0';
				//打印
				DisplayBorad(show_board, ROW, COL);
				//更正循环控制条件
				count--;
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	//游戏胜利判定
	if (count == 0)
	{
		printf("恭喜你,你赢了!\n");
		DisplayBorad(mine_borad, row, col);

	}
}

运行展示:

改进判断模块: 

上述判断模块跟扫雷游戏还是有些实质差异,在扫雷游戏中,当一个坐标周围一圈都没有雷时,就会为空,再对他周围的坐标的周围进行判断......因此需要对其进行改进,总体思想不变,仅需对判断坐标周围一圈雷数的子模块以及循环控制条件进行修改即可。当输入坐标周围一圈都没有雷时,将向玩家展示的二维数组的对应坐标置为空格,更改循环控制条件,并判断它周围坐标的周围是否有雷.....依此类推。这里通过循环和递归思想实现此功能。

//改进判断法

//递归实现扫雷的展开一片
void GetMineCount(char mine_borad[ROWS][COLS], char show_borad[ROWS][COLS], int x, int y, int* count)
{
	//递归限制条件 
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL && show_borad[x][y] == '*')
	{
		int i = x - 1;
		int j = y - 1;
		//此变量表示雷的个数 
		int sum = 0;
		//计算周围有几个雷
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				sum = sum +(mine_borad[i][j] - '0');
			}
		}
		//如果周围没有雷,将此坐标置为空格,递归查找周围的周围是否有雷...
		if (sum == 0)
		{
			show_borad[x][y] = ' ';
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					//更正循环次数
					(*count)--;
					//递归 
					GetMineCount(mine_borad, show_borad, i, j, count);
				}
			}
		}
		//如果周围有雷,将此坐标字符改为对应雷的个数的字符
		else
		{
			//更正循环次数
			(*count)--;
			show_borad[x][y] = sum + '0';
		}
	}
}

void FindMine(char mine_borad[ROWS][COLS], char show_board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = row * col - Easy_Mine;
	//实现主体
	while (count)
	{
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine_borad[x][y] == '1')
			{
				printf("嘭!你被炸死了!\n");
				DisplayBorad(mine_borad, ROW, COL);
				break;
			}
			else if (mine_borad[x][y] == '0' && show_board[x][y] == '*');
			{
				GetMineCount(mine_borad, show_board, x, y, &count);
				//count = count_number(show_board, row, col);
				//DisplayBorad(mine_borad, ROW, COL);
				DisplayBorad(show_board, ROW, COL);
			}
		}
		else
		{
			printf("输入坐标非法,请重新输入!\n");
		}
	}
	if (count == 0)
	{
		printf("恭喜你,你赢了!\n");
		DisplayBorad(mine_borad, row, col);

	}
}

运行展示:

 

 

总结:

关于扫雷游戏的基本模块已经实现,可以开始游戏啦!当然,这个简易扫雷游戏还是可以继续优化的,比如增加标记功能等,这些模块的实现就需要大家自行去探索了,我就不过多阐述了。本期内容就到这里,如果帮到你的话,还请给个一键三连吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

精准定位,智慧提纯:高级数据提取策略

在数据驱动的时代&#xff0c;高级数据提取策略成为企业决策、科学研究以及各类项目成功的关键。数据提取&#xff0c;不仅仅是简单地收集信息&#xff0c;而是需要精准定位目标数据&#xff0c;并通过智慧提纯方法&#xff0c;从海量数据中提取出有价值、有深度的信息。本文将…

如何计算 GPT 的 Tokens 数量?

基本介绍 随着人工智能大模型技术的迅速发展&#xff0c;一种创新的计费模式正在逐渐普及&#xff0c;即以“令牌”&#xff08;Token&#xff09;作为衡量使用成本的单位。那么&#xff0c;究竟什么是Token呢&#xff1f; Token 是一种将自然语言文本转化为计算机可以理解的…

【成品设计】基于STM32的单相瞬时值反馈逆变器

《基于STM32的单相瞬时值反馈逆变器》 整体功能&#xff1a; 图13 软件框图 如图13所示&#xff0c;由于本设计中需要通过定时器中断执行一些程序&#xff0c;故首先对中断进行初始化。中断初始化以后即为对串口进行初始化&#xff0c;总共初始化了两个串口&#xff0c;第一个…

轻兔推荐 —— Alist

via&#xff1a;轻兔推荐 - https://app.lighttools.net/ 简介 Alist是一个开源自建网盘程序&#xff0c;界面简洁&#xff0c;功能完善&#xff0c;支持多种存储后端和文件预览功能。 - 分布式设计&#xff0c;无需中心服务器&#xff0c;数据均在本地设备 - 配置灵活&…

springboot整合sentinel接口熔断

背景 请求第三方接口或者慢接口需要增加熔断处理&#xff0c;避免因为慢接口qps过大导致应用大量工作线程陷入阻塞以至于其他正常接口都不可用&#xff0c;最近项目测试环境就因为一个查询的慢接口调用次数过多&#xff0c;导致前端整个首页都无法加载。 依赖下载 springboo…

「C/C++ 01」大小端字节序

目录 一、什么是大小端字节序&#xff1f; 二、为什么会出现大小端之分&#xff1f; 三、实际应用 四、如何区分当前机器是大端还是小端&#xff1f; 1. 用代码来区分 2. 通过VS编译器的监视窗口和内存窗口 一、什么是大小端字节序&#xff1f; 字节序 &#xff1a;是指二进制…

8. 文本三剑客之sed

文章目录 8.1 介绍8.1.1 工作流程8.1.2 命令格式 8.2 sed 使用8.2.1 查找/打印8.2.2 添加8.2.3 修改8.2.4 删除 8.3 保存操作后的内容 8.1 介绍 sed编辑器被称作流编辑器&#xff08; stream editor&#xff09;&#xff0c;和普通的交互式文本编辑器恰好相反。在交互式文本编…

win10打开共享设置

win10打开共享设置

themleaf 页面弹层取值

themleaf 页面弹层取值 创作背景themleaf页面事件onbluronclick 页面参数提交 创作背景 个人在日常开发中&#xff0c;遇到了一个需求页面&#xff0c;页面交互较多&#xff0c;用到的事件也很丰富&#xff0c;特此记录&#xff0c;方便后续查找也方便有需要的开发者采用&…

chrome浏览器设置--disable-web-security解决跨域

在开发人员于后台进行接口测试的时候&#xff0c;老是遇到跨域问题&#xff0c;这时前端总是会让后台添加跨域请求头来允许跨域请求&#xff0c;今天介绍一个简单的方法跨过这一步操作的设置。 –disable-web-security参数&#xff0c;禁用同源策略&#xff0c;利于开发人员本…

Postman 请求参数传递指南:Query、Path和Body

Postman 作为一个功能强大的工具&#xff0c;极大地简化了 API 测试和调试的过程&#xff0c;提供了发送请求和检查响应的直接方法。本文将着重介绍如何在 Postman 中高效地处理请求参数&#xff0c;以提高 API 测试和开发的便利性。 1、解析请求参数 首先&#xff0c;我们需要…

2024最值得入手的骨传导耳机有几款?年度精选五款骨传导耳机分享

作为一个爱好运动的人来说&#xff0c;现在天气越来越暖和了&#xff0c;很多人选择外出徒步、越野或者骑行。在运动过程中都会佩戴一些入耳式耳机&#xff0c;但是运动一段时间发现入耳式耳机带久了耳朵会很不舒服&#xff0c;而且出汗了的话对于一些不防水的入耳式耳机的话&a…

硕思LOGO设计师软件最新版下载及详细安装教程

硕思Logo设计师是一款操作灵活简单&#xff0c;且功能强大的logo制作软件。它可以通过简单的点击就可以为网站、博客、论坛和邮件创建专业的logo、条幅、按钮、标题、图标和签名等。 该软件提供了很多精心设计的模板和丰富的资源&#xff0c;为更好的创建logo艺术作品&#xff…

博物馆藏品管理的重要性

博物馆是人们了解历史文化、传承文明的重要场所。而博物馆的藏品管理是博物馆的核心工作之一&#xff0c;对于展现博物馆的魅力、吸引观众的眼球有着至关重要的影响。并且博物馆藏品管理是一项复杂且专业的工作&#xff0c;它涉及到多个方面&#xff0c;包括但不限于藏品的收集…

DDPM公式推导(一)

去噪扩散概率模型 Title:Denoising Diffusion Probabilistic Models paper是UC Berkeley发表在NIPS 2020的工作 paper地址 Abstract 我们使用扩散概率模型&#xff08;一类受非平衡热力学启发的潜在变量模型&#xff09;展示了高质量的图像合成结果。根据扩散概率模型与采用La…

AI大模型的应用远比你想像的要简单—人人都是程序员

2022年底OpenAI发布了语言大模型chatgpt3.5&#xff0c;它能像人一样跟我们聊天&#xff0c;从此AI市场着了大火&#xff0c;国内外各个顶级科技公司纷纷跟进&#xff0c;出现了一大批的AI大模型&#xff0c;比如文心一言&#xff08;百度&#xff09;、Gemini&#xff08;谷歌…

Python 使用print输出二进制文件时产生的错位

项目实践中&#xff0c; with open(fileName, rb) as f: result f.read()print(result)f.close()打开二进制文件&#xff0c;打印出的结果会出现有些\x后面有好几个字符的情况 但实际这串数字是 这种情况是因为print函数将二进制数据解释为字符串并以其字节值的十六进制表…

中电金信:GienTech动态|中标、入选、参会...近期精彩呈现!

中电金信参编业内首个银行核心系统分级度量标准 2024年6月6日&#xff0c;由中国信息通信研究院云计算与大数据研究所主办的“应用现代化赋能银行核心系统升级”交流会议在京召开。会议发布了业内首个银行核心系统分级度量标准《银行核心系统现代化建设水平度量模型》&#xf…

视频字幕提取工具怎么使用?不妨看看这些教程

在探索学习设备使用的过程中&#xff0c;视频教程扮演着极其重要的角色。 但是&#xff0c;我们可能会遇到一些挑战&#xff0c;比如长视频教程的观看效率不高&#xff0c;信息量大难以快速定位到关键点&#xff0c;或者有些人更喜欢阅读文字而非观看视频来学习。 为解决这一…

前沿重器[49] | 聊聊搜索系统2:常见架构

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…