【C语言】小游戏-扫雷(清屏+递归展开+标记)
大家好,我是深鱼~
目录
一、游戏介绍
二、文件分装
三、代码实现步骤
1.制作简易游戏菜单
2. 初始化棋盘(11*11)
3.打印棋盘(9*9)
4.布置雷
5.计算(x,y)周围8个坐标的和
6.排查雷
<1>清屏后打印棋盘
<2>递归展开
<3>标记雷
四、完整代码
game.h:相关函数的声明,整个代码要引用的头文件以及宏定义
game.c:实现游戏相关的函数
test.c:整个游戏相关的测试
五、游戏展示
一、游戏介绍
《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输
排查雷的规则:
1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
2.如果这个位置是雷,就炸死了,表示游戏结束
3.如果把不是雷的位置都找出来了,那就通过了
二、文件分装
实现这个扫雷游戏,我创建了三个文件
源文件:
test.c:整个游戏相关的测试
game.c:实现游戏相关的函数
头文件:
game.h:相关函数的声明,整个代码要引用的头文件以及宏定义
三、代码实现步骤
1.制作简易游戏菜单
这个简易菜单和上一篇文章三字棋一样,就不做过多的解释了
test.c
void menu()//打印简易菜单
{printf("************************************\n");printf("************ 1.进入游戏 **********\n");printf("************ 0.退出游戏 **********\n");printf("************************************\n");
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//空指针NULLdo{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//注意这里要加上;return 0;
}
2. 初始化棋盘(11*11)
(1)定义两个数组为11*11:
定义一个数组(mine数组)表示雷的信息(1表示这个坐标是雷,0表示不是雷),另一个数组(show数组)表示排查雷的信息
假设我们要实现一个9*9的棋盘,如果我们只定义一个9*9的二维数组,计算周围8个坐标会越界,那么我们就需要将数组扩大成11*11的二维数组(上下左右分别多一排)
(2)为了简洁,传一个参数char set表示初始化的字符
初始化棋盘(9*9的外部也要初始化),因为mine和show数组不同,再传一个参数set即要初始化的字符内容
(3)宏定义ROWS,COLS,ROW,COL,EASY_COUNT
为了方便修改游戏难度(改变棋盘的行和列及雷的个数),我们采用宏定义直接进行修改即可
game.h
#define ROW 9//可以进行扫雷的行列
#define COL 9#define ROWS ROW+2//进行判断的行列
#define COLS COL+2#define EASY_COUNT 10 //雷的个数//初始化棋盘(9*9的外部也要初始化)
void InitBoard(char board[ROWS][COLS],char ch);
game.c
//初始化棋盘(9*9的外部也要初始化),为了mine和show数组不同,再传一个参数set即要初始化的内容
void InitBoard(char board[ROWS][COLS],char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){board[i][j] = ch;//自己的棋盘初始化为0,展示的数组初始化为*}}
}
3.打印棋盘(9*9)
(1)打印出来的棋盘(show)得是9*9的,但是由于定义的数组就是11*11的,所以函数传参还得传11*11定义的数组
(2)因为我们这个游戏是自己输入需要排雷的位置,所以最好在棋盘的旁边打印出对应的数字,方便输入坐标
game.h
//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS]);
game.c
//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS])//定义的数组是不变的,一直都是11*11
{printf("------扫雷------\n");//用来隔开数组//打印列号for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++)//传的是11*11,打印是9*9,也就是从数组下标1开始打印到下标为9{printf("%d ", i);//打印行号for (int j = 1; j <= COL; j++){printf("%c ", board[i][j]);//打印字符用%c}printf("\n");}printf("------扫雷------\n");
}
4.布置雷
(1)布置雷是在mine数组上布置,定义mine数组上1代表有雷,0代表没雷(这样方便后面计算周围8个坐标的和)
(2)布置雷需要随机布置,那就得随机生成横纵坐标,跟上篇三字棋生成随机数一样rand函数
,但是注意取模结束后要+1,因为取模的结果是0-8,我们需要生成的坐标是1-9
(3)这里要注意一点:如果一个位置已经布置了雷,那么这个位置就不需要再布置了,加一条判断语句就可以解决这个问题
game.h
//布置雷
void SetMine(char mine[ROWS][COLS]);
game.c
//布置雷
void SetMine(char mine[ROWS][COLS])
{int count = EASY_COUNT;while (count)//注意这个循环进行的次数可能大于10次,可能有的位置已经是1,或者是多次生成的坐标相同{int x = rand() % ROW + 1;//%ROW得到的范围是0-8,结果+1的范围就算1-9int y = rand() % COL + 1;if (mine[x][y] != '1'){mine[x][y] = '1';count--;}}
}
5.计算(x,y)周围8个坐标的和
注意求和的时候需要将字符和数字进行转换,加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'
game.c
//计算(x,y)周围8个坐标的和
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] +mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0';//记住要减去8个'0'变成数字
}
6.排查雷
排查雷的规则:
1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
2.如果这个位置是雷,就炸死了,表示游戏结束
3.如果把不是雷的位置都找出来了,那就通过了
(1)传参需要传两个数组,mine数组用来判断是否踩中了雷,show数组打印出来看
(2)排雷需要多次进行,while语句控制结束,当棋盘剩下的格子只剩下10个雷的时间就结束,
或者踩到了雷,直接break跳出结束
game.h
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);
game.c
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{int x = 0;int y = 0;int win = 0;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] == '1')//踩中雷了{system("cls");//清空屏幕printf("很遗憾,你被炸死了\n");DisplayBoard(mine);break;}else//不是雷,就统计(x,y)周围有几个雷:这时候雷定义为1的好处就出来了,我们直接把周围坐标的和加起来放入show坐标的对应位置上即可{if (show[x][y] == ' ')//为了避免再次输入已经变成空格的坐标{printf("该坐标已排查\n");continue;}else{//展开一片,去除和为0,,并打印出和非0的位置(递归实现)//条件:1.这个坐标不是雷//2.这个坐标周围没有雷,雷的个数是0//3.这个坐标没有被排查过RemoveZero(mine, show, x, y, &win);system("cls");DisplayBoard(show);do {printf("如果需要'$'对雷进行标记,请输入Y;无需标记,请按Enter键继续\n");while ((ch = getchar()) != '\n')//清空缓冲区{;}scanf("%c", &ch);if (ch == 'Y'){//标记雷并打印Remark(show);}else{continue;}} while (ch != '\n');//进行多次标记}}}else{printf("坐标非法,请重新输入\n");}}if (win == ROW * COL - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");}}
优化:
<1>清屏后打印棋盘
system("cls");
头文件:#include<windows.h>
清屏后再打印show数组棋盘,可以让屏幕更干净简洁
system("cls");
DisplayBoard(show);
<2>递归展开
展开一片,去除和为0,,并打印出和非0的位置(递归实现)
条件:1.这个坐标不是雷
2.这个坐标周围没有雷,雷的个数是0
3.这个坐标没有被排查过
(1)递归展开:当mine数组计算周围8个坐标的和返回的是0,那就把show数组的这个位置变为空格,并且再看自己周围的八个坐标是否也为0,如果mine数组为0且show数组的对应位置为*,那么再对这个坐标的周围8个坐标进行爆炸式展开(show数组对应位置为*是为了防止多次把同一个位置变为空格)
(2)传参记得传一个指针来使win++(即统计GetMineCount()的位置,每变一个符号,剩下的棋格数就少一个,对应又成功一步)
game.c
//展开一片,去除和为0,并打印出和非0的位置(递归实现)
void RemoveZero(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y,int *num)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//小数组(9*9)内部才需要计算{//注意加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'int ret = GetMineCount(mine, x, y);if (ret == 0){show[x][y] = ' ';//如果这个周围坐标和是0,那就变为空格(*num)++;//变一个空格win也+1//看看周围8个坐标是否为0for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (mine[i][j]=='0'&&show[i][j] == '*')//show[i][j] == '*'是为了避免重复RemoveZero(mine, show, i, j,num);}}}else{show[x][y] = ret + '0';//数字+'0'变成字符(*num)++;}}
}
<3>标记雷
如果show数组上想要标记的位置为*,则可以标记;如果不是*,则不可标记
game.c
//标记雷
void Remark(char show[ROWS][COLS])
{int x = 0;int y = 0;while (1){printf("请输入要标记的坐标>:\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (show[x][y] == '*'){show[x][y] = '$';system("cls");DisplayBoard(show);break;}else{printf("该位置不能被标记,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}}
四、完整代码
game.h:相关函数的声明,整个代码要引用的头文件以及宏定义
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>#define ROW 9//可以进行扫雷的行列
#define COL 9#define ROWS ROW+2//进行判断的行列
#define COLS COL+2#define EASY_COUNT 10 //雷的个数//初始化棋盘(9*9的外部也要初始化)
void InitBoard(char board[ROWS][COLS],char ch);
//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS]);
//布置雷
void SetMine(char mine[ROWS][COLS]);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);
game.c:实现游戏相关的函数
#include"game.h"
//实现游戏相关的代码
//9*9的棋盘,上面布置10个雷//排查雷
//1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
//2.如果这个位置是雷,就炸死了,表示游戏结束
//3.如果把不是雷的位置都找出来了,那就通过了//一个数组表示雷的信息(1表示这个坐标是雷,0表示不是雷),另一个数组表示排查雷的信息
//当要排查数组最外层的雷时,计算周围8个坐标会越界,这就需要把数组扩充为11*11,当然为了两个数组统一起来,两个数组都定义11*11//初始化棋盘(9*9的外部也要初始化),为了mine和show数组不同,再传一个参数set即要初始化的内容
void InitBoard(char board[ROWS][COLS],char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){board[i][j] = ch;//自己的棋盘初始化为0,展示的数组初始化为*}}
}//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS])//定义的数组是不变的,一直都是11*11
{printf("------扫雷------\n");//用来隔开数组//打印列号for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++)//传的是11*11,打印是9*9,也就是从数组下标1开始打印到下标为9{printf("%d ", i);//打印行号for (int j = 1; j <= COL; j++){printf("%c ", board[i][j]);//打印字符用%c}printf("\n");}printf("------扫雷------\n");
}//布置雷
void SetMine(char mine[ROWS][COLS])
{int count = EASY_COUNT;while (count)//注意这个循环进行的次数可能大于10次,可能有的位置已经是1,或者是多次生成的坐标相同{int x = rand() % ROW + 1;//%ROW得到的范围是0-8,结果+1的范围就算1-9int y = rand() % COL + 1;if (mine[x][y] != '1'){mine[x][y] = '1';count--;}}
}//计算(x,y)周围8个坐标的和
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] +mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0';//记住要减去8个'0'变成数字
}//展开一片,去除和为0,并打印出和非0的位置(递归实现)
void RemoveZero(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y,int *num)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//小数组(9*9)内部才需要计算{//注意加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'int ret = GetMineCount(mine, x, y);if (ret == 0){show[x][y] = ' ';//如果这个周围坐标和是0,那就变为空格(*num)++;//变一个空格win也+1//看看周围8个坐标是否为0for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (mine[i][j]=='0'&&show[i][j] == '*')//show[i][j] == '*'是为了避免重复RemoveZero(mine, show, i, j,num);}}}else{show[x][y] = ret + '0';//数字+'0'变成字符(*num)++;}}
}//标记雷
void Remark(char show[ROWS][COLS])
{int x = 0;int y = 0;while (1){printf("请输入要标记的坐标>:\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (show[x][y] == '*'){show[x][y] = '$';system("cls");DisplayBoard(show);break;}else{printf("该位置不能被标记,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{int x = 0;int y = 0;int win = 0;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] == '1')//踩中雷了{system("cls");//清空屏幕printf("很遗憾,你被炸死了\n");DisplayBoard(mine);break;}else//不是雷,就统计(x,y)周围有几个雷:这时候雷定义为1的好处就出来了,我们直接把周围坐标的和加起来放入show坐标的对应位置上即可{if (show[x][y] == ' ')//为了避免再次输入已经变成空格的坐标{printf("该坐标已排查\n");continue;}else{//展开一片,去除和为0,,并打印出和非0的位置(递归实现)//条件:1.这个坐标不是雷//2.这个坐标周围没有雷,雷的个数是0//3.这个坐标没有被排查过RemoveZero(mine, show, x, y, &win);system("cls");DisplayBoard(show);do {printf("如果需要'$'对雷进行标记,请输入Y;无需标记,请按Enter键继续\n");while ((ch = getchar()) != '\n')//清空缓冲区{;}scanf("%c", &ch);if (ch == 'Y'){//标记雷并打印Remark(show);}else{continue;}} while (ch != '\n');//进行多次标记}}}else{printf("坐标非法,请重新输入\n");}}if (win == ROW * COL - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");}}
test.c:整个游戏相关的测试
//测试代码
#include"game.h"
void menu()//打印简易菜单
{printf("************************************\n");printf("************ 1.进入游戏 **********\n");printf("************ 0.退出游戏 **********\n");printf("************************************\n");
}void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//初始化棋盘(9*9的外部也要初始化)InitBoard(mine, '0');InitBoard(show, '*');//打印棋盘(打印9*9的部分就可以了)DisplayBoard(show);//布置雷(放在mine数组9*9中即可)SetMine(mine);//排查雷FindMine(mine, show);
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//空指针NULLdo{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//注意这里要加上;return 0;
}
五、游戏展示
扫雷小游戏演示
本次C语言小游戏扫雷的内容就到此啦,有什么问题欢迎评论区或者私信交流,觉得笔者写的还可以,或者自己有些许收获的,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢 !
相关文章:

【C语言】小游戏-扫雷(清屏+递归展开+标记)
大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2. 初始化棋盘(11*11) 3.打印棋盘(9*9) 4.布置雷 5.计算(x,y)周围8个坐标的和 6.排查雷 <1>清屏后打印棋盘 <2>递归展开 <3>标记雷 四、完整代…...

云服务 Ubuntu 20.04 版本 使用 Nginx 部署静态网页
所需操作: 1.安装Nginx 2.修改配置文件 3.测试、重启 Nginx 4.内部修改防火墙 5.配置解析 6.测试是否部署成功 1.安装Nginx // 未使用 root 账号 apt-get update // 更新apt-get install nginx // 安装 nginx 1.1.测试是否安装没问题 在网页上输入云服务的公网…...
无后效性
动态规划的概念 在上例的多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义…...
Kubernetes系列-删除deployment和pod
通过deployment创建的pod直接执行delete是不会正常被删除的,因为deployment中设置了pod的数量,deployment会动态维护pod的数量,倘若pod数量少于约定数量,deployment会创建pod,直到pod数量达到约定数量才会停止。 如若…...
kotlin字符串方法
以下是一些常用的 String 方法示例: 1.获取字符串长度: val str "Hello, Kotlin" val length str.length2.字符串比较: val str1 "apple" val str2 "banana" val compareResult str1.compareTo(str2)3…...

ubuntu篇---配置FTP服务,本机和docker安装
ubuntu篇---配置FTP服务 一、本机安装1.1 安装FTP服务器软件1.2 配置FTP服务 二、docker安装(我用的这个)2.1 创建 目录2.2 启动脚本2.3 访问2.4 如何创建一个新的用户2.5 测试2.6 使用 一、本机安装 1.1 安装FTP服务器软件 ubuntu安装vsftp sudo apt…...

SpringBoot中properties、yml、yaml的优先级
原理 配置优先级低的会先加载然后会被配置优先级高的覆盖 验证 创建SpringBoot项目(网址) 在resource目录下创建application.properties、application.yml、application.yaml文件 运行 结论 优先级顺序: properties>yml>yaml...

SHELL 基础 SHELL注释 及 执行SHELL脚本的四种方法
SHELL 脚本编写规范 : 脚本开头 : # 脚本第一行 : #! /bin/bash 或 #!/bin/sh ( 脚本解释器 ) # 程序段开头需要加 版本版权信息 ,例如 : # Date 创建日期 # Author : 作者 # …...

【Spring】深入探索 Spring AOP:概念、使用与实现原理解析
文章目录 前言一、初识 Spring AOP1.1 什么是 AOP1.2 什么是 Spring AOP 二、AOP 的核心概念2.1 切面(Aspect)2.2 切点(Pointcut)2.3 通知(Advice)2.4 连接点(Join Point) 三、Sprin…...
LocalDate介绍和使用
1.什么是 LocalDate? 在我们开始之前,让我先简单介绍一下 LocalDate。它是 Java 8 中引入的日期类,用于表示不带时区信息的日期。也就是说,它专注于日期,并忽略了具体的时间。这样,我们就可以专心解决那些…...
三、使用注解形式开发 Spring MVC程序
文章目录 一、环境准备二、配置 web.xml三、配置 SpringMVC-Servlet.xml ,这里不再使用之前那种写法,直接采用注解配置,引入注解支持,配置视图解析器四、编写 Controller(Controller 和 RequestMapping 注解说明&#…...
【Go】常见的四个内存泄漏问题
Goroutine没有顺利结束 1、这里更多的是由于channelforselect导致的,错误的写法导致了发送者或接收者没有发现channel已经关闭,任务已经结束了,却仍然在尝试输入输出https://geektutu.com/post/hpg-exit-goroutine.html Map的remove方法不会…...

【LeetCode-简单】剑指 Offer 29. 顺时针打印矩阵(详解)
题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:matrix [[1,2,3,4],[5,6,7,8],[9,10,1…...
TOMCAT基础
tomcat是一个基于Java开发的,开放源代码的web应用服务器。它可以解析html页面中的java代码,执行动态请求,实现动态页面。核心功能是将收到的http请求处理并转发给适当的servlet来处理,然后将响应返回给客户端。 优点 1,…...
自动化集装箱码头建设指南
1 总则 1.0.1 为规范和指导自动化集装箱码头建设,提高自动化集装箱码头建设和装卸自动化应用水平,做到技术先进、经济合理、安全可靠、高效节能、绿色环保,制定本指南。 1.0.2本指南适用于新建、改建和扩建自动化集装箱码头的设计࿰…...
为什么要用redis
高性能 就是把你一些复杂操作耗时查出来的结果(用了600ms),如果确定后面不咋变了,然后但是马上还有很多读请求,那么直接结果放缓存(6ms),后面直接读缓存就好了。 这样,性能就提升了100倍 高并发 说白了就是…...

QT qmake解析
...

【TypeScript】this指向,this内置组件
this类型 TypeScript可推导的this类型函数中this默认类型对象中的函数中的this明确this指向 怎么指定this类型 this相关的内置工具类型转换ThisParameterType<>ThisParameterType<>ThisType TypeScript可推导的this类型 函数中this默认类型 对象中的函数中的this…...
MySQL 深度分页优化
MySQL 深度分页优化 理解总结: 分页使用limit ,前提是要排序好的数据,这时候,就推荐使用带索引的字段排序,因为索引是天然有序的,不需要像是无序的字段一样,全表扫描,如果太大的话…...

如何在CSS中水平居中一个元素?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 margin: 0 auto⭐ 使用 Flexbox 布局⭐ 使用绝对定位和负边距⭐ 使用表格布局⭐ 使用网格布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
Vue 实例的数据对象详解
Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. 本…...
02-性能方案设计
需求分析与测试设计 根据具体的性能测试需求,确定测试类型,以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通,初步确定压测方案及具体的性能指标QA完成性能测试设计后,需产出测试方案文档发送邮件到项目组&…...