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

C语言之扫雷游戏实现篇

目录

主函数test.c

菜单函数

选择循环

扫雷游戏实现分析

整体思路 

问题1

问题2 

问题3

问题4 

游戏函数(函数调用) 

创建游戏盘数组mine

创建游戏盘数组show

初始化游戏盘数组InitBoard

展示游戏盘DisplayBoard

游戏盘置雷SetMine

游戏盘排雷FindMine

test.c总代码

头文件&函数声明game.h

头文件的包含

游戏符号声明

游戏函数声明

game.h总代码

游戏函数game.c

初始化游戏盘InitBoard

展示游戏盘DisplayBoard

优化1

优化2

游戏盘置雷SetMine

游戏盘排雷FindMine

雷炸死  

非雷计算

找完雷

总循环

game.c总代码


今天我们接着来讲扫雷游戏的实现。🙂🙂

主函数test.c

菜单函数

void menu()
{printf("*******************\n");printf("*******Play.1******\n");printf("*******Over.2******\n");printf("*******************\n");
}

选择循环

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{printf("*******************\n");printf("*******Play.1******\n");printf("*******Over.2******\n");printf("*******************\n");
}
void game()
{printf("开始扫雷游戏\n");
}
int main()
{int input = 0;srand((unsigned int)time(NULL));do{printf("欢迎来到扫雷游戏!\n");menu();printf("请输入您的选择:\n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("游戏结束\n");break;default:printf("输入选择有误,请重新选择\n");break;}} while (input);
}

以上代码我们已经写过三遍了,相信大家都非常熟悉了,不在过多阐述。 

扫雷游戏实现分析

整体思路 

  • 首先游戏盘9✖9,游戏盘上布置了10个雷
  • 如果游戏盘的某处坐标不是雷,就计算这个位置的周围3✖3的8个坐标有几个雷且显示雷个数
  • 如果游戏盘的某处坐标是雷,就炸死了,显示游戏结束
  • 如果把游戏盘上所有非雷的位置全部找出来了,显示排雷成功,游戏结束。 
  • 两个完全贴合的字符数组游戏盘

问题1

我们用字符'0'表示非雷,'1'表示是雷。
但是格子里还要显示周围3✖3的各自雷的个数,数字1字符'1'会容易搞混,怎么办?

 所以我们需要两个游戏盘

  • mine游戏盘。游戏盘初始化为字符'0'和'1'随机循环的布置10个雷的位置。玩家在扫雷的时候计算雷的个数
  • show游戏盘。游戏盘的展示。游戏盘初始化为字符'*'。玩家扫雷的时候显示周围3✖3的8个坐标的雷的个数
  • 特别提醒:二者必须完全无缝贴合🆗🆗

问题2 

刚刚我们提到mine游戏盘是扫雷时计算某个坐标的周围3✖3的8个坐标的雷的个数,那如果时周围的坐标该怎么办,如果计算,已经数组越界了 ???

 

所以我们要拓展我们的游戏盘,我们创建一个11✖11的游戏盘,但我们只访问9✖9的游戏盘

特别提醒:为了我们的便捷的实现我们的扫雷游戏,我们的两个游戏盘必须无缝贴合,所以我们的show显示游戏盘也要拓展到11✖11。 

问题3

我们扫雷游戏的实现涉及初始化,游戏盘的展示等都需要用到循环 ,那循环条件条件的控制?

特别提醒:

特别需要注意循环条件,数组的下标是从0开始。

初始化数组就是0~10

访问数组就是1~9 

问题4 

当玩家输入坐标,没有输入雷被炸死,这时我们需要显示雷的坐标,那怎样去计算雷的个数?

 游戏盘数组mineshow都初始化为字符。现在我们要将字符转化为数字。

 根据字符和数字的ASCII码值。我们知道'0'数值为48,'1'数值为49。

 所以我们知道 '1'-'0'=1   '0'-'0'=0

 所以我们可以将(x,y)周围8个字符坐标分别减去'0'可以得到数字再全加到一起得总数字

 或者我们也可以先将(x,y)周围8个坐标字符坐标 加到一起再一起减去8*'0'得到总数字

游戏函数(函数调用) 

创建游戏盘数组mine

char mine[ROWS][COLS]={0};

创建游戏盘数组show

char show[ROWS][COLS]={0};

初始化游戏盘数组InitBoard

  • 创建一个InitBoard函数,去分别初始化两个数组mine和show
  •  初始化内容不一样,所以把初始化内容当作参数分别传给函数InitBoard
  • 初始化时传参时11✖11,为了后面计算游戏盘某坐标 周围8个坐标 里雷的个数 
InitBoard(mine, ROWS, COLS, '0');//初始化是11✖11
InitBoard(show, ROWS, COLS, '*');

展示游戏盘DisplayBoard

  • 展示游戏盘,只需要访问9✖9的游戏盘。 
DisplayBoard(mine, ROW, COL);//多余的//访问是9✖9
DisplayBoard(mine, ROW, COL);

游戏盘置雷SetMine

SetMine(mine, ROW, COL);
DisplayBoard(mine, ROW, COL);//多余的

游戏盘排雷FindMine

FindMine(mine, show, ROW, COL);
//传mine数组过去计算雷
//传show数组展示计算雷的结果

test.c总代码

//扫雷游戏的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{printf("*******************\n");printf("*******Play.1******\n");printf("*******Over.2******\n");printf("*******************\n");
}
void game()
{printf("开始扫雷游戏\n");char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };InitBoard(mine, ROWS, COLS, '0');//InitBoard(show, ROWS, COLS, '*');//DisplayBoard(mine, ROW, COL);//多余的//访问是9✖9DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//多余的//排除雷——扫雷FindMine(mine, show, ROW, COL);//传mine数组过去计算雷//传show数组展示计算雷的结果}
int main()
{int input = 0;srand((unsigned int)time(NULL));do{printf("欢迎来到扫雷游戏!\n");menu();printf("请输入您的选择:\n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("游戏结束\n");break;default:printf("输入选择有误,请重新选择\n");break;}} while (input);
}

头文件&函数声明game.h

头文件的包含

在我们写代码的过程中,会调用库函数,需要包含头文件,和声明函数。

所以我们将所有函数声明和头文件放到我们.h 文件中。

当然,在其他.c文件需要使用时,我们只需要包含 我们创造的 头文件"game.h" 即可。 

//#include"game.h"
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

游戏符号声明

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10

游戏函数声明

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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col);
//不能board,重复参数名

game.h总代码

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col);
//不能board,重复参数名

游戏函数game.c

初始化游戏盘InitBoard

  • 数组下标是从0开始的,所以初始化i是0~10 
#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++)//i=0~10{for (j = 0; j < cols; j++)//j=0~10{board[i][j] = set;}}
}

展示游戏盘DisplayBoard

  •  数组下标是从0开始,所以访问是0~9
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

当然我们的mine函数是不会展示的。当玩家输入坐标时还要去数,所以以上代码还能不能优化? 

优化1

  • 玩家输入坐标时,还是几行几列去寻找,所以我们选择直接把号码打印出来。
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//打印列号for (i = 0; i <= col; i++)//i从0开始,因为行占用了一格{printf("%d ", i);}printf("\n");//打印数字for (i = 1; i <= row; i++){printf("%d ", i);//打印行号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

优化2

  • 上下文的文字显得眼花缭乱,所以我们加上分割线就不会缭乱了。 
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//打印列号printf("--------------扫雷--------------\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");//打印数字for (i = 1; i <= row; i++){printf("%d ", i);//打印行号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("--------------扫雷--------------\n");
}

优化之后 

游戏盘置雷SetMine

  • 关于随机数rand,先调用srand
  • 随机数rand()%row的范围0~8
  • 随机数rand()%row+1的范围1~9
  • 关于布置雷需要在mine函数里面去实现
  • while循环的次数肯定不止EASY_COUNT
void SetMine(char board[ROWS][COLS], int row, int col)
{//布置雷——循环随机数直到布置完10个雷停止int count = EASY_COUNT;while (count)//直到10个雷布置完毕退出循环{int x = rand() % row + 1;int y = rand() % col + 1;//产生的坐标就是(0,0)~(9,9)if (board[x][y] == '0')//条件设置,不能重复计算已经设置过的地方即为1的地方{board[x][y] = '1';count--;}}
}

 

游戏盘排雷FindMine

雷炸死  

  •  坐标为雷就炸死,游戏结束
printf("请输入要查找的雷\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//输入的坐标要合法
{if (mine[x][y] == '1')//被炸死的条件{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}
}
else//玩家输入非法坐标,重新输入
{printf("坐标非法,请重新输入\n");
}

非雷计算

  •  坐标不为雷,mine计算雷,show展示雷
  •  计算l雷个数的函数GetMineCount
//统计雷的个数
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';
}int win=0;
if (x >= 1 && x <= row && y >= 1 && y <= col)
{if{}else//没有被炸死,显示雷的个数{//不是雷,就统计x,y坐标周围有几个雷int c = GetMineCount(mine, x, y);show[x][y] = c + '0';//数字+'0'=字符数字放置到字符数组里去DisplayBoard(show, ROW, COL);//展示字符数字——雷的个数,每排查一次都要显示雷的个数win++;//每排查一次雷,雷的个数减少一次,距离循环结束++一次}
}
else//玩家输入非法坐标,重新输入
{printf("坐标非法,请重新输入\n");
}

找完雷

  •  坐标找完雷,游戏结束
//炸死和排排完雷都跳出循环
if (win == row * col - EASY_COUNT)//设置条件只有排完雷才通关
{printf("恭喜你排雷成功,游戏通关\n");DisplayBoard(mine, ROW, COL);
}

总循环

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';
}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("请输入要查找的雷\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//输入的坐标要合法{if (mine[x][y] == '1')//被炸死的条件{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else//没有被炸死,显示雷的个数{//不是雷,就统计x,y坐标周围有几个雷int c = GetMineCount(mine, x, y);show[x][y] = c + '0';//数字+'0'=字符数字放置到字符数组里去DisplayBoard(show, ROW, COL);//展示字符数字——雷的个数//每排查一次都要显示雷的个数win++;//每排查一次雷,雷的个数减少一次,距离循环结束++一次}}else//玩家输入非法坐标,重新输入{printf("坐标非法,请重新输入\n");}}//炸死和排排完雷都跳出循环if (win == row * col - EASY_COUNT)//设置条件只有排完雷才通关{printf("恭喜你排雷成功,游戏通关\n");DisplayBoard(mine, ROW, COL);}
}

game.c总代码

#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++)//i=0~10{for (j = 0; j < cols; j++)//j=0~10{board[i][j] = set;}}
}
//分别传两个数组,初始化自己想要初始化的字符void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//打印列号printf("--------------扫雷--------------\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");//打印数字for (i = 1; i <= row; i++){printf("%d ", i);//打印行号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("--------------扫雷--------------\n");
}void SetMine(char board[ROWS][COLS], int row, int col)
{//布置雷——循环随机数直到布置完10个雷停止int count = EASY_COUNT;while (count)//直到10个雷布置完毕退出循环{int x = rand() % row + 1;int y = rand() % col + 1;//产生的坐标就是(0,0)~(9,9)if (board[x][y] == '0')//条件设置,不能重复计算已经设置过的地方即为1的地方{board[x][y] = '1';count--;}}
}
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';
}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("请输入要查找的雷\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//输入的坐标要合法{if (mine[x][y] == '1')//被炸死的条件{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else//没有被炸死,显示雷的个数{//不是雷,就统计x,y坐标周围有几个雷int c = GetMineCount(mine, x, y);show[x][y] = c + '0';//数字+'0'=字符数字放置到字符数组里去DisplayBoard(show, ROW, COL);//展示字符数字——雷的个数//每排查一次都要显示雷的个数win++;//每排查一次雷,雷的个数减少一次,距离循环结束++一次}}else//玩家输入非法坐标,重新输入{printf("坐标非法,请重新输入\n");}}//炸死和排排完雷都跳出循环if (win == row * col - EASY_COUNT)//设置条件只有排完雷才通关{printf("恭喜你排雷成功,游戏通关\n");DisplayBoard(mine, ROW, COL);}
}

✔✔✔✔✔最后,感谢大家的阅读,后续可能会函数递归优化,若有错误和不足,欢迎指正!

迎来新的学期,希望大家继续坚持在每天敲代码的路上。🙂🙂🙂学习的小伙伴

代码---------→【gitee:https://gitee.com/TSQXG】

联系---------→【邮箱:2784139418@qq.com】

相关文章:

C语言之扫雷游戏实现篇

目录 主函数test.c 菜单函数 选择循环 扫雷游戏实现分析 整体思路 问题1 问题2 问题3 问题4 游戏函数&#xff08;函数调用&#xff09; 创建游戏盘数组mine 创建游戏盘数组show 初始化游戏盘数组InitBoard 展示游戏盘DisplayBoard 游戏盘置雷SetMine 游戏…...

Python面向对象中super用法与MRO机制

Python面向对象中super用法与MRO机制 最近再看trackformer&#xff0c;里面用到了super的用法&#xff0c;记录一下super的用法 class A(object):def __init__(self):print(init A)def fun(self):print(A.fun)print(self)super(A, self).fun()class B(object):def __init__(s…...

高性能网络模式-Reactor

事实上&#xff0c;Reactor 模式也叫Dispatcher模式&#xff0c;即I/O 多路复⽤监听事件&#xff0c;收到事件后&#xff0c;根据事件类型分配&#xff08;Dispatch&#xff09;给某个进程/线程。Reactor 模式也是一种非阻塞同步网络模式。 Reactor 模式主要由 Reactor部分和处…...

gRpc的四种通信方式详细介绍

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

JWT令牌的介绍

目录 一、什么是JWT 二、JWT令牌和Cookie客户端、Session服务端对比 三、特点与注意事项 四、使用场景 优点&#xff1a; 五、结构组成 一、什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用间传递信息的开放标准&#xff08;RFC 7519&#x…...

C语言入门 Day_9 条件判断

目录 前言&#xff1a; 1.if判断 2.else判断 3.易错点 4.思维导图 前言&#xff1a; 我们知道比较运算和逻辑运算都会得到一个布尔型的数据&#xff0c;要么为真&#xff08;true&#xff09;&#xff0c;要么为假&#xff08;false&#xff09;。 今天我们来学习真和假在…...

Nodejs-nrm:快速切换npm源 / npm官方源和其他自定义源之间切换

一、理解 Nodejs nrm Nodejs nrm 是一个管理 npm 源的工具。由于 npm 在国内的速度较慢&#xff0c;很多开发者会使用淘宝的 npm 镜像源&#xff0c;但是也会遇到一些问题&#xff0c;例如某些包在淘宝镜像源中不存在&#xff0c;或者淘宝镜像源本身也会有问题。 Nodejs nrm …...

数据驱动洞察:各种词频分析技术挖掘热点数据

一、引言 随着信息时代的发展&#xff0c;人们的关注点日益复杂多样。社交媒体、新闻网站和论坛等平台上涌现了大量的信息&#xff0c;这使得热点分析成为了解社会热点话题和舆情动向的重要手段。词频统计是热点分析的基础&#xff0c;本文将分别介绍基于ElasticSearch、基于S…...

ES6-简介、语法

ES6 ES6简介 ​ ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语…...

诚迈科技子公司智达诚远与Unity中国达成合作,打造智能座舱新时代

2023 年 8 月 23 日&#xff0c;全球领先的实时 3D 引擎 Unity 在华合资公司 Unity 中国举办发布会&#xff0c;正式对外发布 Unity 引擎中国版——团结引擎&#xff0c;并带来专为次世代汽车智能座舱打造的团结引擎车机版。发布会上&#xff0c;诚迈科技副总裁、诚迈科技子公司…...

算法与数据结构(十)--图的入门

一.图的定义和分类 定义&#xff1a;图是由一组顶点和一组能够将两个顶点连接的边组成的。 特殊的图&#xff1a; 1.自环&#xff1a;即一条连接一个顶点和其自身的边; 2.平行边&#xff1a;连接同一对顶点的两条边&#xff1b; 图的分类&#xff1a; 按照连接两个顶点的边的…...

【Go 基础篇】Go语言 init函数详解:包的初始化与应用

介绍 在Go语言中&#xff0c;init() 函数是一种特殊的函数&#xff0c;用于在包被导入时执行一次性的初始化操作。init() 函数不需要手动调用&#xff0c;而是在包被导入时自动执行。这使得我们可以在包导入时完成一些必要的初始化工作&#xff0c;确保包的使用具有正确的环境…...

wazuh环境配置及漏洞复现

目录 一、wazuh配置 1进入官网下载OVA启动软件 2.虚拟机OVA安装 二、wazuh案例复现 1.wazuh初体验 2.这里我们以SQL注入为例&#xff0c;在我们的代理服务器上进行SQL注入&#xff0c;看wazuh如何检测和响应 一、wazuh配置 1进入官网下载OVA启动软件 Virtual Machine (O…...

Java接收前端请求体方式

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 文章目录 RequestBodyPathVariableRequestParamValidated方法参数校验方法返回值校验 RequestHeaderHttpServletRequest ## Java接收前端请求体的方式 请求体&#xf…...

私有化部署即时通讯平台,30分钟替换钉钉和企业微信

随着企业对即时通讯和协作工具的需求不断增长&#xff0c;私有化部署的即时通讯平台成为企业的首选。WorkPlus作为有10余年行业深耕经验与技术沉淀品牌&#xff0c;以其安全高效的私有化部署即时通讯解决方案&#xff0c;帮助企业在30分钟内替换钉钉和企业微信。本文将深入探讨…...

如何深入理解 Node.js 中的流(Streams)

Node.js是一个强大的允许开发人员构建可扩展和高效的应用程序。Node.js的一个关键特性是其内置对流的支持。流是Node.js中的一个基本概念&#xff0c;它能够实现高效的数据处理&#xff0c;特别是在处理大量信息或实时处理数据时。 在本文中&#xff0c;我们将探讨Node.js中的流…...

MSP430FR2xxx开发(一)添加driverlib

一、新建工程 根据自己手上的硬件型号新建工程&#xff0c;文中已MSP430FR2355为例。 二、添加driverlib 首先去官方下载driverlib. https://www.ti.com.cn/tool/cn/MSPDRIVERLIB?keyMatchMSP430%20DRIVERLIB#downloads 下载后的内容如下&#xff1a; 我这里就选择MSP430…...

【C++】做一个飞机空战小游戏(九)——发射子弹的编程技巧

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…...

34.SpringMVC获取请求参数

SpringMVC获取请求参数 通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 index.html <form th:action"{/test/param}" method"post">用户名&#…...

TC1016-同星4路CAN(FD),2路LIN转USB接口卡

TC1016是同星智能推出的一款多通道CAN&#xff08;FD&#xff09;和LIN总线接口设备&#xff0c;CANFD总线速率最高支持8M bps&#xff0c;LIN支持速率0~20K bps&#xff0c;产品采用高速USB2.0接口与PC连接&#xff0c;Windows系统免驱设计使得设备具备极佳的系统兼容性。 支…...

Android源码——从Looper看ThreadLocal

1 概述 ThreadLocal用于在当前线程中存储数据&#xff0c;由于存储的数据只能在当前线程内使用&#xff0c;所以自然是线程安全的。 Handler体系中&#xff0c;Looper只会存在一个实例&#xff0c;且只在当前线程使用&#xff0c;所以使用ThreadLocal进行存储。 2 存储原理 …...

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及JDBC示例(4)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

MySQL 自定义 split 存储过程

MySQL 没有提供 split 函数&#xff0c;但可以自己建立一个存储过程&#xff0c;将具有固定分隔符的字符串转成多行。之所以不能使用自定义函数实现此功能&#xff0c;是因为 MySQL 的自定义函数自能返回标量值&#xff0c;不能返回多行结果集。 MySQL 8&#xff1a; drop pr…...

专题-【十字链表】

有向图的十字链表表示法&#xff1a;...

微信小程序教学系列(2)

第二章&#xff1a;小程序开发基础 1. 小程序页面布局与样式 在小程序开发中&#xff0c;我们可以使用 WXML&#xff08;WeiXin Markup Language&#xff09;和 WXSS&#xff08;WeiXin Style Sheet&#xff09;来定义页面的布局和样式。 1.1 WXML基础 WXML 是一种类似于 H…...

社科院与美国杜兰大学金融管理硕士项目——畅游于金融世界

随着社会经济的不断发展&#xff0c;职场竞争愈发激烈&#xff0c;很多同学都打算通过报考研究生来实现深造&#xff0c;提升自己的综合能力和竞争优势&#xff0c;获得优质的证书。而对于金融专业的学生和在职人员来说&#xff0c;社科院与美国杜兰大学金融管理硕士项目是一个…...

功能强大、超低功耗的STM32WL55JCI7、STM32WL55CCU7、STM32WL55CCU6 32位无线远距离MCU

STM32WL55xx 32位无线远距离MCU嵌入了功能强大、超低功耗、符合LPWAN标准的无线电解决方案&#xff0c;可提供LoRa、(G)FSK、(G)MSK和BPSK等各种调制。STM32WL55xx无线MCU的功耗超低&#xff0c;基于高性能Arm Cortex-M4 32位RISC内核&#xff08;工作频率高达48MHz&#xff09…...

【自适应稀疏度量方法和RQAM】疏度测量、RQAM特征、AWSPT和基于AWSPT的稀疏度测量研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

sql递归查询

一、postgresql 递归sql with recursive p as(select t1.* from t_org_test t1 where t1.id2union allselect t2.*from t_org_test t2 join p on t2.parent_idp.id) select id,name,parent_id from p; sql中with xxxx as () 是对一个查询子句做别名&#xff0c;同时数据库会对…...

常见前端面试之VUE面试题汇总三

7. Vue 中封装的数组方法有哪些&#xff0c;其如何实现页面更新 在 Vue 中&#xff0c;对响应式处理利用的是 Object.defineProperty 对数据进 行拦截&#xff0c;而这个方法并不能监听到数组内部变化&#xff0c;数组长度变化&#xff0c;数 组的截取变化等&#xff0c;所以需…...

Three.js 实现模型材质分解,拆分,拆解效果

原理&#xff1a;通过修改模型材质的 x,y,z 轴坐标 positon.set( x,y,z) 来实现拆解&#xff0c;分解的效果。 注意&#xff1a;支持模型材质position 修改的材质类型为 type“Mesh” ,其他类型的材质修改了position 可能没有实际效果 在上一篇 Three.js加载外部glb,fbx,gltf…...

《JVM修仙之路》初入JVM世界

《JVM修仙之路》初入JVM世界 博主目前正在学习JVM的相关知识&#xff0c;想以一种不同的方式记录下&#xff0c;娱乐一下 清晨&#xff0c;你睁开双眼&#xff0c;看到刺眼的阳光&#xff0c;你第一反应就是完了完了&#xff0c;又要迟到了。刚准备起床穿衣的你突然意识到不对&…...

苍穹外卖 day1 搭建成功环境

引入 idea找不到打包生成的文件目录怎么办&#xff0c;首先点击这个小齿轮 show ecluded files然后就能找到隐藏的文件 这个jar包内含tomcat&#xff0c;可以直接丢在linux上用 开发环境&#xff1a;开发人员在开发阶段使用的环境&#xff0c;一般外部用户无法访问 测试环…...

智能主体按照功能划分

(1) 构件接口主体 构件接口主体提供构件与用户之间的接口。当一个用户通过代理主体向 元组空间提出申请&#xff0c;并找到相匹配的构件主体时&#xff0c;此构件主体会将其所在构件主体 组中的构件接口主体通过申请用户的代理主体传送到用户的界面。 (2) 构件主体 通过构…...

python中的matplotlib画折线图(数据分析与可视化)

先导包&#xff08;必须安装了numpy 、pandas 和matplotlib才能导包&#xff09;&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt核心代码&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.se…...

大数据数据仓库

一.在线教育 1.数据采集 1.数仓概念 数据仓库是为企业制定决策&#xff0c;提供数据支持的。数据采集和存储、对数据进行计算和分析 2.项目架构 2.数据分类 业务数据 用户行为数据 爬虫数据 2.离线数仓 3.实时数仓...

Java“牵手“速卖通商品详情页面数据获取方法,速卖通API实现批量商品数据抓取示例

速卖通商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取速卖通商品详情数据&#xff0c;您可以通过开放平台的接口或者直接访问速卖通商城的网页来获取商品详情信息。以下是两种常用方法的介绍&#xff1a;…...

【Git】代码误推送还原(真实项目环境,非纸上谈兵)

背景 RT&#xff0c; 我今天眼睛花了&#xff0c;不小心把工作分支【合并】到了一个不相干的功能分支上&#xff0c;并且代码已经推送到远程仓库了。于是&#xff0c;只能尝试还原到上一次提交中。 【合并】分支有一个点我们是不可避免的&#xff0c;文字很难描述&#xff0c;…...

CPU 飙升?这3大场景助你精准定位

1 常用的 Load 分析方法 CPU高、Load高 通过 top 命令查找占用CPU最高的进程PID&#xff1b; 通过top -Hp PID查找占用CPU最高的线程TID; 对于java程序&#xff0c;使用jstack打印线程堆栈信息&#xff1b; 通过printf %x tid打印出最消耗CPU线程的十六进制&#xff1b; …...

6、Spring_Junit与JdbcTemplate整合

Spring 整合 1.Spring 整合 Junit 1.1新建项目结构 1.2导入依赖 导入 junit 与 Spring 依赖 <!-- 添加 spring 依赖--> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version…...

Redis是如何保证高可用的?

Redis这种基于内存的关系型数据库我们在选用的时候就是考虑到它的快。而且可以很方便的实现诸如分布式锁、消息队列等功能。 笔者在前一段秋招面试的时候就被提问&#xff0c;“Redis是怎么保证高可用的&#xff1f;” 后续的子问题包含&#xff0c;集群模式是怎么实现的&…...

精益求精:通付盾安卓应用加固升级,为移动安全保驾护航!

在如今竞争激烈的移动应用领域&#xff0c;保障应用资源的安全性成为刻不容缓的任务。最近&#xff0c;通付盾针对资源加密方案进行了全面升级&#xff0c;大幅增强了其兼容性&#xff0c;实现了更全面的资源文件类型保护。这次升级为移动应用的安全性和稳定性迈出了坚实的一步…...

javaweb01-html、css基础

话不多说&#xff0c;先来一张泳装板鸭镇楼 接上一开篇&#xff0c; 首战以web的三大基石开头&#xff08;html、css、js&#xff09;&#xff0c;js内容比较多&#xff0c;下一序章讲解&#xff0c;这一章节主要以html和css为主。 目录 一、初始web前端 二、HTML标签结构 三、…...

牛客复盘] 2023河南萌新联赛第(七)场:信息工程大学 B\I 20230823

牛客复盘] 2023河南萌新联赛第&#xff08;七&#xff09;场&#xff1a;信息工程大学 B\I 20230823 总结B 七夕1. 题目描述2. 思路分析3. 代码实现 I 细胞分裂1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 场外OB做了B和I题&#xff0c;只能说这场有点离谱。B 并查…...

使用PyMuPDF添加PDF水印

使用Python添加PDF水印的博客文章。 C:\pythoncode\new\pdfwatermark.py 使用Python在PDF中添加水印 在日常工作中&#xff0c;我们经常需要对PDF文件进行处理。其中一项常见的需求是向PDF文件添加水印&#xff0c;以保护文件的版权或标识文件的来源。本文将介绍如何使用Py…...

window如何实时刷新日志文件

1 安装windows git 下载地址&#xff1a;Git - Downloading Package (git-scm.com) 2 打开git bash 输入tail.exe -f 日志文件路径...

动态代理的两个使用方式(手动实现+SpringAOP实现)-Demo

一、手动实现 1、具体代码 package com.xch.proxy;/*** 具体业务接口** author XuChenghe* date 2023/8/18 15:09*/ public interface Star {/*** 唱歌方法** param name* return*/String sing(String name);/*** 跳舞方法*/void dance();} package com.xch.proxy;/*** 具体…...

面试话术(MQ+mybatis+nginx+redis+ssm+mysql+linux)

面试话术 RabbitMq1、介绍一下rabbitmq2、如何保证消息确定消息发送成功&#xff0c;并且被消费成功&#xff0c;有什么保障措施3、如何保证消息不被重复消费4、RabbitMQ 宕机了怎么处理 授权话术1、你给我说一下授权认证&#xff08;登陆注册&#xff09;的逻辑2、说一下jwt3、…...

JSON的理解

文章目录 1、什么是JSON2、为什么要用JSON3、JSON的格式规定3.1 对象&#xff08;0bject)&#xff1a;对应着JS中的对象3.2 数组&#xff08;Array&#xff09;&#xff1a;对应着JS中的数组形式3.3 简单形式&#xff1a;对应着JS中的基础数据类型 4、JSON和Js的转换5、JSON对象…...

面试热题(二叉树的最大路径)

路径 被定义为一条从树中任意节点出发&#xff0c;沿父节点-子节点连接&#xff0c;达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给定一个二叉树的根节点 root…...