【C语言】扫雷游戏的一步一步的实现

news2024/11/29 2:41:32

文章目录

  • 一、扫雷游戏分析和设计
    • 1.1 扫雷游戏的功能说明
    • 1.2 游戏的分析和设计
      • 1.2.1 数据结构的分析
      • 1.2.2 ⽂件结构设计
  • 二、扫雷游戏代码实现
  • 总结


一、扫雷游戏分析和设计

1.1 扫雷游戏的功能说明

• 使⽤控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认随机布置10个雷
• 可以排查雷

◦ 如果位置不是雷,就显⽰周围有⼏个雷
◦ 如果位置是雷,就炸死游戏结束
◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束

游戏的界⾯:

请添加图片描述
请添加图片描述

初始游戏画面
请添加图片描述
排雷画面
请添加图片描述
排雷失败画面
请添加图片描述

1.2 游戏的分析和设计

1.2.1 数据结构的分析

◦ 如果位置不是雷,就显⽰周围有⼏个雷
◦ 如果位置是雷,就炸死游戏结束
在这里插入图片描述

◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束
在这里插入图片描述

扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。
因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个9*9的数组来存放信息。
在这里插入图片描述

那如果这个位置布置雷,我们就存放1,没有雷我们就存放0
在这里插入图片描述

假如排查的是(3,2)这个坐标,我们就访问绿色一圈里面,除黄色方格的八个方位的雷的个数,然后统计周围的雷的个数。
在这里插入图片描述

但是问题来了,但当我们如果要排查(8,1)这个坐标的时候,当我们开始访问周围一圈8个位置,统计雷的个数时,最下面的三个位置由于没有开辟空间,会导致数组越界访问,越界访问,代码就执行不起来了呀?这怎么办。
在这里插入图片描述
既然他会数组越界,那我们不让他越界就好了呀!既然99访问四周边缘的时候会多访问一层空间,那我们就再包裹一圈,也就是创建1111的数组,我们在外层里面不放雷,到时候访问坐标(8,1)的时候,直接就可以访问了,这样就解决了数组越界的问题。

在这里插入图片描述


此时此刻我们的雷阵大小的设计是不是创建好了呢,雷是1,非雷是0,如果我们要排查一个某一位置,这个坐标是不是雷,这个坐标周围有一个雷,我们将统计周围的雷数量打印在棋盘上的时候,这个雷如果打印在棋盘上面,那到底是雷的个数信息,还是雷的信息,这就产生了混淆和打印上的困难,怎么办呢?

如果我们加多一个棋盘,玩家点击该棋盘上的信息对应到埋雷的棋盘上的信息。将雷的信息放在一个棋盘上,而雷的个数信息通过专门给玩家猜雷的棋盘,而玩家猜雷的棋盘统计雷的棋盘并打印在玩家的棋盘上,而我们的埋雷的棋盘上的信息并没有发生相应的改变。


读到这里,哎,你可能会想到,我一个棋盘也可以搞定呀!非雷用#,雷用&,然后用数字1,2,3... 来统计周围雷的数量就可以了,谁说过一定要用01来代表非雷与雷。没错,这种办法也可以,博主也期待你们去尝试一下,但是这样做棋盘上既有雷和非雷的信息,还有排查出雷的个数信息,就比较混杂,但不够方便!



1.2.2 ⽂件结构设计

当我们去写一个游戏,设计一个游戏时,我们可以采用分文件的形式来写:

1   test.c //⽂件中写游戏的测试逻辑
2   game.c //⽂件中写游戏中函数的实现等
3   game.h //⽂件中写游戏需要的数据类型和函数声明等

举个例子:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

当然这个代码也可以执行起来:
在这里插入图片描述

二、扫雷游戏代码实现

通过上面的形式,我们把文件分成三个文件管理

 1. removal_of_mines.c
 2. game.c
 3. game.h

首先,我们一上来就要打印菜单给玩家看,我们可以选择do...while循环,而菜单通过函数封装,用menu()打印菜单,然后玩家输入,switch语句来辨认玩家的选择,玩与不玩,接下来,巧妙的地方来了,我们把玩家输入的选择作为do....while(intput)的循环条件,因为这样可以让玩家选择继续玩,或者退出!点击(猜数字小游戏的一步一步实现)的步骤一样

# define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("******************************************\n");
	printf("******************************************\n");
	printf("***********   1. 扫雷游戏启动!!  *******\n");
	printf("************  0. 不玩了,启动不了 ********\n");
	printf("******************************************\n");
	printf("******************************************\n");
}


int main()
{
	int input = 0;
	do               //因为我们一上来就是要打印菜单,因此我们选择do.....while语句
	{
		menu();//通过函数封装,用menu()打印菜单
		printf("请选择--->");
		scanf("%d", &input);//然后玩家输入
		switch (input)      //用switch分支选择选择玩与不玩
		{
		case 1:
			printf("扫雷游戏启动!!\n");
			game();
			break;
		case 0:
			printf("不玩了,启动不了!\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);//选择1继续循环,0退出,这也是采用do.....while语句的好处
	return 0;
}

接下来,我们要实现game(),我们刚才分析得出,创建两个数组,一个埋雷的棋盘,一个用来给用户看和猜的棋盘;

埋雷的棋盘:char mine[][]={0};
猜雷的棋盘:char player[][]={0};

到这里,我们是不是只要把9放进去就好了呢?但是这样不利于后面代码的维护,如果要改为16*16的棋盘呢?就要把整个程序的char mine[9][9]里的9改为16,一个一个的改,也可以,不过有点费力。如果代码很长要改的数量很多,有几个漏改的,代码也就会出错,因此为了以后代码的修改和长远的考虑,我们可以#define定义ROW(行)和COL(列),
也就是

#define ROW 9
#define COL 9
char mine[ROW][COL]={0};
char palyer[ROWS][COLS]={0};

但是这样九行就列真的可以了吗?哎,显然还不行,因为,前面我们分析了数组会越界,因此这里我们要定义11*11数组,那我们是可以加2:

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

因此数组创建为:

char mine[ROWS][COLS]={0};
char player[ROW]S[COLS]={0}

这个时候,数组的大小创建好了,接下来就是对数组初始化了,也就是给我们两个棋盘放我们的初始值,那我们就创建一个初始化函数吧!

InitBoard(player, ROWS, COLS);
void InitBoard(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] =*;
		}
	}
	
}

这样写也可以,但是我们要放字符0*,这样我们就要调用两个相同的函数,这样的话,就有点太繁琐了,如果我们调用一个函数,能同时打印;那就更好了,让代码来:

void InitBoard(char board[ROWS][COLS], int rows, int cols, int ret)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
	
}
InitBoard(mine, ROWS, COLS, '0');
InitBoard(player, ROWS, COLS, '*');

0*一起传过去字符‘0’代表该位置没有雷,字符*代表隐藏,让玩家来猜,初始化完了,我们得看看我们放的值有没有实现我们想要的效果,那我们来打印一下吧,打印我们得要printf函数吧!

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	printf("******************************************\n");

	int i = 0;
	for (i = 0; i <= col; i++)
	{
		printf(" %d ", i);
	}
	printf("\n");
	for (i = 1; i <= col; i++)
	{
		printf(" %d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", board[i][j]);
		}
		printf("\n");
	}
	printf("******************************************\n");

}

请添加图片描述
接下来就是埋地雷了;使用rand()函数(猜数字小游戏的一步一步实现有讲解),随机生成坐标,但是我们的坐标要合法,x 的范围必须在row的范围内,y也同样如此,为了避免重复埋雷,我们要加上if判断语句;

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置10个雷
	//⽣成随机的坐标,布置雷
	int count = EASY_COUNT;//EASY_COUNT是设置雷的个数
	while (count)
	{
		int x = rand() % row + 1;//1到9
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

打印雷盘看看是否埋好雷了:
在这里插入图片描述

此时此刻,我们的雷布置好了,接下来我们要排查雷了;排查雷我们要排查的位置是里面9*9的位置,也就是(x >= 1 && x <= row && y >= 1 && y <= col)
在这些合法的位置排查雷,

在这里插入图片描述
(一共10个雷,没排完了71个位置,继续循环,排完了71个位置,也排赢了)
如果mine[x][y] == '1',也就是点中雷了,游戏结束,然后打印雷的地图给玩家看。
如果该位置不是雷,那么就统计该坐标周围的雷,也就是八个方位。我们用
GetMineCount来统计周围雷的个数

void FindMine(char mine[ROWS][COLS], char player[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)//一共10个雷,没排完了71个位置,继续循环
	{
		printf("请输入要排查的坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有⼏个雷
				int count = GetMineCount(mine, x, y);
				player[x][y] = count + '0';
				DisplayBoard(player, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标⾮法,重新输⼊\n");
		}
	}
	if (win == row * col - EASY_COUNT)//一共10个雷,排完了71个位置,也排赢了
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

利用GetMineCount统计雷的个数,怎么统计呢?由于我们用的是字符‘0’和‘1’来存储,怎么把字符统计起来,转换成整型数字呢?
小知识来啦:
字符:‘1’ -1==‘0’‘2’-1==‘1’‘3’-2==’1‘

字符1的ASCII是49,字符0的ASCII是48,两相减就是数字1了,在C语言中,当字符‘0’以%c字符的形式打印,打印出来的字符0和数字0一样的,以整形的形式打印出来的是48,也就是他的ASCII值。
在这里插入图片描述
我们将八个方位的字符统计起来再减去字符’0‘,算出来的值就是我们的雷的个数。

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

在这里插入图片描述

源码如下:

removal_of_mines.c

# define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void game()
{
	char mine[ROWS][COLS];
	char player[ROWS][COLS];

	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(player, ROWS, COLS, '*');

	SetMine(mine, ROW, COL);

	DisplayBoard(player, ROW, COL);

	FindMine(mine, player, ROW, COL);
}

void menu()
{
	printf("******************************************\n");
	printf("******************************************\n");
	printf("***********   1. 扫雷游戏启动!!  *******\n");
	printf("************  0. 不玩了,启动不了 ********\n");
	printf("******************************************\n");
	printf("******************************************\n");
}


int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do               //因为我们一上来就是要打印菜单,因此我们选择do.....while语句
	{
		menu();//通过函数封装,用menu()打印菜单
		printf("请选择--->");
		scanf("%d", &input);//然后玩家输入
		switch (input)      //用switch分支选择选择玩与不玩
		{
		case 1:
			printf("扫雷游戏启动!!\n");
			game();
			break;
		case 0:
			printf("不玩了,启动不了!\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);//选择1继续循环,0退出,这也是采用do.....while语句的好处
	return 0;

game.c

# define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void InitBoard(char board[ROWS][COLS], int rows, int cols, int ret)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
	
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	printf("******************************************\n");

	int i = 0;
	for (i = 0; i <= col; i++)
	{
		printf(" %d ", i);
	}
	printf("\n");
	for (i = 1; i <= col; i++)
	{
		printf(" %d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", board[i][j]);
		}
		printf("\n");
	}
	printf("******************************************\n");

}

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置10个雷
	//⽣成随机的坐标,布置雷
	int count = EASY_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--;
		}
	}
}

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

void FindMine(char mine[ROWS][COLS], char player[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 (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有⼏个雷
				int count = GetMineCount(mine, x, y);
				player[x][y] = count + '0';
				DisplayBoard(player, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标⾮法,重新输⼊\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

game.h

# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#define EASY_COUNT 10

#define ROW 9 
#define COL 9

#define ROWS ROW+9
#define COLS COL+9

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char player[ROWS][COLS], int row, int col);

总结

好啦!扫雷简易版的小游戏到这里就完了,注:永远不要害怕每一次失败,要勇于尝试,看过千遍万遍,不过于自己动手做几遍!
感谢您的观看,如果喜欢的话,请点个赞。如果文章有错误,我不胜感激,你可以指出,我不胜感激,让我们共同学习和交流!

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

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

相关文章

时序分解 | Matlab实现EMD经验模态分解时间序列信号分解

时序分解 | Matlab实现EMD经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现EMD经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现EMD经验模态分解时间序列信号分解 Matlab语言 算法新颖小众&#xff0c;用的人很少&#xf…

面试10000次依然会问的【ReentrantLock】,你还不会?

引言 在并发编程的世界中&#xff0c;ReentrantLock扮演着至关重要的角色。它是一个实现了重入特性的互斥锁&#xff0c;提供了比synchronized关键字更加灵活的锁定机制。ReentrantLock属于java.util.concurrent.locks包&#xff0c;是Java并发API的一部分。 与传统的synchro…

如何使用CodeceptJS、Playwright和GitHub Actions构建端到端测试流水线

介绍 端到端测试是软件开发的一个重要方面&#xff0c;因为它确保系统的所有组件都能正确运行。CodeceptJS是一个高效且强大的端到端自动化框架&#xff0c;与Playwright 结合使用时&#xff0c;它成为自动化Web、移动甚至桌面 (Electron.js) 应用程序比较好用的工具。 在本文中…

2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python

这里以鞠婧祎的个人主页为demo https://www.douyin.com/user/MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz 【2023-11-4 23:02:52 星期六】可能后面随着XX的调整, 方法不再适用, 请注意 找到接口 找到https://www.douyin.com/aweme/v1/web/…

rust入门基础案例:猜数字游戏

案例出处是《Rust权威指南》&#xff0c;书中有更加详细的解释。从这个例子中&#xff0c;我们可以了解到 rust 的两个操作&#xff1a; 如何从控制台读取用户输入rust 如何生成随机数 代码格式化 编译器可在保存时对代码做格式化处理&#xff0c;底层调用 rustfmt 来实现&a…

【gpt redis】原理篇

用的黑马程序员redis课程的目录&#xff0c;但是不想听讲了。后续都是用gpt文档获取的。 1.课程介绍(Av766995956,P145) 2.Redis数据结构-动态字符串(Av766995956,P146) sds 1M是个界限 其实他是个由c语言实现的结构体 有这么几个参数 len alloc flag char[] len是实际长度 …

【漏洞复现】Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、深度利用1、反弹Shell 说明内容漏洞编号CVE-2017-5645漏洞名称Log4j Server …

Python 中的 Gzip 解压

我们将介绍Python中的gzip解压。 我们还将介绍如何使用 gzip 解压缩来解压缩压缩内容。 Python 中的 Gzip 解压 Python 中构建了许多用于压缩和解压缩目的的库&#xff0c;但我们将介绍 Gzip 库。 它是一种流行的数据压缩工具。 我们可以使用 gzip 通过将数据编码为人类无法读…

字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)

前言 趁机把LCD 1602的实验完成了&#xff0c;那个电路图有几个地方没弄懂&#xff0c;但是去掉也没有报错&#xff0c;就没管了。 LCD1602_百度百科 (baidu.com)https://baike.baidu.com/item/LCD1602/6014393?frge_ala LCD1602液晶显示屏通过电压来改变填充在两块平行板之…

Python算法例5 x的n次幂

1. 问题描述 实现函数Pow&#xff08;x&#xff0c;n&#xff09;&#xff0c;计算并返回x的n次幂。 2. 问题示例 Pow&#xff08;2.1&#xff0c;2&#xff09;4.41&#xff1b;Pow&#xff08;0&#xff0c;1&#xff09;0&#xff1b;Pow&#xff08;1&#xff0c;0&…

C++——类和对象之运算符重载

运算符重载 本章思维导图&#xff1a; 注&#xff1a;本章思维导图对应的xmind文件和.png文件都已同步导入至”资源“ 文章目录 运算符重载[toc] 1. 运算符重载的意义2. 函数的声明2.1 声明运算符重载的注意事项 3. 函数的调用4. const成员函数4.1 const成员函数的声明4.2 注意…

C++查漏补缺与新标准(C++20,C++17,C++11)02 C++快速回顾(二)

本内容参考C20高级编程 C风格的数组 //形如 int myArray[3]{2};一个比较新颖的获取C风格数组大小的函数std::size()&#xff0c;返回size_t类型&#xff08;在中定义的无符号整数&#xff09; #include <iostream> using namespace std;int main() {int myArray[5] {…

UML---用例图

UML–用例图 0.用例图简介 用例图是一种UML&#xff08;统一建模语言&#xff09;的图形化表示方法&#xff0c;用于描述系统的功能和行为。它可以帮助系统分析师和开发人员理解系统的需求&#xff0c;用例图由参与者、用例和它们之间的关系组成。 1.用例图的组成部分 系统…

【RabbitMQ】RabbitMQ 消息的可靠性 —— 生产者和消费者消息的确认,消息的持久化以及消费失败的重试机制

文章目录 前言&#xff1a;消息的可靠性问题一、生产者消息的确认1.1 生产者确认机制1.2 实现生产者消息的确认1.3 验证生产者消息的确认 二、消息的持久化2.1 演示消息的丢失2.2 声明持久化的交换机和队列2.3 发送持久化的消息 三、消费者消息的确认3.1 配置消费者消息确认3.2…

订单业务和系统设计(一)

一、背景简介 订单其实很常见&#xff0c;在电商购物、外卖点餐、手机话费充值等生活场景中&#xff0c;都能见到它的影子。那么&#xff0c;一笔订单的交易过程是什么样子的呢&#xff1f;文章尝试从订单业务架构和产品功能流程&#xff0c;描述对订单的理解。 二、订单业务…

飞书开发学习笔记(二)-云文档简单开发练习

飞书开发学习笔记(二)-云文档简单开发练习 一.云文档飞书开发环境API 首先还是进入开放平台 飞书开放平台&#xff1a;https://open.feishu.cn/app?langzh-CN 云文档相关API都在“云文档”目录中&#xff0c;之下又有"云空间",“文档”&#xff0c;“电子表格”&a…

LLM系列 | 26:阿里千问Qwen模型解读、本地部署

引言 简介 预训练 数据来源 预处理 分词 模型设计 外推能力 模型训练 实验结果 部署实测 对齐 监督微调(SFT) RM 模型 强化学习 对齐结果(自动和人工评估) 自动评估 人工评估 部署实测 总结 引言 人生自是有情痴&#xff0c;此恨不关风与月。 ​ 今天这篇小…

从零开始:开发你的第一个抖音小程序

抖音小程序提供了独特的机会&#xff0c;能够让你将自己的创意和内容传播给数百万的抖音用户。本文将带你走一趟开发抖音小程序的旅程&#xff0c;从零开始&#xff0c;无需编程经验。你将了解到如何准备开发环境、创建你的第一个小程序&#xff0c;以及如何将它发布到抖音平台…

辅助驾驶功能开发-功能规范篇(22)-9-L2级辅助驾驶方案功能规范

1.3.7.2 行人、骑行者(横向)AEB 系统 1.3.7.2.1 状态机 1.3.7.2.2 信号需求列表 同 1.3.2.1.2。 1.3.7.2.3 系统开启关闭 同 1.3.2.1.3。 触发横向 AEB 的目标包括横向运动的行人、骑行者(包括自行车、摩托车、电瓶车和平衡车上的行人)。 1.3.7.2.4 制动预填充 制动系统…

Global-aware siamese network for change detection on remote sensing images

遥感图像中的变化检测是以有效的方式识别观测变化的最重要的技术选择之一。CD具有广泛的应用&#xff0c;如土地利用调查、城市规划、环境监测和灾害测绘。然而&#xff0c;频繁出现的类不平衡问题给变化检测应用带来了巨大的挑战。为了解决这个问题&#xff0c;我们开发了一种…