【C语言】贪吃蛇小游戏
文章目录
- 前言
- 一、贪吃蛇游戏代码
- test.c文件
- Snake.h文件
- Snake.c文件
- 二、相关函数的介绍
- 1.COORD
- 2.Win32 API的介绍
- 3.GetStdHandle
- 4.GetConsoleCursorInfo
- 5.CONSOLE_CURSOR_INFO
- 5.SetConsoleCursorInf
- 6.SetConsoleCursorPosition
- 7.GetAsyncKeyState
- 总结
前言
哈喽各位好呀。今天小编来给大家分享一个我们小时候都玩过的小游戏,叫做贪吃蛇。如果大家想玩的话,代码我就放下面啦。
一、贪吃蛇游戏代码
test.c文件
#include"Snake.h"
void test()//完成游戏的测试逻辑
{int ch;do{system("cls");//清理界面//创建贪吃蛇Snake snake = { 0 };//初始化游戏GameStart(&snake);//运行游戏GameRun(&snake); //结束游戏---善后工作GameEnd(&snake); SetPut(22, 14); printf("您是否需要再来一局? Y/N");ch = getchar(); getchar(); } while (ch == 'y' || ch == 'Y'); SetPut(0, 27);
}
int main()
{//设置适应本地环境setlocale(LC_ALL, ""); srand((unsigned int)time(NULL));test();
}
Snake.h文件
#include<locale.h>
#include<windows.h>
#include<stdbool.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#define POS_X 24
#define POS_Y 5
#define WALL L'墙'
#define SNAKE L'蛇'
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)
enum DIRECTION//蛇的方向
{UP=1,DOWN,LEFT,RIGHT
};
enum GAME_STATUS//蛇的状态
{OK,KILL_BY_WALL,KILL_BY_SELF,END_NOMAL };
//蛇身的节点
typedef struct SnakeNode
{//坐标int x;int y;//指向下一个节点的指针struct SnakeNode* next;
}SnakeNode ,*pSnakeNode; typedef struct Snake
{pSnakeNode _pSanke;//指向蛇头的指针pSnakeNode _pFood;//指向食物的指针enum DIRECTION _dir;//蛇的方向enum GAME_STATUS _stutus;//蛇的状态int _food_weight;//一个食物的分数int _score;//总成绩int _sleep_time;//蛇的速度
}Snake,*pSnake; void SetPut(short x, short y); //获取光标出现的位置void GameStart(pSnake ps);//开始游戏
void WelcomeGame();//打印欢迎界面
void GreatMap();//打印地图
void InitGame(pSnake ps);//初始化蛇的相关信息
void CreateFood(pSnake ps);//食物节点void GameRun(pSnake ps);//游戏运行
void PrintHelpInfo();//打印界面右侧信息
bool NextIsFood(pSnakeNode pn, pSnake ps);//判断转向的下一个位置是否有食物
void EatFood(pSnakeNode pn, pSnake ps);//有食物的情况
void NoFood(pSnakeNode pn, pSnake ps);//没有食物的情况
void KillWall(pSnake ps);//撞墙的情况
void KillSelf(pSnake ps);//撞自己的情况
void SnakeMove(pSnake ps);//移动蛇身一步void GameEnd(pSnake ps);//游戏结束
Snake.c文件
#include"Snake.h"
void SetPut(short x, short y)//光标出现的位置
{COORD pos = { x,y };HANDLE hOutput = NULL;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//句柄//CONSOLE_CURSOR_INFO CursorInfo;//GetConsoleCursorInfo(hOutput, &CursorInfo); //获取控制台的光标信息//CursorInfo.bVisible = false;//隐藏光标//SetConsoleCursorInfo(hOutput, &CursorInfo);//设置光标的状态 SetConsoleCursorPosition(hOutput, pos);//光标的位置位pos
}
void WelcomeGame()//欢迎界面的打印
{SetPut(40,14); printf("欢迎来到贪吃蛇小游戏\n"); SetPut(42, 20); system("pause"); system("cls");SetPut(25, 15); wprintf(L"用↑..↓..←..→控制蛇的方向,F3加速,F4减速\n");SetPut(25, 20);wprintf(L"加速可以得到更高的分数\n");SetPut(40, 20);system("pause"); system("cls");
}
void GreatMap()//打印地图
{for (int i = 0; i < 29; i++){wprintf(L"%lc", WALL); }SetPut(0, 26);for (int i = 0; i < 29; i++){wprintf(L"%lc", WALL);}for (int i = 1; i <= 25; i++){SetPut(0,i);wprintf(L"%lc", WALL);}for (int i = 1; i <= 25; i++){SetPut(56, i);wprintf(L"%lc", WALL);}}
void InitGame(pSnake ps)//初始化蛇
{pSnakeNode cur = NULL; for (int i = 0; i < 5; i++)//申请5个节点{cur =(pSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL){perror("Snake::malloc fail\n");exit(1);}cur->next = NULL;cur->x = POS_X + 2 * i;cur->y = POS_Y;//头插连接if (ps->_pSanke == NULL){ps->_pSanke=cur; }else{cur->next = ps->_pSanke;ps->_pSanke = cur; }}cur = ps->_pSanke;while (cur)//打印蛇身{SetPut(cur->x, cur->y);wprintf(L"%lc", SNAKE);cur = cur->next;}ps->_dir = RIGHT;ps->_food_weight = 10;ps->_score = 0;ps->_stutus =OK; ps->_sleep_time = 200;}
void CreateFood(pSnake ps)//食物节点的创建
{int x = 0;int y = 0;
gain:do{x = rand() % 53 + 2; y = rand() % 25 + 1; } while (x % 2 != 0);//食物的位置必须是2的倍数pSnakeNode cur = ps->_pSanke ; //食物节点不能和蛇身重合while (cur){if (x == cur->x && y == cur->y)goto gain; cur = cur->next;}//创建食物节点pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));if (pFood == NULL){perror("malloc fail\n");return;}pFood->x = x; pFood->y = y;pFood->next = NULL;SetPut(pFood->x, pFood->y); wprintf(L"%lc", L'食');ps->_pFood = pFood;
}
void GameStart(pSnake ps)//开始游戏
{//设置窗口大小,隐藏光标system("mode con cols=100 lines=30");system("title 贪吃蛇");HANDLE hOutput = NULL; hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//句柄CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(hOutput, &CursorInfo); //获取控制台的光标信息 CursorInfo.bVisible = false;//隐藏光标SetConsoleCursorInfo(hOutput, &CursorInfo);//设置光标的状态 //打印欢迎界面,功能打印WelcomeGame();//地图的绘制GreatMap();//初始化蛇神InitGame(ps);//创建食物CreateFood(ps);
}
void PrintHelpInfo()
{//打印提⽰信息SetPut(64, 15);printf("不能穿墙,不能咬到⾃⼰\n");SetPut(64, 16); printf("⽤↑.↓.←.→分别控制蛇的移动.");SetPut(64, 17); printf("F3 为加速,F4 为减速\n");SetPut(64, 18);printf("ESC :退出游戏.space:暂停游戏.");SetPut(64, 20); printf("小贾制作\n");
}
void pause()//暂停
{while (1){Sleep(200);if (KEY_PRESS(VK_SPACE)) break;}
}
bool NextIsFood(pSnakeNode pn, pSnake ps)//判断转向的下一个位置是否有食物
{return pn->x == ps->_pFood->x && pn->y == ps->_pFood->y;
}
void EatFood(pSnakeNode pn, pSnake ps)//有食物的情况
{pn->next = ps->_pSanke;ps->_pSanke = pn;pSnakeNode cur = ps->_pSanke;while (cur){SetPut(cur->x, cur->y);wprintf(L"%lc", SNAKE);cur = cur->next;}ps->_score += ps->_food_weight;free(ps->_pFood ); CreateFood(ps);
}
void NoFood(pSnakeNode pn, pSnake ps)//没有食物的情况
{//头插法pn->next = ps->_pSanke; ps->_pSanke = pn; //打印蛇pSnakeNode cur = ps->_pSanke; while (cur->next->next) {SetPut(cur->x, cur->y); wprintf(L"%lc", SNAKE); cur = cur->next; }//最后⼀个位置打印空格,然后释放节点SetPut(cur->next->x, cur->next->y); printf(" "); free(cur->next); cur->next = NULL;
}
void KillWall(pSnake ps)//撞墙的情况
{if (ps->_pSanke->x == 0 || ps->_pSanke->y == 26 ||ps->_pSanke->x == 56 || ps->_pFood->y == 0) ps->_stutus = KILL_BY_WALL;
}
void KillSelf(pSnake ps)//撞自己的情况
{pSnakeNode cur = ps->_pSanke->next ; while (cur){if (ps->_pSanke->x == cur->x && ps->_pSanke->y == cur->y){ps->_stutus = KILL_BY_SELF;break;}cur = cur->next;}
}
void SnakeMove(pSnake ps)//移动蛇身一步
{//创建一个蛇身节点 pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode)); if (pNextNode == NULL){perror("malloc fail\n");return;}switch (ps->_dir){case UP:{pNextNode->x = ps->_pSanke->x;pNextNode->y = ps->_pSanke->y - 1;}break;case DOWN:{pNextNode->x = ps->_pSanke->x; pNextNode->y = ps->_pSanke->y + 1; }break;case LEFT:{pNextNode->x = ps->_pSanke->x - 2; pNextNode->y = ps->_pSanke->y; }break;case RIGHT:{pNextNode->x = ps->_pSanke->x + 2; pNextNode->y = ps->_pSanke->y; } break;}if (NextIsFood(pNextNode, ps)) {EatFood(pNextNode, ps); }else//如果没有⻝物{NoFood(pNextNode, ps); }KillWall(ps);KillSelf(ps);
}
void GameRun(pSnake ps)//游戏运行
{//打印右侧帮助信息PrintHelpInfo();do{SetPut(64, 10); printf("得分:%d ", ps->_score ); printf("每个⻝物得分:%d分", ps->_food_weight ); if (KEY_PRESS(VK_UP) && ps->_dir != DOWN) {ps->_dir = UP; }else if (KEY_PRESS(VK_DOWN) && ps->_dir != UP){ps->_dir = DOWN;}else if (KEY_PRESS(VK_LEFT) && ps->_dir != RIGHT){ps->_dir = LEFT;}else if (KEY_PRESS(VK_RIGHT) && ps->_dir != LEFT){ps->_dir = RIGHT;}else if (KEY_PRESS(VK_SPACE)){pause();}else if (KEY_PRESS(VK_ESCAPE)){ps->_stutus = END_NOMAL; break;}else if (KEY_PRESS(VK_F3)){if (ps->_sleep_time >= 80){ps->_sleep_time -= 30;ps->_food_weight += 2;//⼀个⻝物分数最⾼是20分}}else if (KEY_PRESS(VK_F4)){if (ps->_sleep_time < 320){ps->_sleep_time += 30;ps->_food_weight -= 2;//⼀个⻝物分数最低是2分}}//蛇每次⼀定之间要休眠的时间,时间短,蛇移动速度就快Sleep(ps->_sleep_time ); SnakeMove(ps);} while (ps->_stutus == OK);
}void GameEnd(pSnake ps)//游戏结束
{SetPut(22, 12);switch (ps->_stutus){case END_NOMAL:{printf("正常退出\n");}break;case KILL_BY_WALL:{printf("您撞墙了,游戏结束!\n");}break;case KILL_BY_SELF:{printf("您撞上您自己了\n");}break;}pSnakeNode cur = ps->_pSanke; while (cur)//清除蛇身{pSnakeNode dir = cur; cur = cur->next; free(dir);}
}
二、相关函数的介绍
1.COORD
控制台屏幕上的坐标COORD
2.Win32 API的介绍
Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就就是Microsoft Windows32位平台的应⽤程序编程接⼝。
3.GetStdHandle
GetStdHandle
GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。
HANDLE GetStdHandle(DWORD nStdHandle);
实例:
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
4.GetConsoleCursorInfo
GetConsoleCursorInfo
检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息
BOOL WINAPI GetConsoleCursorInfo(HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标
实例:
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
5.CONSOLE_CURSOR_INFO
这个结构体,包含有关控制台光标的信息
typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
- dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的⽔平线条。
- bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 TRUE。
//示例:
CursorInfo.bVisible = false; //隐藏控制台光标
5.SetConsoleCursorInf
SetConsoleCursorInfo
设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性
BOOL WINAPI SetConsoleCursorInfo(HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);
实例:
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态
6.SetConsoleCursorPosition
SetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。
BOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD pos
);
实例:
COORD pos = { 10, 5};HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值)hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//设置标准输出上光标的位置为posSetConsoleCursorPosition(hOutput, pos);
SetPut:封装一个设置光标位置的函数
//设置光标的坐标
void SetPos(short x, short y)
{COORD pos = { x, y };HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值)hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//设置标准输出上光标的位置为posSetConsoleCursorPosition(hOutput, pos);
}
7.GetAsyncKeyState
GetAsyncKeyState
获取按键情况,GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState(int vKey
);
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
参考:虚拟键码 (Winuser.h) - Win32 apps
总结
以上就是贪吃蛇的全部代码以及一些关于.Win32 API的接口的介绍。当然代码还可以优化许多玩法。小编呢就写这么多了。咋们下一期再见吧!感谢您的参观!
相关文章:

【C语言】贪吃蛇小游戏
文章目录 前言一、贪吃蛇游戏代码test.c文件Snake.h文件Snake.c文件 二、相关函数的介绍1.COORD2.Win32 API的介绍3.GetStdHandle4.GetConsoleCursorInfo5.CONSOLE_CURSOR_INFO5.SetConsoleCursorInf6.SetConsoleCursorPosition7.GetAsyncKeyState 总结 前言 哈喽各位好呀。今…...
Linux的日志管理
日志管理服务rsyslogd 配置文件 | 日志类型 | 说明 | | -------------------- | ----------------------------------- | | auth | pam产生的日志 | | authpriv | ssh、ftp等…...

大语言模型 07 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机训练 预训练 监督微调
写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…...

[免费]苍穹微信小程序外卖点餐系统修改版(跑腿点餐系统)(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端),分享下哈。 项目视频演示 【免费】苍穹微信小程序外卖点餐系统修改版(跑腿点餐系统)(SpringBoot后端Vue管理端) Java毕业设计…...

【RAG】RAG-MCP:基于检索增强生成来缓解大语言模型工具选择中的提示膨胀问题
摘要 由于提示膨胀和选择复杂性,大型语言模型 (LLM) 难以有效利用越来越多的外部工具,例如模型上下文协议 (MCP)[1]中定义的那些工具。 我们引入了 RAG-MCP,这是一个检索增强生成框架,通过卸载工具发现来克服这一挑战。 RAG-MCP …...

甘特图工具怎么选?免费/付费项目管理工具对比测评(2025最新版)
2025年甘特图工具的全面指南 在项目管理领域,甘特图作为最直观的任务规划和进度追踪工具,已成为团队协作和项目执行的核心手段。随着数字化技术的快速发展,2025年的甘特图工具市场呈现出前所未有的多元化和智能化趋势。从开源软件到云端协作…...
UI自动化测试中,一个完整的断言应所需要考虑的问题
在UI自动化测试中,一个完整的断言应全面覆盖用户界面(UI)的功能性、交互性和视觉正确性。以下是断言需要包含的核心内容及详细说明: 一、基础元素验证 存在性断言 验证元素存在于DOM中示例代码(Python + Selenium):assert driver.find_element(By.ID, "submit_btn&…...

AIGC与数字金融:人工智能金融创新的新纪元
AIGC与数字金融:人工智能金融创新的新纪元 引言 人工智能生成内容(AIGC)在数字金融领域发挥着关键作用,从金融内容生成到智能风控,从个性化服务到投资决策,AIGC正在重塑金融的方式和效果。本文将深入探讨A…...
CSS详解:特性、选择器与优先级
CSS详解:特性、选择器与优先级 目录 CSS详解:特性、选择器与优先级一、CSS的核心特性1. 层叠性(Cascading)2. 继承性(Inheritance)3. 优先级(Specificity)4. 响应式设计5. 动画与过渡…...

手机怎么查看网络ip地址?安卓/iOS设备查询指南
在移动互联网时代,IP地址作为设备的网络身份证,无论是网络调试、远程连接还是排查故障都至关重要。本文将系统介绍安卓和iOS设备查看IP地址的多种方法,帮助您快速掌握这一实用技能。 一、安卓手机查看IP地址方法 1、通过WiFi设置查看 打开设…...
React-useRef
useRef useRef 是 React 的一个 Hook,用来创建一个 可变的引用对象,这个引用对象在组件的整个生命周期内保持不变。 翻译成人话就是,用useRef创建一个相对共享的对象管理器,它里面装的内容的读写是不会引起界面渲染的。 典型的应用…...

无损耗协议:PROFINET和EtherNet IP网关的高效安装指南
作为风力发电机组监控系统的重要组成部分,PROFINET和EtherNet/IP协议转换网关倍讯BX-606-EIP的安装至关重要。作为安装工,我们要确保网关安装的高效顺利,保证风力发电机组的稳定运行。 首先,我们需要仔细检查网关的硬件接口,确保所有连接线缆与设备端口相匹配。网关…...

【知识产权出版社-注册安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...
std::ranges::iota
std::ranges::iota_view 和 std::views::iota 是 C23 Ranges 库中的一部分,用于生成一系列递增的值,类似 Python 的 range() 或传统的 for 循环生成器。 一 原形 Defined in header <numeric> Call signature template< std::input_or_output…...
C++(24):容器类<list>
目录 一、核心概念 二、基本语法 1. 声明与初始化 2.添加元素 3.访问与遍历 4. 删除元素 三、特点 1. 高效插入/删除 2. 不支持随机访问 3. 特有成员函数 4. 内存与性能 四、示例代码 五、成员函数 六、使用场景 七、注意事项 Lists将元素按顺序储…...
【C++】不推荐使用的std::allocator<void>
文章目录 不推荐使用的std::allocator<void>1. 核心区别2. 成员函数对比(1) allocate 和 deallocate(2) construct 和 destroy 3. 设计动机(1) std::allocator<T>(2) std::allocator<void> 4. 使用场景示例(1) std::allocator<int>(2) std::allocator&…...

基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务
1、简介 本文讲述了如何实现简易的后端鉴权服务。所谓“鉴权”,就是“身份鉴定”“权限判断”。涉及的技术有:OAuth2、SpringSecurity、Jwt、过滤器、拦截器。OAuth2用于授权,使用Jwt签发Access Token和Refresh Token,并管理token…...
vue3 el-table实现字段可编辑
在Vue 3中,如果你想让el-table(Element Plus的表格组件)的字段可编辑,你可以通过以下方式来实现: 使用cell-mouse-enter和cell-mouse-leave事件动态显示编辑图标或控件 你可以在鼠标进入单元格时显示一个编辑图标或输…...
基于React的高德地图api教程005:圆形标记的绘制、删除、修改
文章目录 5、圆形绘制和编辑5.1 绘制圆5.1.1 添加绘制圆按钮5.1.2 点击地图绘制圆心5.2 修改圆5.2.1 修改圆的基本信息5.2.2 修改圆的位置和大小5.3 删除圆标记5.4 定位到圆5.5 代码下载5.05、圆形绘制和编辑 5.1 绘制圆 5.1.1 添加绘制圆按钮 实现代码: {!isActiveDrawCi…...

liunx定时任务,centos定时任务
yum install cronie crontabs -y直接运行 crond -n 在前台运行 crond -i 守护进程在没有inotify支持的情况下运行systemctl service crond start # 启动服务 systemctl enable crond.service # 设置开机自启 sudo systemctl restart crond # 重启 cron 服务systemctl serv…...

三种嵌入式开发常用的组网方式
一、三种嵌入式开发常用的组网方式 这里记录了三种嵌入式开发常用的网络环境,最终目标也就是让开发板、虚拟机、物理机在同一个局域网下。一般的网络环境下都非常容易实现,但是对于学生校园网可得想些法子了,因为校园网一般会有设备连接数限…...

ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出现问题】解决方案
ping baidu.coom可以通,ping www.baidu.com不通【DNS出现问题】解决方案 检查IPV6是否有问题 # 1. 检查 IPv6 地址,记住网络接口的名称 ip -6 addr show# 2. 测试本地 IPv6,eth0换成自己的网络接口名称 ping6 ff02::1%eth0# 3. 检查路由 ip…...

城市排水管网流量监测系统解决方案
一、方案背景 随着工业的不断发展和城市人口的急剧增加,工业废水和城市污水的排放量也大量增加。目前,我国已成为世界上污水排放量大、增加速度快的国家之一。然而,总体而言污水处理能力较低,有相当部分未经处理的污水直接或间接排…...

Ubuntu Desktop QEMU/KVM中使用Ubuntu Server 22.04配置k8s集群
Ubuntu Desktop QEMU/KVM中使用Ubuntu Server 22.04配置k8s集群 1.本机部署个代理 这里我是自己用dockersing-box 部署的 http://192.168.2.105:10808 如果 用v2rayN等软件部署的,记得开启局域网共享 2.安装虚拟机 我本机使用的是Ubuntu Desktop ,这里在QEMU/K…...

YOLOv8 在单片机上的几种部署方案
YOLOv8 在单片机上的部署方案 单片机资源(如内存、计算能力)有限,直接部署完整的 YOLOv8 模型并不现实。不过,我们可以通过模型量化、优化和使用轻量级框架来实现简化版的目标检测。下面为你介绍几种可行的方案: 方案…...

后端框架(1):Mybatis
什么是框架? 盖高楼,框架结构。 框架结构就是高楼的主体,基础功能。 把很多基础功能已经实现了(封装了)。 在基础语言之上,对各种基础功能进行封装,方便开发者,提高开发效率。 mybatis:对jd…...

linux下tcp/ip网络通信笔记1,
本文章主要为博主在学习网络通信的笔记一个Udp_echo_server,和client的代码实现 1,网络发展,网络协议,意识到网络通信——不同主机的进程间通信, 2,学习如何在应用层调用系统提供的接口进行通信,echo_Udp…...
SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
/// <summary> /// SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。 /// </summary> public class SqlHelper : IDbHelper {private readonly IDbConnectionFactory _connectionFactory;private…...

语音识别——声纹识别
通过将说话人的声音与数据库中的记录声音进行比对,判断说话人是否为数据库白名单中的同一人,从而完成语音验证。目前,3D-Speaker 声纹验证的效果较为出色。 3D-Speaker 是一个开源工具包,可用于单模态和多模态的说话人验证、说话…...

window 显示驱动开发-报告图形内存(三)
图形内存报告示例 示例 1:笔记本电脑上的 128 MB 专用板载图形内存 以下屏幕截图显示了使用 Intel Iris 离散图形适配器运行 Windows 11 的 Surface 笔记本电脑的计算图形内存数。 适配器的可用内存总数为 16424 MB,用于图形用途,细分如下&…...