C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)

news2024/11/15 13:49:34

 

目录

🚀0. 游戏介绍:

🐷 游戏规则

🛸雷诀八条

🚀1. 开发环境及框架:

🚀2. 游戏具体功能分析实现:

🐷2.1 棋盘

🐷2.2 棋盘初始化 init_Board;

         🐷2.2 棋盘打印 show_board;

         🐷2.3 布置雷 set_mine

🐷2.4 排查雷及判断输赢 fine_mine

🐷2.5 按规则展开static void explosion_spread

🐷2.6 获取周围雷的个数get_mine_count

🐷2.7 标记雷mark_mine

🚀3. 游戏完整代码:

🛰️MineSweeper.h——头文件

🛰️MineSweeper.c——源文件

🛰️MineSweepertest.c

🚀3. 游戏效果图:


🚀0. 游戏介绍:

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

🐷 游戏规则

在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。

 

🛸雷诀八条

  • 第一条:基本定式不要忘,现场推理真够呛。
  • 第二条:鼠标点击不要快,稳定节奏把空开。
  • 第三条:顺手标雷不要惯,积累下来记录悬。
  • 第四条:无从下手不要愣,就近猜雷把心横。
  • 第五条:遇到猜雷不要怕,爆了脸上不留疤。
  • 第六条:猜雷猜错不要悔,哭天抢地也白费。
  • 第七条:碰上好局不要慌,紧盯局部慢扩张。
  • 第八条:痛失好局不要恨,既然有缘定有份。

🚀1. 开发环境及框架:

本人开发环境采用—VS2022,学会调试,参考文章调试规则,以及windows自带画图板

采取工程内多文件进行链接编译,包括:

  1. MineSweeper.h——头文件,建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件。
  2. MineSweeper.c——源文件,里边含各种函数的具体功能实现
  3. MineSweepertest.c——测试扫雷游戏的使用,包含主体运行,主函数等               

🚀2. 游戏具体功能分析实现:

🐷2.1 棋盘

如何定义初始化棋盘,便是需要解决的第一个问题

 可知棋盘用二维数组更便于表示:

	char show[ROWS][COLS];//展示棋盘
	char mine[ROWS][COLS];//雷盘
#define ROW 9
#define COL 9

定义了两个棋盘,分别用来保存布置雷的信息和排查雷的信息,这样就可以避免二者相互干扰或者相互覆盖;

同时,我们使用宏定义的标识符常量表示雷盘的大小以及雷的个数,想增加扫雷的难度的时候,我们只需要改动这里一次即可,增加了代码的可维护性

问题分析:

 

如图:当我们排查x位置时,如果x处不是雷,那么我们就会依次检查其周围8个坐标是否有雷,如果有,就会把周围雷的总数量显示在x位置处;但是当我们排查x位置时,我们发现, 数组排查雷时会发生越界,所以为了避免数组越界,我们就需要增加一系列限制条件,这样做无疑是比较麻烦的,所以有的大佬就想出了这样一种办法:在定义数组长度时我们直接在上下左右四个方向各多给一行的空间,并把这些空间中的数据初始化为非雷,这样,就轻松解决了数组越界的问题!

#define ROW 9
#define COL 9

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

🐷2.2 棋盘初始化 init_Board

    char show[ROWS][COLS];//展示棋盘
	char mine[ROWS][COLS];//雷盘

对实列化的展示棋盘,以及雷盘进行初始化

void init_Board(char show[ROWS][COLS], char mine[ROWS][COLS])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			show[i][j] =' ';
		}
	}
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			mine[i][j] = '0';
		}
	}
}

对于展示棋盘,由图可看出,初始化为空格 ' ' 表示最为恰当,而对于雷盘,为方便初始化为字符 '0'

🐷2.2 棋盘打印 show_board

对于,棋盘初始化完成,为方便操作,在展示棋盘的同时,添加标识行列,方便玩家操作,此时初始化为 11 的 show 棋盘,就可以展示其第一个作用,便于打印附上坐标。

void show_board(char show[ROWS][COLS])
{


	for (int i = 0; i <= ROW; ++i)
	{
		for (int j = 0; j <= COL; ++j)
		{
			if (j == 0)
			{
				printf(" %d |", i);
			}
			else if (i == 0)
			{
				printf(" %d |", j);
			}
			else
			{
				printf(" %c ", show[i][j]);
				if (j <= COL)
				{
					printf("|");
				}
			}
		}
		printf("\n");
		if (i < ROW)
		{
			int j = 0;
			for (j = 0; j <= COL; j++)
			{
				printf("---");
				if (j <= COL)
					printf("|");
			}
			printf("\n");
		}
	}
	printf("\n");

}

初始化棋盘完成,打印棋盘完成,此时便可以通过MineSweepertest.c进行测试,观察棋盘是否符合扫雷游戏棋盘

🐷2.3 布置雷 set_mine

为了便于修改游戏难度,设置雷数,因此我们使用#define在头文件MineSweeper.h——头文件定义全局标识符常量,用于初始化雷数

#define EASY_COUNT  10//雷数

注意事项:

  1.         布置雷首先需要生成随机的x ,y 两个坐标,而调用伪随机 rand 库函数需要配合 srand 根据 time 函数返回的时间戳生成,因此 srand 只需要调用一次即可。
  2.         注意控制随机数生成坐标的范围,同时判断此位置是否重复生成
void set_mine(char mine[ROWS][COLS])
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % ROW + 1;
		y = rand() % COL + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '*';
			count--;
		}
	}
}

🐷2.4 排查雷及判断输赢 fine_mine

  • 排查雷,需要获取坐标,检查坐标合法性,同时判断此坐标是否已经被排查
  • 给出输赢计数器,通过判断所排查位置个数减去雷的个数,判断游戏是否结束
  • 如果排查到雷,便游戏结束,同时展示雷盘,得知为何输
  • 如果未排查到雷,会根据规则进行展开,同时给出每个位置周围雷的个数
  • 排查位置之后,根据玩家输入判断是否需要标记
void fine_mine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	int x = 0;
	int y = 0;
	int win = 0; // 判段输赢计数器
	int* pw = &win;
	char ch = 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] == '*')
			{
				printf("很遗憾,被炸死了\n");
				show_board(mine); //炸死后,展示雷盘,的知为何死
				break;
			}
			else
			{
				if (show[x][y] == ' ' ||(show[x][y] == '!'))//判断是否重复排查
				{
					explosion_spread(mine, show, x, y, pw);//展开一片
					system("cls");// 清屏
					show_board(show);// 打印展示雷盘

					printf("需要标记雷的位置请输入y/Y,否则请按任意键->");
					while ((ch = getchar()) != '\n');  //清理缓冲区
					scanf("%c", &ch);
					if (ch == 'Y' || ch == 'y')
					{
						mark_mine(show);   //标记雷
						system("cls");// 清屏
						show_board(show);// 打印展示雷盘
					}
					else
					{
						continue;
					}
				}
				else   
				{
					printf("该坐标已被排查,请重新输入!\n");
					continue;  //直接进入下一次循环
				}

			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == ROW * COL - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		show_board(mine);
	}
}

🐷2.5 按规则展开static void explosion_spread

 

根据输入位置判断周围雷的个数,个数为0,进行展开,再次判断周围雷的个数,个数为0,进行展开...

可知通过周围八个位置坐标,进行八路递归,控制递归条件,同时避免重复坐标判断,便可以按规则进行展开

注意:

每次递归一个位置,便会进行展开,因此需要控制输赢计数器,每次递归一层,进行返回,计数器便增加一

static void explosion_spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int* pw)
{
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)  //判断坐标是否为排查范围内
	{
		int num = get_mine_count(mine, x, y);   //获取坐标周围雷的个数
		if (num == 0)
		{
			(*pw)++;
			show[x][y] = '-';   //如果该坐标周围没有雷,就把该坐标置,并向周围八个坐标展开
			int i = 0;
			int j = 0;
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					if (show[i][j] == ' ')    //限制递归条件,防止已经排查过的坐标再次递归,从而造成死递归
						explosion_spread(mine, show, i, j, pw);
				}
			}
		}

		else
		{
			(*pw)++;
			show[x][y] = num + '0';
		}
	}
}

🐷2.6 获取周围雷的个数get_mine_count

static int get_mine_count(char mine[ROWS][COLS], int  x, int  y)
{
	int count = 0;
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			if(mine[x - 1 + i][y - 1 + j] == '*')
				count++;
		}
	}
	return count;

}

🐷2.7 标记雷mark_mine

 由图可知,可以通过标价,便于进行游戏,而此时通过判断此位置是否被排查,进行标记,通过'!'字符进行标记,如果取消标记,直接输入排查位置即可

void mark_mine(char board[ROWS][COLS])
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入你想要标记位置的坐标->");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)    //判断该坐标是否合法
		{
			if (board[x][y] == ' ')        //判断该坐标是否被排查
			{
				board[x][y] = '!';
				break;
			}
			else
			{
				printf("该位置不能被标记,请重新输入!\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入!\n");
		}
	}
}

🚀3. 游戏完整代码:

🛰️MineSweeper.h——头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
#define ROW 9
#define COL 9

#define ROWS (ROW+2)
#define COLS (COL+2)
#define EASY_COUNT  10//雷数
//初始化
void init_Board(char show[ROWS][COLS], char mine[ROWS][COLS]);
//打印雷盘
void show_board(char show[ROWS][COLS]);

//布置雷
void set_mine(char mine[ROWS][COLS]);
//排查雷
void fine_mine(char mine[ROWS][COLS], char show[ROWS][COLS]);

//标记雷
void mark_mine(char board[ROWS][COLS]);


🛰️MineSweeper.c——源文件

#include"MineSweeper.h"

void init_Board(char show[ROWS][COLS], char mine[ROWS][COLS])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			show[i][j] =' ';
		}
	}
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			mine[i][j] = '0';
		}
	}
}


void show_board(char show[ROWS][COLS])
{


	for (int i = 0; i <= ROW; ++i)
	{
		for (int j = 0; j <= COL; ++j)
		{
			if (j == 0)
			{
				printf(" %d |", i);
			}
			else if (i == 0)
			{
				printf(" %d |", j);
			}
			else
			{
				printf(" %c ", show[i][j]);
				if (j <= COL)
				{
					printf("|");
				}
			}
		}
		printf("\n");
		if (i < ROW)
		{
			int j = 0;
			for (j = 0; j <= COL; j++)
			{
				printf("---");
				if (j <= COL)
					printf("|");
			}
			printf("\n");
		}
	}
	printf("\n");

}

void set_mine(char mine[ROWS][COLS])
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % ROW + 1;
		y = rand() % COL + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '*';
			count--;
		}
	}
}
static int get_mine_count(char mine[ROWS][COLS], int  x, int  y)
{
	int count = 0;
	for (int i = 0; i < 3; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			if(mine[x - 1 + i][y - 1 + j] == '*')
				count++;
		}
	}
	return count;

}
static void explosion_spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int* pw)
{
	if (x >= 1 && x <= ROW && y >= 1 && y <= COL)  //判断坐标是否为排查范围内
	{
		int num = get_mine_count(mine, x, y);   //获取坐标周围雷的个数
		if (num == 0)
		{
			(*pw)++;
			show[x][y] = '-';   //如果该坐标周围没有雷,就把该坐标置,并向周围八个坐标展开
			int i = 0;
			int j = 0;
			for (i = x - 1; i <= x + 1; i++)
			{
				for (j = y - 1; j <= y + 1; j++)
				{
					if (show[i][j] == ' ')    //限制递归条件,防止已经排查过的坐标再次递归,从而造成死递归
						explosion_spread(mine, show, i, j, pw);
				}
			}
		}

		else
		{
			(*pw)++;
			show[x][y] = num + '0';
		}
	}
}
void mark_mine(char board[ROWS][COLS])
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入你想要标记位置的坐标->");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)    //判断该坐标是否合法
		{
			if (board[x][y] == ' ')        //判断该坐标是否被排查
			{
				board[x][y] = '!';
				break;
			}
			else
			{
				printf("该位置不能被标记,请重新输入!\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入!\n");
		}
	}
}

void fine_mine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	int x = 0;
	int y = 0;
	int win = 0; // 判段输赢计数器
	int* pw = &win;
	char ch = 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] == '*')
			{
				printf("很遗憾,被炸死了\n");
				show_board(mine); //炸死后,展示雷盘,的知为何死
				break;
			}
			else
			{
				if (show[x][y] == ' ' ||(show[x][y] == '!'))//判断是否重复排查
				{
					explosion_spread(mine, show, x, y, pw);//展开一片
					system("cls");// 清屏
					show_board(show);// 打印展示雷盘

					printf("需要标记雷的位置请输入y/Y,否则请按任意键->");
					while ((ch = getchar()) != '\n');  //清理缓冲区
					scanf("%c", &ch);
					if (ch == 'Y' || ch == 'y')
					{
						mark_mine(show);   //标记雷
						system("cls");// 清屏
						show_board(show);// 打印展示雷盘
					}
					else
					{
						continue;
					}
				}
				else   
				{
					printf("该坐标已被排查,请重新输入!\n");
					continue;  //直接进入下一次循环
				}

			}
		}
		else
		{
			printf("坐标非法,重新输入\n");
		}
	}
	if (win == ROW * COL - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		show_board(mine);
	}
}

🛰️MineSweepertest.c

#include"MineSweeper.h"
void game()
{
	char show[ROWS][COLS];//展示棋盘
	char mine[ROWS][COLS];//雷盘
	init_Board(show, mine);

	set_mine(mine);

	show_board(show);
	fine_mine(mine, show);
}
void menu()
{
	printf("####################\n");
	printf("###### 1.play ######\n");
	printf("###### 0.exit ######\n");
	printf("####################\n");
	printf("--------------------\n");
}
void test()
{
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		int input = 0;
		if (~scanf("%d", &input))
		{
			switch (input)
			{
			case 1:game(); break;
			case 0:exit(0);
			default:printf("输入有误\n"); break;
			}
		}
		else
		{
			printf("输入有误\n");
		}
	} while (1);
}
int main()
{
	test();
	return 0;
}

🚀3. 游戏效果图:

 

 

 

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

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

相关文章

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证

文章目录原理修改请求报文配置JwtBearerOptions生成Token校验Token修改认证EndPoint修改前端登录登出最终效果项目地址免登录验证是用户在首次两步验证通过后&#xff0c;在常用的设备&#xff08;浏览器&#xff09;中&#xff0c;在一定时间内不需要再次输入验证码直接登录。…

Go 语言 入门 基于 GoLand 2023.1 创建第一个Go程序

文章目录Go 语言 入门go 语言是什么?go 入门 需要 学习 什么?Go 语言有 那些优势?Go 语言 与 Java 语言 对比Go 语言 与Python 语言 对比Go 语言 基于 GoLand 创建第一个程序1. 打开 GoLand2.选择 new3. 选择SDK版本4. 输入项目名称,点击 cteate项目创建完成下一步,创建一个…

SpringBoot-心跳机制+redis实现网站实时在线人数统计

在社交网站中&#xff0c;通常需要实时统计某个网站的在线人数&#xff0c;通过该指标来实时帮助运营人员更好的维护网站业务&#xff1a; 先说一下目前在市面上主流的做法再加上我自己查阅的资料总结&#xff1a; 创建一个session监听器&#xff0c;在用户登录时即创建一个s…

WEB集群之反向代理,动静分离,NFS,mysql,MHA高可用

目录 第一章实验架构 1.1.实验图谱架构 1.2.实验前环境部署 第二章实验步骤 2.1.在ha01&#xff0c;ha02上部署keeplived,lvs-dr 2.2.Slave01,slave02安装nginx 2.3.LVS负载均衡 2.4.搭建动态网页 2.5.nginx反向代理 2.6.部署NFS 2.7.安装mysql 2.8.安装mha 2.9.主…

教你安装 CodeWhisperer: 一款个人免费的类似GitHubCopilot能代码补全的 AI 编程助手

1、官网 AI Code Generator - Amazon CodeWhisperer - AWS 官方扩展安装教程 2、安装VSCode 下载安装VSCode 3、VSCode安装CodeWhisperer插件 安装VSCode插件 - AWS Toolkit主侧栏&#xff0c;点击AWS &#xff0c;展开CodeWhisperer&#xff0c;点击Start 在下拉菜单中点…

洗浴中心管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a; 更多系统资源库地址&#xff1a;骚戴的博客_CSDN_更多系统资源 更多系统…

煤矿井下人员精准定位系统,煤矿应急救援高效应用

煤矿行业的安全发展&#xff0c;事关数人民群众的生命财产安全。自2020年起&#xff0c;国家连续三年出台煤矿智能化建设及重大风险防控的相关指导政策&#xff0c;其中&#xff0c;2022年出台的《煤矿及重点非煤矿山重大灾害风险防控建设工作总体方案》中提到&#xff0c;要充…

52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色

文章目录52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色52.1 创建角色创建角色示例52.2 查看角色查看角色示例52.3 修改角色52.3.1 修改用户名52.3.2 修改用户示例52.3.3 修改用户密码52.3.4 修改角色密码示例52.4 删除角色删除角色示例52.5 角色授权角色授权示例52.6…

Python旅游好帮手:提前15天准备五一旅游景点详细数据

人生苦短&#xff0c;我用python 虽然还是有15天才放五一的假&#xff0c; 但是我的心早已经在旅游的路上了~ 本文源码&#xff1a;点击此处跳转文末名片获取 趁现在&#xff0c;先来用python做一个旅游攻略 知识点&#xff1a; requests parsel csv 第三方库&#x…

python查看时间序列数据的季节规律matplotlib画时间(10分钟为间隔)序列坐标

目录0 问题描述1. 案例12. 案例2参考资料0 问题描述 将多个时间序列数据&#xff0c;绘制到一张图上&#xff0c;每段时间序列数据一般只有几个月&#xff0c;少则 1 个月左右&#xff0c;想看它们的季节规律&#xff0c;需要去除年份&#xff0c;只看月份。 也就是横轴是1月…

44.CSS Grid布局概述

什么是CSS Grid&#xff1f; ● CSS Grid 是一组用于构建二维布局的 CSS 属性 ● CSS Grid 背后的主要思想是我们将容器元素划分为行和列&#xff0c;这些行和列可以填充是子元素。 ● 在两段式语境中&#xff0c;CSS网格允许我们写出更少的嵌套HTML和更容易阅读的CSS ● CSS …

二分查找原理及使用场景

建议使用左闭右开区间[l, r)查找。二分查找的最后&#xff0c;索引l&#xff0c;r会落到右区间第一个元素位置。因此但凡是能够见数组分成左右两个区间的都能应用二分查找法。 1、普通查值 常见问题方式&#xff1a;寻找含重复值的有序数组 [...,a, tar, tar, tar,.b....]&am…

AI制药 - RCSB PDB 数据集的多维度分析与整理 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130089781 整体&#xff1a; RCSB PDB 数据集是一个收集了蛋白质的三维结构信息的数据库&#xff0c;是世界蛋白质数据库&#xff08;…

SQL SERVER调Web Service时候权限错误的解决

日期 2023/4/15 18:00:00 日志 作业历史记录 (AIPACS) 步骤 ID 1 服务器 GOOGLE 作业名称 AIPACS 步骤名称 RUNWS 持续时间 00:00:00 SQL 严重性 16 SQL 消息 ID 15281 已通过电子邮件通知的操作员 已通过…

MATLAB 基于空间格网的点云抽稀 (3)

MATLAB 基于空间格网的点云抽稀 (3) 一、实现效果二、原理步骤三、代码实现四、重点函数与对象的解释说明4.1 indices= pcbin(incloud,[rowNum colNum LayerNum]);4.2 occupancyGrid = cellfun(@(c) ~isempty(c), indices);4.3 outpointIndex = [];4.4 outpointIndex(end+1) …

基于ubuntu18.04上搭建OpenWRT-rtd1619环境

下载OpwnWRT的源码 下载路径&#xff1a;https://gitee.com/yangquan3_admin/rtd1619 您需要以下工具来编译 OpenWrt&#xff0c;包名称因发行版而异。 在 Build System Setup 文档中可以找到包含特定于发行版的软件包的完整列表。 binutils bzip2 diff find flex gawk gcc-6…

【Linux进阶篇】系统网络附加存储

目录 &#x1f341;NFS &#x1f342;软件安装 &#x1f342;服务端配置 &#x1f342;客户端配置 &#x1f342;访问浏览器测试 &#x1f341;iscsi &#x1f342;服务器端安装软件 &#x1f342;服务器端配置iscsi &#x1f342;客户端软件安装配置 &#x1f341;常用的端口号…

这6个免费去水印工具,一定要码住!

现在很多平台会在用户保存图片/视频的时候自动给视频添加一个平台的水印&#xff0c;这在一定程度上影响了它的美观和使用。 下面我来分享几个图片/视频一键去水印方法&#xff0c;操作简单还不会损坏画质哦&#xff01; 1. Magic Eraser 这是一个魔术橡皮擦在线网站&#x…

一文了解API接口自动化测试:让你在人才市场上无往不利

目录&#xff1a;导读 引言 架构 接口测试 API自动化测试 前后端分离的开发模式 测试工作&#xff1a; 协议 网络分层 三次握手的设计(很重要) 问题&#xff1a; URL:统一资源定位符 HTTP协议 &#xff08;重点&#xff09;HTTP的完整请求流程&#xff1a; 通信模…

springboot项目集成JWT实现身份认证(权鉴)

一、什么是JWT JSON Web Token (JWT)&#xff0c;它是目前最流行的跨域身份验证解决方案。现在的项目开发一般都是前端端分离&#xff0c;这就涉及到跨域和权鉴问题。 二、JWT组成 由三部分组成&#xff1a;头部(Header)、载荷(Payload)与签名(signature) 头部&#xff08;Head…