贝蒂快扫雷~(C语言)

         ✨✨欢迎大家来到贝蒂大讲堂✨✨

        ​​​​🎈🎈养成好习惯,先赞后看哦~🎈🎈

                 所属专栏:贝蒂的游戏        

                 贝蒂的主页:Betty‘s blog


引言:

          扫雷相信大家小时候到玩过吧,那我们通过目前已学的知识,自己实现一个扫雷小游戏呢,答案自然是肯定的。

         本章你可能会用到的知识:

         1. 数组的使用:小小数组,给贝蒂坐下

         2. 随机数的生成:贝蒂的捣蛋小游戏

1. 游戏要求 

1. 玩家可以通过菜单选择玩游戏和退出游戏。

2. 默认棋盘为9×9的格子。

3. 默认雷的个数为10。

4可以排查雷
 (1) 如果位置不是雷,就显⽰周围有⼏个雷,并且循环展开。
 (2)如果位置是雷,就炸死游戏结束
 (3)把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束

 (4)玩家可以对认为是雷的位置进行可能是雷或肯定是雷的标记。 

2. 游戏分析

1. 我们要在9×9的棋盘上操作,自然使用数组模拟,并且我们先假设0代表无雷,1代表雷

2. 玩家选择一个格子排查,如果没雷,将显示周围八个格子雷的个数。

    为了解决可能得数组越界问题,所以尝试在外围增加“一圈”。

3. 但是我们不可能把这个棋盘布置的信息给玩家看,所以要创建两个数组,一个数组(mine)负责布置雷的信息,一个数组(show)负责展现给玩家看。

4. 如果玩家排查的位置没有雷,我们将显示周围雷的个数,为了不与布置雷的信息冲突,所以将无雷改为‘0’,有雷改为‘1’。

5. 玩家棋盘初始全为‘*’,代表未排查。 

3. 多文件操作

         为了方便代码的管理和保证游戏实现逻辑的清晰性,我们将采用多文件管理的模式。

        (1)创建头文件game.h,包含所有头文件(其他源文件只需引用它即可),以及所有游戏功能的展现。

        (2)创建源文件game.c,负责所有功能的具体代码实现。

        (3)创建源文件main.c,负责展现游戏实现的总体逻辑。

4.  简易菜单的实现

  4.1功能

1.玩家可以通过选择1进入游戏,0退出游戏。

2.选错的话提醒玩家,重新选择。

  4.2代码实现 

    为了完成这些目标,我们可以简单的do-while,switch结构实现。

     代码如下:

void menu()
{printf("****************************\n");printf("*******    1. play    ******\n");printf("*******    0. exit    ******\n");printf("****************************\n");
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//设置时间种子do{menu();//简易菜单的实现printf("请选择:>");scanf("%d", &input);switch (input){case 1:system("cls");//清空屏幕,头文件<stdlib.h>game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);//选0结束游戏return 0;
}

5. 游戏功能实现

  5.1 预定义信息

#define ROW 9//棋盘的行
#define COL 9//棋盘的列
#define ROWS ROW+2//扩展后的行
#define COLS COL+2//扩展后的列
#define MINES 10//雷的个数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

  5.2 初始化棋盘

   (1)要求

1. mine棋盘初始化为全‘0’。

2. show棋盘初始化为全‘1’。

    (2)实现
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;}}
}

贝蒂说:“因为在game.c中实现游戏的具体功能,所以千万不要忘了在game.h中声明哦~”

 5.3 打印棋盘

    (1)要求

1. 打印出棋盘中的元素。

2. 利用---,|模拟出棋盘框。

3. 显示出每行,每列的序号。

    (2)实现 
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("-----------------扫雷游戏----------------\n");for (int i = 0; i <= col; i++){if (i == 0){printf("    ");//四个空格}else{printf(" %d  ", i);//两个空格一个数字}}printf("\n");for (int i = 0; i <= col; i++){if (i == 0){printf("   |");//三个空格}else{printf("---|");}}printf("\n");for (int i = 1; i <= row; i++){printf(" %d |", i);for (int j = 1; j <= col; j++){printf(" %c |", board[i][j]);}printf("\n");for (int j = 1; j <= col; j++){if (j == 1){printf("   ");//三个空格printf("|---|");}else{printf("---|");}}printf("\n");}printf("-------------------结束线----------------\n");
}
  (3)效果展示

  5.4 埋雷 

    (1)要求

1.在mine棋盘中随机布置10个雷,雷为‘0’。

2.重复位置不能布置。

    (2)实现 
void SetMine(char board[ROWS][COLS], int row, int col)
{int num = MINES;while (num){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';num--;}}
}
(3)效果展示

 5.5 排雷和标记

  (1)要求·

1. 玩家可以选择排雷或者标记。

2. 保证玩家输入的值合法。

3. 对于同一个坐标,第一次标记为!代表肯定是雷;第二次标记为?代表可能是雷;第三次   标记恢复‘*’。('!'的数量最多等于雷的数量)

4. 标记时,统计正确标记雷的个数。

5. 排雷时,玩家输入要排除的坐标,如果是雷,则游戏结束;如果不是雷,则统计周围雷的个数。

6. 如果周围没有雷,则向周围展开至有雷或者有标志位置为止。

 贝蒂说:“因为布置的雷为‘1’,字符在内存中是以ascii码值存储,所以统计方法为将周围八个格子值加起来减去8*‘0’。” 

  (2)排雷与递归排雷的实现 
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 SpreadBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)//递归排雷
{if (x < 1 || x>ROW || y < 1 || y>COL)//坐标不合理不递归{return;}if (show[x][y] != '*')//递归结束条件{return;}int count = GetMineCount(mine, x, y);if (count == 0)//无雷继续扩展{show[x][y] = ' ';//扩建为' 'SpreadBoard(mine,show, x, y + 1);SpreadBoard(mine,show, x, y - 1);SpreadBoard(mine, show, x + 1, y - 1);SpreadBoard(mine, show, x + 1, y +1);SpreadBoard(mine, show, x + 1, y);SpreadBoard(mine, show, x - 1, y + 1);SpreadBoard(mine, show, x - 1, y - 1);SpreadBoard(mine, show, x - 1, y);}else{show[x][y] = '0' + count;//有雷输出个数}
}
int FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{int x = 0;int y = 0;printf("请输入你要排查的坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//坐标要合法{if (show[x][y] != '*'){if (show[x][y] == '!' || show[x][y] == '?'){printf("该位置已被标记,暂时不可排雷!\n");}else{printf("该位置已排雷,不可重复排雷!\n");}}else{if (mine[x][y] == '1'){return 0;//被炸死}else{SpreadBoard(mine, show, x, y);//递归扩展}}}else{printf("坐标非法!\n");}return 1;
}

  效果展示: 

  (3)标记的实现 
void MineMark(char mine[ROWS][COLS],char show[ROWS][COLS],int row, int col,int *p)
{static int sum = 0;//判断!的个数if (sum == MINES){printf("!已满,请减少!的使用\n");}int x = 0, y = 0;printf("请输入标记的坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//输入的坐标数值合法{if (show[x][y] == '*')//第一次标记{if (sum < MINES){show[x][y] = '!';if (mine[x][y] == '1'){(*p)++;//统计标记正确雷的个数}sum++;//!的个数+1}}else if (show[x][y] == '!')//第二次标记{show[x][y] = '?';if (mine[x][y] == '1'){(*p)--;//标记正确雷的个数减1}sum--;}else if(show[x][y]=='?')//第三次标记{show[x][y] = '*';}else{printf("该位置已经排查过,不能标记!\n");}}else{printf("输入坐标不合法,请重新输入!\n");}
}

5.6 胜利条件

(1)要求

1. 成功用‘!’标记所有雷的正确位置,游戏胜利。

2. 或者成功排查完除雷外所有格子,游戏胜利。

(2)实现
int IsWin(char board[ROWS][COLS],int row,int col, int* p)
{int count = 0;for (int i = 1; i <= row; i++)//遍历所有格子,看看是否已经排查完{for (int j = 1; j <= col; j++){if (board[i][j] != '*' && board[i][j] != '!' && board[i][j] != '?'){count++;}}}if (count == row * col - MINES||*p==MINES)//如果排查完,或者成功标记完雷的个数{return 1;//游戏胜利}return 0;
}

6. 游戏主逻辑的搭建 

  6.1搭建顺序

1. 初始化棋盘。

2. 埋雷。

3. 玩家选择标记还是埋雷。

4. 判断玩家是否被炸死。

5. 判断玩家是否胜利。

6.如果步骤4或5未成功执行,就重复执行步骤3,4,5。

  6.2 实现

void game()
{char mine[ROWS][COLS]; //存放布置好的雷char show[ROWS][COLS]; //展示棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//打印棋盘//DisplayBoard(mine, ROW, COL);//DisplayBoard(show, ROW, COL);//1. 布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//2. 排查雷//FindMine(mine, show, ROW, COL);int input = 0;int flag = 0;int num = -1;while (1){DisplayBoard(show, ROW, COL);choose();printf("请选择排雷或者标记\n");scanf("%d", &input);switch (input){case 1:num=FindMine(mine, show, ROW, COL);Sleep(900);//停顿0.9秒system("cls");//刷新棋盘break;case 2:MineMark(mine, show, ROW, COL, &flag);Sleep(900);system("cls");//刷新棋盘break;default:printf("输入非法情重新输入\n");Sleep(900);system("cls");//刷新棋盘break;}if (num == 0)//判断是否被炸死{DisplayBoard(show, ROW, COL);DisplayBoard(mine, ROW, COL);printf("很遗憾,你被炸死了\n");break;}int ret=IsWin(show,ROW,COL,&flag);if (ret)//判断是否胜利{DisplayBoard(show, ROW, COL);DisplayBoard(mine, ROW, COL);printf("恭喜你,扫雷成功\n");break;}}
}

 6.3 补充

   为了让玩家正确理解如何进行游戏,我们应该提前告诉玩家游戏规则。

void rules()
{printf("游戏规则如下:\n");printf("1.你可以通过排雷和标记逐渐逼近胜利条件\n");printf("2.对同一坐标标记1次是!,标记2次是?,第3次恢复*\n");printf("3.标记!代表肯定是雷,标记?代表可能是雷\n");printf("4.标记!的次数最多为雷的个数\n");printf("5.如果选中雷,则游戏失败\n");printf("6.当成功标记所有雷,或者排查完所有格子,游戏胜利\n");
}

7. 源码 

  (1)main.c

#include"game.h"
void menu()
{printf("****************************\n");printf("*******    1. play    ******\n");printf("*******    0. exit    ******\n");printf("****************************\n");
}
void choose()
{printf("********************************************\n");printf("***************    1. 排雷     *************\n");printf("***************    2. 标记     *************\n");printf("********************************************\n");
}
void rules()
{printf("游戏规则如下:\n");printf("1.你可以通过排雷和标记逐渐逼近胜利条件\n");printf("2.对同一坐标标记1次是!,标记2次是?,第3次恢复*\n");printf("3.标记!代表肯定是雷,标记?代表可能是雷\n");printf("4.标记!的次数最多为雷的个数\n");printf("5.如果选中雷,则游戏失败\n");printf("6.当成功标记所有雷,或者排查完所有格子,游戏胜利\n");
}
void game()
{char mine[ROWS][COLS]; //存放布置好的雷char show[ROWS][COLS]; //展示棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//打印棋盘//DisplayBoard(mine, ROW, COL);//DisplayBoard(show, ROW, COL);//1. 布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//2. 排查雷//FindMine(mine, show, ROW, COL);int input = 0;int flag = 0;int num = -1;while (1){DisplayBoard(show, ROW, COL);choose();printf("请选择排雷或者标记\n");scanf("%d", &input);switch (input){case 1:num=FindMine(mine, show, ROW, COL);Sleep(900);//停顿0.9秒system("cls");//刷新棋盘break;case 2:MineMark(mine, show, ROW, COL, &flag);Sleep(900);system("cls");//刷新棋盘break;default:printf("输入非法情重新输入\n");Sleep(900);system("cls");//刷新棋盘break;}if (num == 0)//判断是否被砸死{DisplayBoard(show, ROW, COL);DisplayBoard(mine, ROW, COL);printf("很遗憾,你被炸死了\n");break;}int ret=IsWin(show,ROW,COL,&flag);if (ret){DisplayBoard(show, ROW, COL);DisplayBoard(mine, ROW, COL);printf("恭喜你,扫雷成功\n");break;}}
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//设置时间种子printf("   欢迎来到贝蒂的扫雷游戏\n");do{menu();//简易菜单的实现rules();printf("请选择:>");scanf("%d", &input);switch (input){case 1:system("cls");//清空屏幕,头文件<stdlib.h>game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);//选0结束游戏return 0;
}

(2)game.h

#define ROW 9//棋盘的行
#define COL 9//棋盘的列
#define ROWS ROW+2//扩展后的行
#define COLS COL+2//扩展后的列
#define MINES 10//雷的个数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
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 MineMark(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col,int*p);//标记雷
int FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排雷
int IsWin(char board[ROWS][COLS],int row,int col,int *p);//判断是否胜利

(3)game.c

#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)
{printf("-----------------扫雷游戏----------------\n");for (int i = 0; i <= col; i++){if (i == 0){printf("    ");//四个空格}else{printf(" %d  ", i);//两个空格一个数字}}printf("\n");for (int i = 0; i <= col; i++){if (i == 0){printf("   |");//三个空格}else{printf("---|");}}printf("\n");for (int i = 1; i <= row; i++){printf(" %d |", i);for (int j = 1; j <= col; j++){printf(" %c |", board[i][j]);}printf("\n");for (int j = 1; j <= col; j++){if (j == 1){printf("   |");//三个空格printf("---|");}else{printf("---|");}}printf("\n");}printf("-------------------结束线----------------\n");
}
void SetMine(char board[ROWS][COLS], int row, int col)
{int num = MINES;while (num){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';num--;}}
}
void MineMark(char mine[ROWS][COLS],char show[ROWS][COLS],int row, int col,int *p)
{static int sum = 0;//判断!的个数if (sum == MINES){printf("!已满,请减少!的使用\n");}int x = 0, y = 0;printf("请输入标记的坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//输入的坐标数值合法{if (show[x][y] == '*')//第一次标记{if (sum < MINES){show[x][y] = '!';if (mine[x][y] == '1'){(*p)++;//统计正确雷的个数}sum++;//!的个数+1}}else if (show[x][y] == '!')//第二次标记{show[x][y] = '?';if (mine[x][y] == '1'){(*p)--;}sum--;}else if(show[x][y]=='?')//第三次标记{show[x][y] = '*';}else{printf("该位置已经排查过,不能标记!\n");}}else{printf("输入坐标不合法,请重新输入!\n");}
}
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 SpreadBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)//递归排雷
{if (x < 1 || x>ROW || y < 1 || y>COL)//坐标不合理不递归{return;}if (show[x][y] != '*')//递归结束条件{return;}int count = GetMineCount(mine, x, y);if (count == 0)//无雷继续扩展{show[x][y] = ' ';//扩建为' 'SpreadBoard(mine,show, x, y + 1);SpreadBoard(mine,show, x, y - 1);SpreadBoard(mine, show, x + 1, y - 1);SpreadBoard(mine, show, x + 1, y +1);SpreadBoard(mine, show, x + 1, y);SpreadBoard(mine, show, x - 1, y + 1);SpreadBoard(mine, show, x - 1, y - 1);SpreadBoard(mine, show, x - 1, y);}else{show[x][y] = '0' + count;//有雷输出个数}
}
int FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{int x = 0;int y = 0;printf("请输入你要排查的坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//坐标要合法{if (show[x][y] != '*'){if (show[x][y] == '!' || show[x][y] == '?'){printf("该位置已被标记,暂时不可排雷!\n");}else{printf("该位置已排雷,不可重复排雷!\n");}}else{if (mine[x][y] == '1'){return 0;//被炸死}else{SpreadBoard(mine, show, x, y);//递归扩展}}}else{printf("坐标非法!\n");}return 1;
}
int IsWin(char board[ROWS][COLS],int row,int col, int* p)
{int count = 0;for (int i = 1; i <= row; i++)//遍历所有格子,看看是否已经排查完{for (int j = 1; j <= col; j++){if (board[i][j] != '*' && board[i][j] != '!' && board[i][j] != '?'){count++;}}}if (count == row * col - MINES||*p==MINES)//如果排查完,或者成功标记完雷的个数{return 1;//游戏胜利}return 0;
}

                                              完结撒花,完结撒花 !!

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

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

相关文章

数据库故障Waiting for table metadata lock

场景&#xff1a;早上来发现一个程序&#xff0c;链接mysql数据库有点问题&#xff0c;随后排查&#xff0c;因为容器在k8s里面。所以尝试重启了pod没有效果 一、重启pod: 这里是几种在Kubernetes中重启Pod的方法: 删除Pod,利用Deployment重建 kubectl delete pod mypodDepl…

python爬虫进阶篇:利用Scrapy爬取同花顺个股行情并发送邮件通知

一、前言 上篇笔记我记录了scrapy的环境搭建和项目创建和第一次demo测试。本篇我们来结合现实场景利用scrapy给我们带来便利。 有炒股或者其它理财产品的朋友经常会关心每日的个股走势&#xff0c;如果结合爬虫进行实时通知自己&#xff0c;并根据自己预想的行情进行邮件通知&…

跟着我学Python进阶篇:01.试用Python完成一些简单问题

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

Nodejs 第三十章(防盗链)

防盗链&#xff08;Hotlinking&#xff09;是指在网页或其他网络资源中&#xff0c;通过直接链接到其他网站上的图片、视频或其他媒体文件&#xff0c;从而显示在自己的网页上。这种行为通常会给被链接的网站带来额外的带宽消耗和资源浪费&#xff0c;而且可能侵犯了原始网站的…

听一些大神说测试前途是IT里最差的,真的是这样吗?

一&#xff1a;行业经历 测试行业爬模滚打7年&#xff0c;从点点点的功能测试到现在成为高级测试&#xff0c;工资也翻了几倍&#xff1b;个人觉得&#xff0c;测试的前景并不差&#xff0c;只要自己肯努力&#xff1b;我刚出来的时候是在鹅厂做外包的功能测试&#xff0c;天天…

ROS通信频率变慢、低于设定值的解决方法

1 问题 ROS gazebo以100Hz的频率发消息&#xff0c;触发A节点的回调函数&#xff0c;进而回调函数发送新消息到B节点。理论上新消息的频率也应该是100Hz。但是用rqt_topic查看发现&#xff0c;频率只有30多Hz。 2 解决 在初始化Subscriber的时候加上ros::TransportHints().…

【halcon深度学习之那些封装好的库函数】determine_dl_model_detection_param

determine_dl_model_detection_param 目标检测的数据准备过程中的有一个库函数determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数&#xff0c;强烈建议…

C++命名空间(超详细)using namespace std

文章目录 前言一、为什么要有命名空间二、命名空间的定义1.正常定义2.嵌套定义3.多文件 三、命名空间的使用1.命名空间名称作用域限定符2.使用using将命名空间某个成员引入3.使用using namespace将整个命名空间引入 四、c标准库总结 前言 在本文章中&#xff0c;我们将要详细介…

Linux服务器nginx部署Vue前端(详细版)

提示&#xff1a;适用于前后端项目的部署 文章目录 前言一、打包前端文件二、下载和部署Nginx三、配置conf文件启动nginx 前言 搜索到这篇文章想必你已经对Nginx比较了解&#xff0c;我也不对Nginx进行介绍赘述了&#xff0c;只需要明白Nginx本身也是一个静态资源的服务器&…

23种设计模式【创建型模式】详细介绍之【原型模式】

23种设计模式【创建型模式】详细介绍之【原型模式】 设计模式的分类和应用场景总结原型模式设计模式系列&#xff1a;深入理解原型模式&#xff08;Prototype Pattern&#xff09;什么是原型模式&#xff1f;为什么使用原型模式&#xff1f;原型模式的实现方式原型模式的代码示…

Python Opencv实践 - 手部跟踪

使用mediapipe库做手部的实时跟踪&#xff0c;关于mediapipe的介绍,请自行百度。 mediapipe做手部检测的资料&#xff0c;可以参考这里&#xff1a; MediaPipe Hands: On-device Real-time Hand Tracking 论文阅读笔记 - 知乎论文地址&#xff1a; https://arxiv.org/abs/2006…

Echarts自定义样式实现3D柱状图-长方体-圆柱体,两种样式

Echarts自定义样式实现3D柱状图-长方体-圆柱体&#xff0c;两种样式 效果图代码series配置项目 效果图 长方体 柱状体 代码 <!--此示例下载自 https://echarts.apache.org/examples/zh/editor.html?cbar3d-dataset&gl1 --> <!DOCTYPE html> <html lang…

解决ESP8266无法退出透传问题以及获取网络时间以及天气方法

网上很多配置ESP8266的教程&#xff0c;但是遇到无法退出透传模式的情况却没有找得到答案&#xff0c;不知道是大家都没遇到还是怎么样&#xff0c;以下是我的解决方法&#xff1a;实测有效 先发送“”&#xff08;三个加号&#xff09;&#xff08;如果是在串口调试助手调试&…

做一个wiki页面是体验HTML语义的好方法

HTML语义&#xff1a;如何运用语义类标签来呈现Wiki网页 在上一篇文章中&#xff0c;我花了大量的篇幅和你解释了正确使用语义类标签的好处和一些场景。那么&#xff0c;哪些场景适合用到语义类标签呢&#xff0c;又如何运用语义类标签呢&#xff1f; 不知道你还记不记得在大…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

easyexcel常见注解

easyexcel常见注解 一、依赖 <!--阿里巴巴EasyExcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>二、常见注解 ExcelProperty 注解中…

漏洞复现-log4j2原理分析及CVE-2021-44228

log4j2原理分析及漏洞复现 0x01 log4j2简介 Log4j2 是一个用于 Java 应用程序的成熟且功能强大的日志记录框架。它是 Log4j 的升级版本&#xff0c;相比于 Log4j&#xff0c;Log4j2 在性能、可靠性和灵活性方面都有显著的改进。 Log4j2 特点 高性能&#xff1a;Log4j2 使用异步…

TensorRT 简单介绍

一、TensorRT 对于算法工程师来说&#xff0c;相信大家已经对TensorRT耳熟能详了&#xff0c;那么这个TensorRT是什么呢&#xff1f; 其实&#xff0c;TensorRT是一个可以在NVIDIA各种GPU硬件平台下运行的推理引擎&#xff0c;同时也是一个高性能的深度学习推理优化器&#x…

你知道跨站脚本攻击吗?一篇带你了解什么叫做XSS

1.XSS简介 &#xff08;1&#xff09;XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&#xff0c;本名应该缩写为CSS&#xff0c;但是由于CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式脚本&#x…