当前位置: 首页 > 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;所以需…...

惠州做网站开发/网站查找工具

方法1&#xff1a;使用name属性选择器 name属性选择器可用于按name属性选择元素。此选择器选择值与指定值完全相等的元素。 语法&#xff1a;[name“nameOfElement”] 示例&#xff1a; 输出&#xff1a; 方法2&#xff1a;使用javascript按名称获取元素并将其传递给jQuer…...

2017做那个网站致富/b2b十大平台排名

科技美学|大家测 活动(第191127期)由科技美学与 飞宇科技联合发起&#xff0c;邀你一起来试用最新的北通J1手游按键2只“ 参加本活动您需要付费 0元 ”报名地址&#xff1a;https://www.wenjuan.com/s/YnaeIzH/本期测评产品亮点介绍&#xff1a;北通J1手游按键&#xff0c;最新…...

抚州 提供网站建站 公司/国内seo排名

01 Java技术概览 02Java开发工具及环境设置 03Java语言中的数据类型与运算符 04程序设计中的流程控制 05数组 06字符串的处理 07 类和对象 08重载和包 09继承和多态 第10章 接口与内部类 最后 我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料&#xff0c;供大家…...

南县做网站推荐/百度推广话术全流程

送给年轻女孩的话&#xff1a;不想成为女强人的话就早点嫁了吧&#xff01; 2010-10-10 13:07:55标签&#xff1a;婚姻 事业 感情     [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和…...

免费wap自助建站系统/百度推广平台首页

刚看到是3xian大牛的题就让我菊花一紧&#xff0c;觉着这题肯定各种高端大气上档次&#xff0c;结果果然没让我失望。 刚开始我以为是一个普通的线段树区间求和&#xff0c;然后啪啪啪代码敲完测试没通过&#xff0c;才注意到这个求和是要去掉相同的值的。 前两天我在做一道题的…...

做暧嗳网站/百度网络营销推广

本文来自项目作者评论区的投稿&#xff0c;内容转载自&#xff1a;LABLOG &#xff0c;博主并未亲测&#xff01;博主看了一下&#xff0c;操作难道略大&#xff0c;动手能力强的兄弟可以折腾一下&#xff01;等待作者进一步优化普通用户的可操作性。本项目受 Oneindex启发&…...