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

C语言实现贪吃蛇小游戏

    ✅博客主页:爆打维c-CSDN博客​​​​​​ 🐾

🔹分享c语言知识及代码 🐾

目录

游戏展示视频

一、项目准备工作

二、功能实现分析

1.游戏开始

a.设置本地化、创建窗口、标题

b.隐藏光标,封装定位光标的函数

c.打印欢迎界面及提示信息

d.打印游戏地图及右侧的提示信息

e.创建蛇

f.创建食物

2.游戏运行

a.打印右侧帮助信息

b.按键判断

c.蛇移动过程中

3.游戏结束

a.打印游戏结束原因

b.销毁蛇结点

c.销毁食物结点

三、游戏代码实现如下

snack.h

snack.cpp

test.cpp


游戏展示视频

c语言 贪吃蛇游戏实现

一、项目准备工作

1. 打开VS新建一个空项目

2. 创建三个文件

  • snack.h       写游戏需要的数据类型和函数声明
  • snack.cpp   写函数的定义
  • test.cpp      写游戏的测试逻辑

准备工作就绪,现在我们来分析需要实现的功能


二、功能实现分析

1.游戏开始

a.设置本地化、创建窗口、标题

需要用到的函数:

int system (const char* command);   //头文件为<stdlib.h> 用于执行系统指令

char *setlocale(int category, const char *locale); 

//头文件为<locate.h> 用于设置或查询程序的本地化信息

//设置为本地模式 支持宽字符(汉字)的输出
setlocale(LC_ALL, ""); //设置标题
system("title 贪吃蛇");//设置窗体长和宽
system("mode con cols=100 lines=30");

b.隐藏光标,封装定位光标的函数

 //获取句柄HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cursor_info;   //包含有关控制台游标的信息的结构体GetConsoleCursorInfo(houtput, &cursor_info);  //获取控制台光标信息cursor_info.bVisible = false;  //设置光标可见度SetConsoleCursorInfo(houtput, &cursor_info);   //设置光标
//定位光标的函数
void Setpos(short x,short y) {//获取句柄HANDLE handle = NULL;handle = GetStdHandle(STD_OUTPUT_HANDLE);//设置光标位置COORD pos = { x,y };SetConsoleCursorPosition(handle, pos);
}

对于Win32 API控制台函数 的使用不清楚的同学可以去查阅官方文档,里面给出了详细的解释

控制台函数 - Windows Console | Microsoft Learnicon-default.png?t=O83Ahttps://learn.microsoft.com/zh-cn/windows/console/console-functions

c.打印欢迎界面及提示信息

实现效果如图

void WelcomeToGame() {Setpos(40, 15);printf("欢迎来到贪吃蛇游戏!\n");Setpos(40, 25);    //设置按任意键继续的位置system("pause");system("cls");Setpos(25, 13);printf("使用按键“↑↓←→”控制蛇的移动,按F3加速,F4减速\n");Setpos(40, 25);   //设置按任意键继续的位置system("pause");system("cls");
}

d.打印游戏地图及右侧的提示信息

void PrintMap() {int i = 0;//打印上横排for (i = 0; i < 58; i+=2) {  //0~56Setpos(i, 0);wprintf(L"%c",WALL);}//打印下横排for (i = 0; i < 58; i+=2) {  //0~56Setpos(i, 26);wprintf(L"%c", WALL);}//打印左竖排for (i = 1; i < 26; i++) {Setpos(0, i);wprintf(L"%c", WALL);}//打印右竖排for (i = 1; i < 26; i++) {Setpos(56, i);wprintf(L"%c", WALL);}
}

e.创建蛇

先在snack.h中声明维护蛇的结构体

//蛇的方向
enum DIRECTTION {UP = 1,DOWN,LEFT,RIGHT
};
//蛇的状态
enum GAME_STATUS {OK,            //存活KILL_BY_SELF,  //撞到自己KILL_BY_WALL, //撞墙死亡END_NORMAL  //正常退出
};
//蛇节点结构体 单链表
typedef struct SnackNode {int x;int y;struct SnackNode* next;
}SnakcNode, * pSnackNode;
//蛇结构体 维护蛇的信息
typedef struct Snack {int _sleep_time;    //休眠时间越短 蛇越快int _foodscore;  //一个食物的得分int _score;    //总得分enum DIRECTTION _dir;//蛇的方向enum GAME_STATUS _status;  //蛇的状态pSnackNode _pfood; //指向食物的指针pSnackNode _phead; //指向蛇头的指针
}Snack, * pSnack;

初始化蛇身

//初始化蛇身
void InitSnack(pSnack ps){//蛇身初始化五个节点int i = 0;pSnackNode cur = NULL;for (i = 0; i < 5; i++) {cur = (pSnackNode)malloc(sizeof(SnackNode));if (cur == NULL) {perror("malloc cur fail");return;}cur->next = NULL;cur->x = SNACK_X + i * 2;cur->y = SNACK_Y;if (ps->_phead == NULL) {  //空链表ps->_phead = cur;}else {//头插法cur->next = ps->_phead;ps->_phead = cur;}}cur = ps->_phead;while (cur) {Setpos(cur->x, cur->y);wprintf(L"%c",BODY);cur = cur->next;}//设置其他属性ps->_dir = RIGHT;ps->_foodscore = 20;ps->_score = 0;ps->_sleep_time = 200;ps->_status = OK;
}

f.创建食物

//创建食物
void CreateFood(pSnack ps) {int x=0, y=0;
again:do {x = rand() % 53 + 2; //2~54y = rand() % 25 + 1;//1~25} while (x % 2 != 0);//x必须要是2的倍数//x,y坐标不能与蛇身重合pSnackNode cur = ps->_phead;while (cur) {if (cur->x == x && cur->y == y) { goto again;}cur = cur->next;}//创建食物节点pSnackNode pfood = (pSnackNode)malloc(sizeof(SnackNode));if (!pfood) {perror("malloc pfood fail");return;}else {pfood->x = x;pfood->y = y;ps->_pfood = pfood;Setpos(x, y);wprintf(L"%c",FOOD);}
}

2.游戏运行

a.打印右侧帮助信息

b.按键判断

判断用户是否按键 

  •   按下上下左右则改变蛇的方向 f3则加速 f4则减速 暂停键 退出键

c.蛇移动过程中

判断蛇下一步往哪走 是否吃掉食物?

  •          如果吃掉食物那么蛇身增长 加分
  •          如果没吃掉食物 那么往前移动

判断是否存活

  •         如果存活 继续游戏
  •         如果撞到自己或撞到墙 游戏结束

3.游戏结束

a.打印游戏结束原因

b.销毁蛇结点

c.销毁食物结点


三、游戏代码实现如下

snack.h

#pragma once
#include<stdio.h>
#include<Windows.h>
#include<locale.h>
#include<stdbool.h>
#define BODY L'●'
#define FOOD L'★'
#define WALL L'□'
#define SNACK_X 26
#define SNACK_Y 5
//判断?个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1)?1:0)//蛇的方向
enum DIRECTTION {UP = 1,DOWN,LEFT,RIGHT
};
//蛇的状态
enum GAME_STATUS {OK,            //存活KILL_BY_SELF,  //撞到自己KILL_BY_WALL, //撞墙死亡END_NORMAL  //正常退出
};
//蛇节点结构体 单链表
typedef struct SnackNode {int x;int y;struct SnackNode* next;
}SnakcNode, * pSnackNode;
//蛇结构体 维护蛇的信息
typedef struct Snack {int _sleep_time;    //休眠时间越短 蛇越快int _foodscore;  //一个食物的得分int _score;    //总得分enum DIRECTTION _dir;//蛇的方向enum GAME_STATUS _status;  //蛇的状态pSnackNode _pfood; //指向食物的指针pSnackNode _phead; //指向蛇头的指针
}Snack, * pSnack;void Setpos(short x, short y);
void WelcomeToGame();
void My_time();
void PrintMap();
void CreateFood(pSnack ps);
void GameStart(pSnack ps);
void GameRun(pSnack ps);
void GameOver(pSnack ps);

snack.cpp

//函数的声明
#include"snake.h"
void Setpos(short x,short y) {//获取句柄HANDLE handle = NULL;handle = GetStdHandle(STD_OUTPUT_HANDLE);//设置光标位置COORD pos = { x,y };SetConsoleCursorPosition(handle, pos);
}void WelcomeToGame() {Setpos(40, 15);printf("欢迎来到贪吃蛇游戏!\n");Setpos(40, 25);    //设置按任意键继续的位置system("pause");system("cls");Setpos(25, 13);printf("使用按键“↑↓←→”控制蛇的移动,按F3加速,F4减速\n");Setpos(40, 25);   //设置按任意键继续的位置system("pause");system("cls");
}
void PrintMap() {int i = 0;//打印上横排for (i = 0; i < 58; i+=2) {  //0~56Setpos(i, 0);wprintf(L"%c",WALL);}//打印下横排for (i = 0; i < 58; i+=2) {  //0~56Setpos(i, 26);wprintf(L"%c", WALL);}//打印左竖排for (i = 1; i < 26; i++) {Setpos(0, i);wprintf(L"%c", WALL);}//打印右竖排for (i = 1; i < 26; i++) {Setpos(56, i);wprintf(L"%c", WALL);}
}
//初始化蛇身
void InitSnack(pSnack ps){//蛇身初始化五个节点int i = 0;pSnackNode cur = NULL;for (i = 0; i < 5; i++) {cur = (pSnackNode)malloc(sizeof(SnackNode));if (cur == NULL) {perror("malloc cur fail");return;}cur->next = NULL;cur->x = SNACK_X + i * 2;cur->y = SNACK_Y;if (ps->_phead == NULL) {  //空链表ps->_phead = cur;}else {//头插法cur->next = ps->_phead;ps->_phead = cur;}}cur = ps->_phead;while (cur) {Setpos(cur->x, cur->y);wprintf(L"%c",BODY);cur = cur->next;}//设置其他属性ps->_dir = RIGHT;ps->_foodscore = 20;ps->_score = 0;ps->_sleep_time = 200;ps->_status = OK;
}
//创建食物
void CreateFood(pSnack ps) {int x=0, y=0;
again:do {x = rand() % 53 + 2; //2~54y = rand() % 25 + 1;//1~25} while (x % 2 != 0);//x必须要是2的倍数//x,y坐标不能与蛇身重合pSnackNode cur = ps->_phead;while (cur) {if (cur->x == x && cur->y == y) { goto again;}cur = cur->next;}//创建食物节点pSnackNode pfood = (pSnackNode)malloc(sizeof(SnackNode));if (!pfood) {perror("malloc pfood fail");return;}else {pfood->x = x;pfood->y = y;ps->_pfood = pfood;Setpos(x, y);wprintf(L"%c",FOOD);}
}
void GameStart(pSnack ps) {//设置窗体长和宽system("mode con cols=100 lines=30");//获取句柄HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cursor_info;  GetConsoleCursorInfo(houtput, &cursor_info);  //获取控制台光标信息cursor_info.bVisible = false;  //设置光标可见度SetConsoleCursorInfo(houtput, &cursor_info);   //设置光标//1.打印欢迎窗口 //2.功能展示WelcomeToGame();//3.打印地图PrintMap();//4.创建蛇InitSnack(ps);//5.创建食物CreateFood(ps);
}void PrintHelpInfo() {Setpos(62, 14);printf("不能撞到墙,不能撞到自己");Setpos(62,15);printf("使用按键“↑↓←→”控制蛇的移动");Setpos(62,16);printf("按F3加速,F4减速");Setpos(62, 17);printf("按空格暂停游戏,按ESC退出游戏");}
void Pause() {while (1) {Sleep(200);if (KEY_PRESS(VK_SPACE)) {break;}}
}
int NextisFood(pSnackNode psn,pSnack ps) {return (psn->x == ps->_pfood->x) && (psn->y == ps->_pfood->y);
}
void EatFood(pSnackNode psn, pSnack ps) {//头插法psn->next = ps->_phead;ps->_phead = psn;//加分ps->_score += ps->_foodscore;//打印蛇身pSnackNode cur = ps->_phead;while (cur) {Setpos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}//释放食物节点free(ps->_pfood);//创建新的⻝物CreateFood(ps);
}
void NoFood(pSnackNode psn, pSnack ps){psn->next = ps->_phead;ps->_phead = psn;pSnackNode cur = ps->_phead;while (cur->next->next!=NULL) {Setpos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}//最后一个节点空格覆盖Setpos(cur->next->x, cur->next->y);printf("  ");//释放最后一个节点 并把此时的蛇尾next指针置为空 free(cur->next);cur->next = NULL;
}
int KillbySelf(pSnack ps) {//判断蛇身与蛇头是否重合pSnackNode cur = ps->_phead->next;while (cur) {if (ps->_phead->x == cur->x && ps->_phead->y == cur->y) {   //撞到自己 ps->_status = KILL_BY_SELF;return 1;}cur = cur->next;}return 0;
}
int KillbyWall(pSnack ps) {//判断蛇头是否撞墙if (ps->_phead->x == 0 || ps->_phead->x == 56 || ps->_phead->y == 0 || ps->_phead->y == 26) {ps->_status = KILL_BY_WALL;return 1;}return 0;
}
void SnackMove(pSnack ps) {//创建一个新的节点 表示蛇下一步到的位置 pSnackNode pNextNode = (pSnackNode)malloc(sizeof( SnackNode));if (!pNextNode) {perror("SnakeMove()::malloc()");return;}//判断下一步的方向switch (ps->_dir) {case UP:pNextNode->x = ps->_phead->x;pNextNode->y = ps->_phead->y - 1;break;case DOWN:pNextNode->x = ps->_phead->x;pNextNode->y = ps->_phead->y + 1;break;case LEFT:pNextNode->x = ps->_phead->x - 2;pNextNode->y = ps->_phead->y;break;case RIGHT:pNextNode->x = ps->_phead->x + 2;pNextNode->y = ps->_phead->y;break;}if (NextisFood(pNextNode,ps)) {EatFood(pNextNode, ps);}else {NoFood(pNextNode, ps);}KillbySelf(ps);KillbyWall(ps);}
void GameRun(pSnack ps) {PrintHelpInfo();  //打印右侧帮助信息//按键判断do {Setpos(62, 10);printf("总得分:%d",ps->_score);Setpos(62, 11);printf("一个食物的分数:%d", ps->_foodscore);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_RIGHT) && ps->_dir != LEFT) {ps->_dir = RIGHT;}else if (KEY_PRESS(VK_LEFT) && ps->_dir != RIGHT) {ps->_dir = LEFT;}else if (KEY_PRESS(VK_ESCAPE)) {ps->_status = END_NORMAL; //正常退出break;}else if (KEY_PRESS(VK_SPACE)) {Pause();  //让页面暂停 再按一次空格恢复}else if (KEY_PRESS(VK_F3)) {//加速if (ps->_sleep_time < 320) {ps->_sleep_time -= 30;ps->_foodscore += 10;}}else if (KEY_PRESS(VK_F4)) {//减速if (ps->_sleep_time>=80) {ps->_sleep_time += 30;ps->_foodscore -= 10;}}SnackMove(ps);Sleep(ps->_sleep_time);} while (ps->_status==OK);
}
void GameOver(pSnack ps) {pSnackNode cur = ps->_phead;Setpos(30, 12);switch (ps->_status){case END_NORMAL:printf("您主动退出游戏\n");break;case KILL_BY_SELF:printf("您撞上自己了 ,游戏结束!\n");break;case KILL_BY_WALL:printf("您撞墙了,游戏结束!\n");break;} //释放蛇身的节点while (cur){pSnackNode del = cur;cur = cur->next;free(del);}}

test.cpp

void game() {char c ='Y';do {Snack snack = { 0 };GameStart(&snack);GameRun(&snack);GameOver(&snack);Setpos(30, 13);printf("是否再来一局:Y/N >");c=getchar();getchar();} while (c == 'Y'||c=='y');
} 
int main(){setlocale(LC_ALL, ""); //设置为本地模式 支持宽字符(汉字)的输出等。system("title 贪吃蛇"); //设置标题srand((unsigned int)time(0));game();system("pause");return 0;
}

如果这篇文章对你有帮助的话,请给博主一个免费的赞鼓励一下吧~ 💓

本文仅简单介绍了有关类和对象的一些基本概念和相关代码实现,以上个人拙见,若有错误之处,希望各位能提出宝贵的建议和更正,感谢您的观看!

相关文章:

C语言实现贪吃蛇小游戏

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c语言知识及代码 &#x1f43e; 目录 游戏展示视频 一、项目准备工作 二、功能实现分析 1.游戏开始 a.设置本地化、创建窗口、标题 b.隐藏光标,封装定位光标的函数 c.打印欢迎界面及提示信息 …...

深入解析包裹信息管理系统:关系型数据库逻辑数据模型设计、超类实体与派生属性探讨

目录 案例 【题目】 【问题 1】(14分) 【问题 2】(6分) 【问题 3】(5分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 案例 阅读下列说明&#xff0c;回答问题 1 至问题 3。 【题目】 某企业委托软件公司开发包裹信息管理系统&#xff0c;以便于对该企业…...

Cyber Weekly #24

赛博新闻 1、OpenAI发布最强模型o1 本周四&#xff08;9月12日&#xff09;&#xff0c;OpenAI宣布推出OpenAIo1系列模型&#xff0c;标志着AI推理能力的新高度。o1系列包括性能强大的o1以及经济高效的o1-mini&#xff0c;适用于不同复杂度的推理任务。新模型在科学、编码、数…...

Java多线程面试精讲:源于技术书籍的深度解读

写在前面 ⭐️在无数次的复习巩固中&#xff0c;我逐渐意识到一个问题&#xff1a;面对同样的面试题目&#xff0c;不同的资料来源往往给出了五花八门的解释&#xff0c;这不仅增加了学习的难度&#xff0c;还容易导致概念上的混淆。特别是当这些信息来自不同博主的文章或是视…...

【Elasticsearch系列七】索引 crud

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

快速生成服务器响应json-server的安装和使用

json-server介绍地址:https://www.geeksforgeeks.org/json-server-setup-and-introduction/ 1.json-server是什么? 基于自定义的json文件,快速生成服务端响应,可用于前端调试接口 2.安装和卸载json-server 2.1 安装: 使用npm命令: npm install -g json-server 2.2 卸载 npm …...

增强LinkedList实现瑞士轮赛制编排

前言 LinkedList底层虽然是基于链表实现&#xff0c;但是由于其对底层节点进行了封装&#xff0c;导致无法操作底层Node对象。这也为使用上带来了很多不便&#xff0c;比如我之前遇到的一个需求&#xff1a;将n个队伍按照瑞士轮进行编排&#xff0c;组成n/2个队伍&#xff0c;…...

C++编译环境(IDE)推荐及安装

IDE是什么 嗨嗨嗨&#xff0c;我又来水博文了 今天来给大家推荐几款好用的IDE IDE是集成开发环境&#xff08;Integrated Development Environment&#xff09;的缩写&#xff0c;是一种软件应用程序&#xff0c;提供了用于软件开发的各种工具和功能&#xff0c;包括代码编辑…...

Android 12系统源码_窗口管理(八)WindowConfiguration的作用

前言 在Android系统中WindowConfiguration这个类用于管理与窗口相关的设置&#xff0c;该类存储了当前窗口的显示区域、屏幕的旋转方向、窗口模式等参数&#xff0c;应用程序通过该类提供的信息可以更好的适配不同的屏幕布局和窗口环境&#xff0c;以提高用户体验。 一、类定…...

已读论文创新点合集

系列文章目录 文章目录 系列文章目录一、《LAMM: Label Alignment for Multi-Modal Prompt Learning》二、《MaPLe: Multi-modal Prompt Learning》三、《Learning to Prompt for Vision-Language Models》CoOp 一、《LAMM: Label Alignment for Multi-Modal Prompt Learning》…...

12_持久化数据结构

菜鸟&#xff1a;老鸟&#xff0c;我在处理一个项目时遇到了问题。我需要频繁地修改和查询一个数据结构&#xff0c;但每次修改后我都得复制整个结构&#xff0c;性能实在是太低了。有没有什么办法可以高效地处理这种情况&#xff1f; 老鸟&#xff1a;你提到了一个很有意思的…...

【计算机网络】IP, 以太网, ARP, DNS

IP, 以太网, ARP, DNS IP协议回顾IP地址报文格式功能介绍地址管理IP地址数量问题初识 NAT 机制通信机制IP数量的解决方案网段划分特殊IP地址 路由选择 以太网协议报文格式源MAC/目的MACMAC地址是什么MAC地址格式MAC的作用 ARPDNS初识DNSDNS主要功能DNS的查询过程 IP协议 回顾I…...

OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia

在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.0) Install macOS on unsupported Macs 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主…...

爆改YOLOv8|使用MobileNetV4替换yolov8的Backbone

1&#xff0c;本文介绍 MobileNetV4 是最新的 MobileNet 系列模型&#xff0c;专为移动设备优化。它引入了通用反转瓶颈&#xff08;UIB&#xff09;和 Mobile MQA 注意力机制&#xff0c;提升了推理速度和效率。通过改进的神经网络架构搜索&#xff08;NAS&#xff09;和蒸馏…...

C语言 | Leetcode C语言题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; int cmp(const void* _a, const void* _b) {int *a *(int**)_a, *b *(int**)_b;return a[0] b[0] ? a[1] - b[1] : b[0] - a[0]; }int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** …...

【Git】初识Git

本篇文章的环境是在 Ubuntu/Linux 环境下编写的 文章目录 版本控制器Git 基本操作安装 Git创建 Git 本地仓库配置 Git认识工作区、暂存区、版本库添加文件修改文件版本回退撤销修改删除文件 版本控制器 在日常工作和学习中&#xff0c;老板/老师要求我们修改文档&#xff0c;…...

vue3 透传 Attributes

前言 Vue 3 现在正式支持了多根节点的组件&#xff0c;也就是片段&#xff01; Vue 2.x 遵循单根节点组件的规则&#xff0c;即一个组件的模板必须有且仅有一个根元素。 为了满足单根节点的要求&#xff0c;开发者会将原本多根节点的内容包裹在一个<div>元素中&#x…...

4.接口测试基础(Jmter工具/场景二:一个项目由多个人负责接口测试,我只负责其中三个模块,协同)

一、场景二&#xff1a;一个项目由多个人负责接口测试&#xff0c;我只负责其中三个模块&#xff0c;协同 1.什么是测试片段&#xff1f; 1&#xff09;就相当于只是项目的一部分用例&#xff0c;不能单独运行&#xff0c;必须要和控制器&#xff08;include,模块&#xff09;一…...

electron react离线使用monaco-editor

目录 1.搭建一个 electron-vite 项目 2.安装monaco-editor/react和monaco-editor 3.引入并做monaco-editor离线配置 4.react中使用 5.完整代码示例 6.monaco-editor离线配置官方说明 7.测试 1.搭建一个 electron-vite 项目 pnpm create quick-start/electron 参考链接…...

Python 的 WSGI 简单了解

从 flask 的 hello world 说起 直接讨论 WSGI&#xff0c;很多人可能没有概念&#xff0c;我们还是先从一个简单的 hello world 程序开始吧。 from flask import Flaskapp Flask(__name__)app.route("/", methods[GET]) def index():return "Hello world!&q…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...