当前位置: 首页 > news >正文

C语言-扫雷游戏的实现

🌈write in front🌈
🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
📝个人主页:Aileen_0v0🧸—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:Aileen_0v0🧸的C语言学习系列专栏——CSDN博客
🗼我的格言:"没有罗马,那就自己创造罗马~"

目录

1.扫雷游戏的分析和设计👻

1.1扫雷游戏的功能说明💭

1.2游戏的界面▶️​编辑

2.扫雷游戏的代码实现🔆

2.1数据结构的分析🙉

​编辑

2.2文件结构设计💫

2.3游戏的过程实现,代码块💦

主函数,用户菜单页面代码⏸️:

棋盘打印*️⃣:

给棋盘加坐标:🔢

布置雷💣:

排雷💥:

3.扫雷游戏的完整代码✨


1.扫雷游戏的分析和设计👻

1.1扫雷游戏的功能说明💭

使用控制台实现经典的扫雷游戏

游戏可以通过菜单实现继续玩或退出游戏
• 扫雷的棋盘是9*9的格子
• 默认随机布置10个雷
 可以排查雷

1.2游戏的界面▶️

初始界面

排雷界面

排雷失败界面

2.扫雷游戏的代码实现🔆

2.1数据结构的分析🙉

但是如果我们判断边缘的格子位置是否含雷时,

由于周围边界没有东西,导致我们需要判断这个格子是否位于边缘位置,这就会让代码变的复杂~

于是,我们可以通过 在原来9 * 9 的方格的 上下 , 左右位置 放没有雷的空格子(如上面左右两个数组的橙色边界)

根据刚刚的分析,

我们在左边创建一个mine数组 布置好雷的信息,全部初始化成 字符"0" ~

雷 - "1"

非雷 - "0"


在右边创建一个show数组放置 排查处的雷的信息, 最初未排查时,都放 *

没有排查 - "*"

排查 - 数字字符


小细节:之所以都用 字符数组 是因为 只需要定义字符函数, 方便操作~

如果 左边是整形数组,右边是字符数组 就 需要调用两个不同的函数~


在game.c中打印棋盘的时候,我们只打印9*9的~

因为外边的绿色空格只是为了编写变得容易一点,不会越界~~

但是,按照这种方式打印,我们很难知道是第几行第几列,因为没有标识

于是我们,再利用 for 循环打印出 行和列的序号 

利用库函数rand 随机布置雷

要从1到n中随机取一个数的公式是:


rand()%n+1.


解释一下:
1、库函数rand()会返回一个大于0的随机整数;
2、rand()%n,对这个返回的随机整数除以n取余,结果是一个0到n-1的随机整数

3、rand()%n+1,将rand()%n的结果加上1,就可得到一个1到n的随机整数;

更通用一点的公式,产生m到n中(n>m)的一个随机数的公式是:
rand()%(n-m+1)+m。

2.2文件结构设计💫

首先,先创建这三个文件.

2.3游戏的过程实现,代码块💦

主函数,用户菜单页面代码⏸️:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>//扫雷页面都实现
void menu()
{printf("*********************************\n");printf("******		1. play	    *****\n");printf("******		0. exit	    *****\n");printf("*********************************\n");
}int main()
{int input = 0;do{menu();printf("请选择:<");scanf("%d", &input);switch (input){case 1:printf("扫雷\n");break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}//case 1 和 default 都是非零//里层switch语句走完 就会走while语句} while (input);return 0;//如果while 后面为0,程序就会自动退出游戏//非0   1就打印扫雷    其他值则重新打印菜单让用户选择}

运行效果:

棋盘打印*️⃣:

头文件game.h 的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#pragma once#define ROW 9
#define COL 9#define ROWS ROW + 2
#define COLS COL + 2// 函数的声明//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);//打印棋盘的
void DisplayBoard(char board[ROWS][COLS],int rows, int cols);

源文件game.c 的代码:

#define _CRT_SECURE_NO_WARNINGS#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘,就是打印数组
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;for (i = 1; i <= row; i++){int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

源文件 test.c 的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"//扫雷页面都实现
void menu()
{printf("*********************************\n");printf("******		1. play	    *****\n");printf("******		0. exit	    *****\n");printf("*********************************\n");
}void game()
{//数组char mine[ROWS][COLS];//"0"char show[ROWS][COLS];//"*"InitBoard(mine, ROWS, COLS,'0');InitBoard(show, ROWS, COLS,'*');//棋盘打印DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);//布置雷//排查雷}int main()
{int input = 0;do{menu();printf("请选择:<");scanf_s("%d", &input);switch (input){case 1:printf("扫雷\n");game();//游戏代码模块化break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}//case 1 和 default 都是非零//里层switch语句走完 就会走while语句} while (input);return 0;//如果while 后面为0,程序就会自动退出游戏//非0   1就打印扫雷    其他值则重新打印菜单让用户选择}

 打印结果:

给棋盘加坐标:🔢

在原来打印棋盘上加上坐标,进行定位,只需修改game.c部分的代码:

#define _CRT_SECURE_NO_WARNINGS#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘,就是打印数组
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;printf("-----------扫雷游戏-----------\n");//打印棋盘序号for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");//打印9*9的棋盘for (i = 1; i <= row; i++){printf("%d ", i);int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-----------扫雷游戏-----------\n");
}

打印结果:

布置雷💣:

game.h:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//标准库头文件
#include<time.h>//布置雷
void SetMine(char mine[ROWS][COLS],int row , int col);
//虽然布置雷是在9*9的格子里面布置--->row 和 col
//但是,数组传参还是11*11的格子,即ROWS和COLS

game.c: 


//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0')//如果该位置无雷才在这个位置放雷{mine[x][y] = '1';count--;}}}

test.c文件: 

	//布置雷SetMine(mine, ROW, COL);DisplayBoard(mine, ROW, COL);

 打印结果:

排雷💥:

通过观察,ASCII表可知:

字符'0'-->ASCII值:48

字符'1'-->ASCII值:49

字符'2'-->ASCII值:50

字符'3'-->ASCII值:51

依此类推

得出规律:'1' - '0' = 49-48 = 1

                '3' - '0' = 51-48 = 3

字符-字符=数字   ----------> 反推: 数字+字符=字符

统计 x y 周围有几个雷 --->

把其周围的字符值'0'和'1'加起来即可

然后减去8个字符'0' 得到数字,去代替  x y 处的 '*'.

game.h:

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

game.c:


//实现GetMineCount数组
static int GetMineCount(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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;while (1)//死循环排雷{printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);//注意:x y 要在有效的排查范围(9*9)之内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);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);//count + 字符'0;变成对应的数字字符放到show数组里}}else{printf("坐标非法,重新输入\n");}}}

test.c:

	//排查雷FindMine(mine, show, ROW, COL);

注意:GetMineCount 没有在其它文件中声明是因为,我们只希望它在game.c处悄悄使用它,所以前加static

运行结果:

上面的排雷,未限制排雷次数,即可无限循环下去,这样子的游戏设计显然不合理~

于是,我们可以根据,雷和非雷的数量关系进行排雷循环次数的限制.

game.h:

//布置80个雷
#define EASY_COUNT 80

game.c: 

//排查雷
void FindMine(char mine[ROWS][COLS], char show[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);//注意:x y 要在有效的排查范围(9*9)之内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);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);//count + 字符'0;变成对应的数字字符放到show数组里win++;}}else{printf("坐标非法,重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,扫雷成功\n");DisplayBoard(mine, ROW, COL);}}

我们可以通过改变雷的个数,然后根据mine的数组打印的结果对照着进行排雷成功的结果输出,检查是否有误. 

运行结果:

3.扫雷游戏的完整代码✨

game.h:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//标准库头文件
#include<time.h>
#pragma once#define ROW 9
#define COL 9#define ROWS ROW + 2
#define COLS COL + 2//布置10个雷
#define EASY_COUNT 10// 函数的声明//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);//打印棋盘的
void DisplayBoard(char board[ROWS][COLS],int rows, int cols);

game.c:

#define _CRT_SECURE_NO_WARNINGS#include "game.h"
#include <stdio.h>void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘,就是打印数组
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;printf("-----------扫雷游戏-----------\n");//打印棋盘序号for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");//打印9*9的棋盘for (i = 1; i <= row; 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 mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0')//如果该位置无雷才在这个位置放雷{mine[x][y] = '1';count--;}}}//实现GetMineCount数组
static int GetMineCount(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 FindMine(char mine[ROWS][COLS], char show[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);//注意:x y 要在有效的排查范围(9*9)之内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);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);//count + 字符'0;变成对应的数字字符放到show数组里win++;}}else{printf("坐标非法,重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,扫雷成功\n");DisplayBoard(mine, ROW, COL);}}

test.c:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"//扫雷页面都实现
void menu()
{printf("*********************************\n");printf("******		1. play	    *****\n");printf("******		0. exit	    *****\n");printf("*********************************\n");
}void game()
{//数组char mine[ROWS][COLS];//"0"char show[ROWS][COLS];//"*"InitBoard(mine, ROWS, COLS,'0');InitBoard(show, ROWS, COLS,'*');//棋盘打印//DisplayBoard(mine, ROW, COL);  雷的位置注释掉不打印出来,保持神秘感DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}int main()
{int input = 0;srand((unsigned int)time(NULL));//强制转换成无符号整型do{menu();printf("请选择:<");scanf_s("%d", &input);switch (input){case 1:printf("扫雷\n");game();//游戏代码模块化break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}//case 1 和 default 都是非零//里层switch语句走完 就会走while语句} while (input);return 0;//如果while 后面为0,程序就会自动退出游戏//非0   1就打印扫雷    其他值则重新打印菜单让用户选择}

 

🌻今天的扫雷游戏就分享到这里啦~🌻

🌻喜欢就一键三连支持一下吧♥~🌻

🌻附上今天的日落图☺️🌻

🌻谢谢家人们!🌻

相关文章:

C语言-扫雷游戏的实现

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

七天学会C语言-第七天(结构体)

1.定义结构体 例 1&#xff1a;把一个学生的信息(包括学号、姓名、性别、住址等 4 项信息) 放在一个结构体变量中&#xff0c;然后输出这个学生的信息。 #include <stdio.h>struct Student {int student_id;char name[30];char gender;char address[60]; };int main() …...

《深度学习工业缺陷检测》专栏介绍 CSDN独家改进实战

&#x1f4a1;&#x1f4a1;&#x1f4a1;深度学习工业缺陷检测 1&#xff09;提供工业小缺陷检测性能提升方案&#xff0c;满足部署条件&#xff1b; 2&#xff09;针对缺陷样品少等难点&#xff0c;引入无监督检测&#xff1b; 3&#xff09;深度学习 C、C#部署方案&#…...

unity 实现双击物体让其隐藏,单击物体让其显示

unity 实现双击物体让其隐藏&#xff0c;单击物体让其显示 private float tapThreshold 0.25f; private float tapTimer 0.0f; private bool tap false; private void Update() { if (Input.GetMouseButtonDown(0)) { if (Time.time < this.tapTimer this.tapThreshold)…...

代码随想录二刷day35

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣860. 柠檬水找零二、力扣406. 根据身高重建队列三、力扣452. 用最少数量的箭引爆气球 前言 一、力扣860. 柠檬水找零 class Solution {public boolean…...

第九章 常用服务器的搭建

第九章 常用服务器的搭建 1.配置FTP服务器 1.1.FTP简介 ​ FTP&#xff08;File Transfer Protocol&#xff0c;文件传送协议&#xff09;是TCP/IP网络上两台计算机间传送文件的协议&#xff0c;FTP是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;它属于网络协议…...

数据结构_复杂度讲解(附带例题详解)

文章目录 前言什么是数据结构&#xff1f;什么是算法&#xff1f;一. 算法的时间复杂度和空间复杂度1.1 算法效率1.2 如何衡量一个算法好坏 二. 时间复杂度2.1 时间复杂度概念例题一例题一分析 实例一实例一分析 三. 空间复杂度实例实例问题解析 四. 常见复杂度对比五. 常见时间…...

学习MLPERF

测试基准与标准 | BenchCouncil 其中涉及AI的有如下&#xff1a; AI (1) AIBench Training AIBench 培训采用平衡的 AI 基准测试方法&#xff0c;考虑全面性、代表性、可负担性和可移植性。该方法广泛调查人工智能任务和模型&#xff0c;并在最大程度上涵盖了算法级、系统级…...

openEuler-20.03 LTS管理用户和用户组

openEuler-20.03 LTS 管理用户和用户组的官方文档&#xff0c;在这里。补充一下关于如何在 openeuler 上创建启用 sudo 新用户&#xff08;无需修改服务器 /etc/sudoers 文件&#xff09;的一个小知识点。 创建启用 sudo 新用户 该 sudo 命令提供了一种向普通用户授予管理员特权…...

什么是读写锁

读写锁 读写锁有3 种状态&#xff1a;读模式下的加锁状态、写模式下的加锁状态和不加锁状态&#xff0c;一次只有一个线程可以占有写模式的读写锁&#xff0c;但是可以有多个线程同时占有读模式的读写锁。因此可知&#xff0c;读写锁比互斥锁具有更高的并行性&#xff01; 读…...

低代码助力企业数字化转型

在当今这个数字化快速发展的时代&#xff0c;企业面临的竞争越来越激烈&#xff0c;数字化转型已成为企业发展的必经之路。低代码平台作为一种新型的开发工具&#xff0c;正在逐渐成为企业数字化转型的重要助力。本文将从数字化转型背景、低代码平台介绍、低代码平台的应用、低…...

Linux 作业

一. 题目 二.作业内容 第一题&#xff1a; 因老师要求上传安装后远程连接XShell截图&#xff0c;如下&#xff1a; 制作yum缓存&#xff1a;[rootRHEL8 ~]# yum makecache 安装gcc&#xff1a;[rootRHEL8 ~]# yum install gcc -y 制作快照&#xff1a;快照&#xff0c;初始 s…...

【数据分享】2005-2022年全国民航机场客货吞吐量和起降架次数据

机场是一个城市对外联系的重要渠道&#xff0c;机场的旅客吞吐量和货物吞吐量是体现一个城市对外联系程度的重要指标。 本次我们给大家分享的是2005-2022年我国民航机场的旅客吞吐量、货邮吞吐量、起降架次数据。数据格式为Excel和Shp两种格式。数据坐标为WGS1984。原始数据来…...

清华博士面试的准备(已通过)

内修&#xff08;30%&#xff09; 不管如何 任何人都不能影响你的心态。因为冷静、理性&#xff0c;才能处理好95%以上的问题。剩下的5%我可以不拥有。不能既要、又要、还要。尊重客观规律。放下我执。 价值导向、解决问题为导向。 允许一切事情的发生&#xff0c;是我们最大的…...

requests爬虫详解

Requests 安装 pip install requests 示例 from fake_useragent import UserAgent import requestsdef cra1_1(): url http://xx/front/website/findAllTypes headers {User-Agent: UserAgent().chrome} resp requests.get(url, headersheaders) result resp.json()i…...

oracle的正则表达式(regular expression)

当前&#xff0c;正则表达式已经在很多软件中得到广泛的应用&#xff0c;包括Linux, Unix&#xff0c;HP等操作系统&#xff0c;PHP&#xff0c;C#&#xff0c;Java等开发环境&#xff0c;ORACLE则在10G中推出了自己的正则表达式。 Oracle 10g正则表达式提高了SQL灵活性&#…...

sh脚本 单独可以执行,放到crontab中不执行(定时清空redis)

1.原因&#xff1a; 执行环境的不同 2.解决办法&#xff1a; 添加环境变量 PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH 3. 完整示例&#xff1a; #!/bin/shPATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:…...

mysql 半同步复制模式使用详解

目录 一、前言 二、mysql主从架构简介 2.1 mysql主从复制架构概述 2.2 为什么使用主从架构 2.2.1 提高数据可用性 2.2.2 提高数据可靠性 2.2.3 提升数据读写性能 2.3 主从架构原理 2.4 主从架构扩展 2.4.1 双机热备&#xff08;AB复制&#xff09; 2.4.2 级联复制 2…...

以太坊代币标准ERC20、ERC721

两个概念 ERC(Ethereum Request for Comment) 以太坊意见征集稿EIP(Ethereum Improvement Proposals)以太坊改进提案 ERC和EIP用于使得以太坊更加完善&#xff1b;在ERC中提出了很多标准&#xff0c;用的最多的标准就是它的Token标准; 有哪些标准详细见https://eips.ethereum…...

编写基于冒泡排序算法的qsort函数

目录 1.简单认识冒泡排序 2.进入正文分析如何实现函数 3.1比较两个相邻元素的大小 3.2比较两个相邻元素大小后要换函数 4.my_qsort函数&#xff1a; 5.总结&#xff1a; 1.简单认识冒泡排序 冒泡排序的步骤如下&#xff1a; 比较相邻的两个元素&#xff0c;如果第一个元素比…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...