扫雷游戏的设计——大型程序的设计思路

news2024/11/20 20:34:08

目录

    🌺了解扫雷游戏的作用原理并梳理思路

    🌺扫雷游戏前期部分完善

    🌷文件的创建

    🌷创建菜单,完善主函数

    🌳代码呈现:

    🌺扫雷游戏主题内容

    🌵第一步初始化棋盘 

     🌵第二步打印棋盘

    🌵第三步设置雷的位置

    🌵第四步排查雷的位置

    🌵代码呈现: 

    🌸大家好,今天要给大家带来的博客主题是——扫雷游戏。相信大家对于扫雷游戏一定都不陌生,但是对于C语言的新手们对其可以说是跃跃欲试但又无从下手,那么我们今天就带领大家亲自实现一下扫雷游戏吧!(本篇博客对于逻辑思维等方面的要求相比与之前的简单游戏设计略高,请大家耐心观看)

    🌺了解扫雷游戏的作用原理并梳理思路

    🌸老规矩我们还是先借鉴一下大佬们写好的扫雷的模板,来观察一下,我们想要设计的扫雷究竟是一个什么样的游戏。(明确游戏细节)

     🌸就像我们在上图中看到的那样,最基础版本的扫雷游戏由 9 * 9 规格大小的方格为棋盘,在 9 * 9 大小的棋盘中随机布置着数量确定的雷。我们点击任意一个方块,如果是雷,扫雷失败游戏结束。如果不是雷则显示周围雷的数量便于玩家进一步判断雷的位置。

    🌸对于游戏棋盘的打印我们可能并不陌生,之前我们在博客中说到过的三子棋游戏的实现就建立了一个棋盘。这个能不能和三子棋的棋盘一样?也是用一个二维数组吗?

    🌸没错,对于扫雷游戏棋盘的打印也确实和我们想的一样需要采用一个二维数组。那么接下来我们就来进一步对于游戏设计思路进行进一步构建。

    🌸先抛开期盼打印不说我们想怎样判断周围雷的个数呢?我们可能会想:先将棋盘上的所有元素全部初始化为0,然后将布置的雷的位置改变为1,然后对周围8个坐标进行一次求和得到中间位置的坐标类的个数。道理是没错,但是你有没有发现,假如四周只有一个雷的话,你计算求得的1到底是原先的雷还是你统计的雷的个数呢?而这给怎样区分呢?

 

    🌸既然此路不通,那么我们就先来换一条路继续摸索前进,对于刚开始还没有进行扫雷的时候棋盘上的数据都是隐藏起来的,都会展示成一个特殊符号就比如方块,星号之类的。那么我们是不是应该使用一个字符型数组去设计并初始化我们的棋盘呢?既然我们上面想到的在布置雷的棋盘中进行统计雷的个数无法实现的话,我们是不是可以设计两个棋盘,一个棋盘布置雷,另一个棋盘统计并打印雷的情况呢?这确实是一个很好的思路。我们不妨先来试试看。

 

    🌸但是接着来想,我们的游戏棋盘按照道理来说应该是 9 * 9 规格的,但是只设计一个 9 * 9 的二维数组的话我们统计雷的个数的时候应该怎么办呢?到达边界的时候会产生数组越界的吧?难道每一次到达边界都要进行数组越界判断吗?这未免也太过麻烦了吧?(统计雷的个数的时候是对周围八个方块进行判断,但是数组边界处下方或上左右方不属于数组的内容,如果强行进行访问的话会产生数组越界。)

    🌸针对我们上面的问题,我们就需要按照一定的规格扩大我们扫雷游戏设计的棋盘了。想象一下,假如我们将 9 * 9 的游戏棋盘初始化为 11 * 11 的规格的时候那么只进行 9 * 9 规格的访问的时候是不是就不需要考虑数组越界的问题了呢?

 

    🌸经过上面的思考之后,我们已经深度了解了扫雷游戏设计的精髓,那么接下来我们就可以正式着手于我们扫雷游戏的实现了。

    🌺扫雷游戏前期部分完善

    🌷文件的创建

    🌸我们还是先创建三个文件,一个test.c文件,一个game.c文件,一个game.h文件。进行程序化的分装处理。

    🌷创建菜单,完善主函数

    🌸之后我们要做的第一步操作大致和三子棋的第一步操作一样,我们要先打印出一个游戏选择的菜单,可以供玩家进行多方面的选择,

     🌸同时完善主函数中的游戏规则与游戏设置相关的说明操作,并完善主函数至可以重复进行选择。

    🌳代码呈现:

//test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

void test()
{
	int input;
	do
	{
		meun();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			break;
		case 2:
			introduction();
			break;
		case 3:
			gameset();
			break;
		case 0:
			printf("退出游戏。");
			break;
		default:
			printf("选择错误,请重新选择:");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}
//game.h

#pragma once
#include<stdio.h>

//打印游戏菜单
void meun();
//打印游戏说明
void introduction();
//打印游戏设置说明
void gameset();
//game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

void meun()
{
	printf("**************************************\n");
	printf("***                                ***\n");
	printf("***  1.开始游戏        2.游戏规则  ***\n");
	printf("***                                ***\n");
	printf("***  3.游戏设置        0.退出游戏  ***\n");
	printf("***                                ***\n");
	printf("**************************************\n");
}

void introduction()
{
	printf("**************************************\n");
	printf("***  扫雷游戏规则:                ***\n");
	printf("***      玩家需要在尽量短的时间内  ***\n");
	printf("***      找出隐藏起来的雷。        ***\n");
	printf("***      如果四周有雷,就会打印雷  ***\n");
	printf("***      的个数,以供玩家参考并通  ***\n");
	printf("***      关游戏。                  ***\n");
	printf("**************************************\n");
}

void gameset()
{
	printf("**************************************\n");
	printf("***  扫雷游戏设置介绍:            ***\n");
	printf("***      玩家需要亲自前往game.h头  ***\n");
	printf("***      文件中更改我们的宏定义,  ***\n");
	printf("***      进而更改至自己想要的难度  ***\n");
	printf("**************************************\n");
}

    🌸经过我们上面的处理操作那么接下来的任务就是我们正式的扫雷游戏的设计了。

    🌺扫雷游戏主题内容

    🌸我们可以通过上面的执行效果可以看出当我们选择1.开始游戏的时候,只是简简单单的打印一个开始游戏是绝对不行的,所以我们应该将开始游戏的打印更换为一个相对独立的 game 函数,以便于我们想要开始游戏的时候可以进一步执行关于游戏开始的相关操作。

    🌵第一步初始化棋盘 

    🌸之后我们就可以开始对我们最开始的思考进行实现了。首先我们先来创建一个 11 * 11 的字符型数组。为了使我们的程序具有更高的利用性,即可以实现不同规格的扫雷游戏。那么我们这里就需要在 game.h 中设置一个宏定义,使得我们想要更改游戏大小的时候只需要在宏定义中修改即可。

 

    🌸上图中 COLS 和 ROWS 为我们规格大小为 11 * 11 的数组的行数和列数。COL 和 ROW 是我们之后将要在屏幕打印出来的游戏的界面规格大小。

    🌸等我们创建好两个数组的时候我们要做的第一步就是我们数组内容的初始化。重新将思路拉回我们对于两个不同棋盘的思考,首先我们 set 数组的作用是在棋盘上设置我们的雷,而 show 数组的作用是在棋盘上展示我们已经周围雷的信息。我们依旧按照最开始的思路将 set 棋盘初始化为全0,之后在一个坐标上布置一个雷那么就改变相应位置上的 0 改为 1 。之后我们的 show 棋盘初始化为全 * ,便于我们后面输入一个坐标就显示一个坐标上的信息。

    🌸但是我们会发现我们两个数组中初始化的内容并不完全相同,我们的预期结果是将 set 数组中的数据初始化为字符0,将 show 中的数据初始化为字符 * 。难道得写两次初始化函数吗?其实并不需要,仔细思考之后就会发现,假如我们将我们想要初始化的字符也作为一个参数传递给我们的初始化函数的话,那么我们完全可以将初始化函数的赋值步骤更改为 board [ i ] [ j ] = init(传入函数的字符),如下:

    🌸经过这样一个简单的步骤之后我们就已经将我们的两个数组中的内容全部初始化完毕了,那么接下来为了验证我们的操作达到了预期的效果,我们可以在写一个打印函数,用来打印我们初始化完成的两个数组。

     🌵第二步打印棋盘

    🌸这一步我们就开始打印我们的棋盘,你可能会想打印棋盘有什么难的?不就是一个循环嵌套之后就搞定了的事吗?千万不要轻敌,还记得我们的数组是扩大过之后了的吗?那我们在屏幕上要打印出的棋盘是扩大之后的呢?还是原本扩大之前的呢?答案当然是扩大之前的。所以我们在建立这个函数的同时,在函数传参过程中需要特别进行注意:要传入的行数和列数是我们上面定义的 COL 和 ROW 并不是 COLS 和 ROWS 。在搞清楚这一点之后我们就可以开始着手我们的棋盘的打印了。

    🌸但是需要特别注意的是:我们棋盘的打印不应该从0开始的了而是,从1开始到我们的 ROW 和 COL 结束这是因为我们第一行是为了放置数组越界进行的预处理,如果依旧从0开始进行操作的话,我们之前的努力都会前功尽弃了。

    🌸当我们设计好打印函数之后的打印效果是这样的,但是我们要想让我们一下子找到相应的坐标可能有些困难,一个游戏要想要拥有一定的市场那么就一定要学会为玩家所考虑。那么我们需要在第一行和第一列的位置上加上一排提示行和列的数字提示以便于玩家可以更好的进行判断,想要在那个坐标的位置上进行排雷操作。并且,为了使我们的条例更加清晰,我们还可以适当加上分割符使得我们的游戏界面更加整洁。那么我们修改之后的打印函数的打印效果如下:

  

 

     🌸但是实际上我们只需要打印出我们的 show 数组就可以了,因为我们 set 数组中包含着我们雷的位置,假如一下子就把答案公布出去,那多没有意思是吧?那么我们接着进行下一步操作。

    🌵第三步设置雷的位置

    🌸同样的道理我们创建一个 Setbomb 函数在 game.h 中声明,再到 game.c中实现。

    🌸想要生成雷那么就得先生成一个随机的坐标(两个随机数),之后改写 set 中所对应的坐标上的元素。所以这一步的核心就在于——随机生成两个数字,确定雷的个数。就像我们所说的,我们到现在还不知道雷的个数呀?别忘了,雷是我们自己设置的。我们可以自己定义雷的个数呀!

    🌸和我们定义函数和列数相同,对于我们雷的个数也可以在 game.h 头文件中定义一个宏,用来作为我们雷的个数,如果我们产生了一个坐标符合条件就进行改写并使 count - - 。直到我们的 count 的值为0时说明我们的雷已经布置完毕。这就是我们设置雷函数的关键思想。

 

     🌸那么我们布置雷的函数也已经完成了。那么我们就可以开始我们下一步骤排查雷的操作了。

    🌵第四步排查雷的位置

    🌸这是我们扫雷游戏工程的最后一步操作,我们需要对上一步我们设置好的雷进行修改与排查。即我们输入一定的坐标可以打印出我们想要的信息情况。(如果是雷,那么游戏结束,如果不是雷的话,那么就打印周围雷的状况便于下一次继续进行排雷操作)

    🌸同样的我们先创建一个 Findbomb 函数进行大致的判断。首先在想象中我们这个函数的功能是这样的,我们想要输入一个坐标,之后系统会自动对该处是否为雷进行判断。那么当我们正好选择雷时可以直接跳出循环,结束游戏,但是如果不是呢?我们就需要以这个坐标为中心进行排查周围八个坐标,找出雷的个数,并将雷的个数打印在当前的坐标位置上。那么应该怎么将周围的情况打印出来并显示在当前所选择的坐标位置上呢?

 

    🌸这个时候我们就需要将我们的注意力重新转向我们最初设置的两个数组上了。我们设置雷的数组中刚开始我们将我们所有的坐标初始化为字符0,将布置好的雷设置为了字符1。拿我们上面的图片进行举例:在红色方括号中的最中心处应该统计得到数字为2。统计得到的数字我们可以对周围的八个坐标依次进行排查得到,但是应该怎么将数字2转换成字符2呢?

    🌸仔细思考的小伙伴们可以发现,在我们的ASCII码表中字符0和数字0之间的差值为48,字符1和数字1之间的差值也是48.因此我们就可以利用这个规律给我们统计后的数字加上48,得到的也就是我们转换成字符之后的ASCII码值。这样我们就可以直接用于赋值了。接下来我们就将我们的想象付出实践。

    🌸最后一步操作就是对坐标进行合法性判断并设置循环的次数。同样的,我们可以再次设置一个变量 win 我们可以将 win 初始为0。当我们对一个坐标进行改写完毕之后就对 win 进行 ++ 操作,最后直到 win 等于我们的总格数减去雷的数量的时候就跳出循环。游戏排雷成功的判断也是同样的道理:在游戏的末尾对 win 进行判断,当 win 等于总格数减去雷的数量的时候就说明我们已经将全部的雷都排除完毕了。那么我们也就取得了游戏胜利。游戏运行如下:

    🌸为了测试的简便性我们将雷的个数更新为80,并在设置好雷之后打印出雷的位置,以便我们使用。

 

    🌵代码呈现: 

//test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

void game()
{
	char set[COLS][ROWS] = { 0 };
	char show[COLS][ROWS] = { 0 };

	//初始化棋盘
	Initboard(set, COLS, ROWS,'0');
	Initboard(show, COLS, ROWS,'*');
	//打印棋盘
	Printboard(show, COL, ROW);
	//设置炸弹
	Setbomb(set, COL, ROW);
	//排查炸弹
	Findbomb(set, show, COL, ROW);
}

void test()
{
	int input;
	do
	{
		meun();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 2:
			introduction();
			break;
		case 3:
			gameset();
			break;
		case 0:
			printf("退出游戏。");
			break;
		default:
			printf("选择错误,请重新选择:");
			break;
		}
	} while (input);
}

int main()
{
	srand((unsigned int)time(NULL));
	test();
	return 0;
}

 

//game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>

#define COL 9     //实际游戏的列数
#define ROW 9     //实际游戏的行数

#define COLS COL+2   //进行操作的游戏列数
#define ROWS ROW+2   //进行操作的游戏行数

#define COUNT 10    //雷的个数

//打印游戏菜单
void meun();
//打印游戏说明
void introduction();
//打印游戏设置说明
void gameset();
//初始化棋盘
void Initboard(char board[COLS][ROWS],int cols,int rows,char set);
//打印棋盘
void Printboard(char board[COLS][ROWS], int col, int row);
//设置炸弹
void Setbomb(char board[COLS][ROWS],int col,int row);
//排查炸弹
void Findbomb(char set[COLS][ROWS], char show[COLS][ROWS], int col, int row);
//game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

void meun()
{
	printf("**************************************\n");
	printf("***                                ***\n");
	printf("***  1.开始游戏        2.游戏规则  ***\n");
	printf("***                                ***\n");
	printf("***  3.游戏设置        0.退出游戏  ***\n");
	printf("***                                ***\n");
	printf("**************************************\n");
}

void introduction()
{
	printf("**************************************\n");
	printf("***  扫雷游戏规则:                ***\n");
	printf("***      玩家需要在尽量短的时间内  ***\n");
	printf("***      找出隐藏起来的雷。        ***\n");
	printf("***      如果四周有雷,就会打印雷  ***\n");
	printf("***      的个数,以供玩家参考并通  ***\n");
	printf("***      关游戏。                  ***\n");
	printf("**************************************\n");
}

void gameset()
{
	printf("**************************************\n");
	printf("***  扫雷游戏设置介绍:            ***\n");
	printf("***      玩家需要亲自前往game.h头  ***\n");
	printf("***      文件中更改我们的宏定义,  ***\n");
	printf("***      进而更改至自己想要的难度  ***\n");
	printf("**************************************\n");
}

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

void Printboard(char board[COLS][ROWS], int col, int row)
{
	int i = 0;
	int j = 0;
	printf("------扫雷游戏------\n");
	for (i = 0; i <= COL; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= col; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= row; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("------扫雷游戏------\n");
}

void Setbomb(char board[COLS][ROWS], int col, int row)
{
	int count = COUNT;
	int i = 0;
	while (count)
	{
		int x = rand() % col + 1;
		int y = rand() % row + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

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

void Findbomb(char set[COLS][ROWS], char show[COLS][ROWS], int col, int row)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row * col - COUNT))
	{
		printf("请输入想要检查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("该坐标已被排查。");
				continue;
			}
			if (set[x][y] == '1')
			{
				system("cls");
				printf("很遗憾,你被炸死了\n");
				Printboard(set, COL, ROW);
				break;
			}
			else
			{
				system("cls");
				int n= get_mine_count(set, x, y);
				show[x][y] = n + 48;
				Printboard(show, COL, ROW);
				win++;
			}
		}
	}
	if (win == (row * col - COUNT))
	{
		printf("恭喜你,排雷成功。\n");
		Printboard(set, COL, ROW);
	}
}

    🌸经过我们上面步骤中的操作,我们的扫雷游戏也就初步完成了,怎么样是不是很简单?快去试试吧!感谢您的观看,祝您天天开心。

 

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

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

相关文章

CSDN博客运营团队2022年H2总结

前言 在2022年的年中&#xff0c;我们对外公布了我们的年中盘点&#xff1a;2022年上半年部分团队的总结 我们希望尽可能的公开我们的工作内容&#xff0c;让更多人可以了解CSDN的变化&#xff0c;同时也希望收到大家的真实反馈&#xff1a;你期待的新功能上线了吗&#xff1…

创建react项目

1.安装Node.js:官网Node.js下载 2.检查安装 3.命令安装&#xff1a;cnpm:npm install -g cnpm --registryhttps://registry.npm.taobao.org(cnpm比较快) 4.查cnpm安装是否成功&#xff1a;命令&#xff1a;cnpm -v 5.react脚手架安装命令&#xff1a;cnpm i -g create-react…

深度!用“极速统一”,开启金融行业数据分析新范式

作者&#xff1a;51CTO 赵立京 数据库作为金融信息系统的核心基础设施&#xff0c;历经数十年发展&#xff0c;为金融行业转型升级提供了有力的技术支撑。同时&#xff0c; 以银行为代表的金融行业是数据库销售额占比最高的市场&#xff0c;也是对数据库技术依赖度最高、要求最…

写出更现代化的Python代码:聊聊 Type Hint

Type Hint是 Python 3.5 新增的支持&#xff0c;中文可以译为 类型提示。屏幕前的你或许听过&#xff0c;又或许没有。所以今天&#xff0c;让我们一起了解了解。本文基于 Python 3.10.4&#xff0c;部分代码需要在 Python 3.10.0 及以上运行&#xff0c;原因在后续文章中会有说…

kali系统渗透window实现屏幕监控

1安装 VMware15.5,kali系统&#xff0c;桥接模式 链接&#xff1a;https://pan.baidu.com/s/1Y3ftPnzCj0NaMQNDAhIUjw 提取码&#xff1a;3k2w 2修改sshd_config vim /etc/ssh/sshd_config 去掉这两行注释 完成后保存 esc : wq! 重启SSH服务 /etc/init.d/ssh restart Fina…

一文看懂Linux内核页缓存(Page Cache)

我们知道文件一般存放在硬盘&#xff08;机械硬盘或固态硬盘&#xff09;中&#xff0c;CPU 并不能直接访问硬盘中的数据&#xff0c;而是需要先将硬盘中的数据读入到内存中&#xff0c;然后才能被 CPU 访问。 由于读写硬盘的速度比读写内存要慢很多&#xff08;DDR4 内存读写…

C语言期末集训3(大一,超基础,小猫猫大课堂配套练习)——循环结构

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

[第十二届蓝桥杯/java/算法]F——时间显示

&#x1f9d1;‍&#x1f393;个人介绍&#xff1a;大二软件生&#xff0c;现学JAVA、Linux、MySQL、算法 &#x1f4bb;博客主页&#xff1a;渡过晚枫渡过晚枫 &#x1f453;系列专栏&#xff1a;[编程神域 C语言]&#xff0c;[java/初学者]&#xff0c;[蓝桥杯] &#x1f4d…

五步法搞定BI业务需求梳理

五步法搞定BI业务需求梳理。高手就是把复杂的事情简单化&#xff0c;简单的东西重复做、认真做。 五步法是哪五步 第一&#xff0c; 明确用户。商业智能BI项目的规划一切以用户需求为导向&#xff0c;首先需要明确各层次的需求用户。用户都不能明确&#xff0c;调研的入口就没…

前端工程化与 webpack:webpack 的基本使用

1. 什么是 webpack 概念&#xff1a;webpack 是前端项目工程化的具体解决方案。 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览器端 JavaScript 的兼容性、性 能优化等强大的功能。 好处&#xff1a;让程序员把工作的重心放…

自动控制原理笔记-信号流图-Mason公式-控制系统的传递函数

目录 信号流图与结构图的比较&#xff1a; 掌握结构图与信号流图的转换&#xff1a; Mason增益公式&#xff1a; 式子详解&#xff1a; 使用Mason增益公式步骤&#xff1a; 使用Mason增益公式的例题&#xff1a; ​编辑 控制系统的传递函数 &#xff1a; 开环传递函数…

当红齐天再捧“绽放杯”金奖:全流程算力网络夯实元宇宙“底座”

近日&#xff0c;由工信部主办的第五届“绽放杯”5G应用征集大赛在深圳落幕。本届大赛以“5G赋能数字化&#xff0c;扬帆助力新征程 ”为主题&#xff0c;超7000家单位的2.8万个项目参赛&#xff0c;共享5G赋能实体经济的新技术、新成果。英特尔联合行业合作伙伴再获佳绩。 其…

java ssm热带水果网上商城系统--

目录 第一章 绪论 5 1.1 研究背景 5 1.2系统研究现状 5 1.3 系统实现的功能 6 1.4系统实现的特点 6 1.5 本文的组织结构 6 第二章开发技术与环境配置 7 2.1 Java语言简介 7 2.2JSP技术 8 2.3 MySQL环境配置 8 2.4 MyEclipse环境配置 9 2.5 mysql数据库介绍 9 2.6 B/S架构 9 第三…

Matter理论介绍-通用-1-06:桥接设备-其他功能

【源码、文档、软件、硬件、技术交流、技术支持&#xff0c;入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取&#xff0c;免安装&#xff0c;解压即用】 持续更新中&#xff0c;欢迎关注&#xff01; 一、桥接设备的功能更新 桥接设备能够独立与桥接器进行软…

一文带你快速搭建框架(最全MyBatis笔记修改篇)

前言&#xff1a;最近收到小伙伴们的私信说这一篇有点问题&#xff0c;因为我是用Typora搬运笔记没考虑到这个问题&#xff0c;感谢这个小伙伴反映的问题~ 目录 一.概述 1.简介 2.maven构建 二.相关概念 1.Mapper接口 2.ORM思想 三.映射配置文件 1.文件结构 2.映射配…

31. 填充和步幅的代码实现

1. 填充 我们创建一个高度和宽度为3的二维卷积层&#xff0c;并在所有侧边填充1个像素。给定高度和宽度为8的输入&#xff0c;则输出的高度和宽度也是8。 import torch from torch import nn# 为了方便起见&#xff0c;我们定义了一个计算卷积层的函数。 # 此函数初始化卷积层…

互异数

这道题是实验舱举办的"编程一小时"千人马拉松竞赛的第三题! 目录 #C、互异数 题目描述 输入格式 输出格式 输入样例1 输出样例1 输入样例2 输出样例2 数据规模 思路: 1.最大互质数 2.互质数的数量 3.贪心策略 总代码: 总结: 题目链接: #C、互异数 题目…

Typora使用之在腾讯云建立远程图床【多图】

1 安装PicGo PicGo是一款功能非常强大的图床的工具&#xff0c;支持SM.MS、腾讯COS、GitHub图床、七牛云图床、Imgur图床、阿里云OSS等多种图床平台。 下载地址&#xff1a;https://github.com/Molunerfinn/PicGo/releases 一般安装PicGo-Setup-2.3.0-beta.7-ia32.exe。 可以选…

C++模板特化

前言 模板特化对函数和函数都可以使用。它的作用是以某一模板函数或某个模板类为例&#xff0c;大部分情况下需要写的函数或内容是一致的&#xff0c;但是有些特别情况&#xff0c;所以我们需要单独拎出来。 模板参数 模板参数可分为类型形参和非类型形参。 类型形参&#x…

消息中间件(消息队列)

简介 MQ&#xff08;message queue&#xff09;消息队列&#xff0c;也叫消息中间件。消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。它是类似于数据库一样需要…