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

手撕——贪吃蛇小游戏(下)

引言

        上一章介绍了实现贪吃蛇小游戏必备的知识点。

        这章,让我们一起开启手搓核弹之旅吧。

先附上贪吃蛇代码的git:贪吃蛇小游戏_4_23 · Shown_shuai/learn_c - 码云 - 开源中国 (gitee.com) 

上一章的窗口: 

手撕——贪吃蛇小游戏(上)(前置)-CSDN博客

一、整体思维导图

二、创建贪吃蛇

在游戏开始前,先本地化,为了后面打印的需要

int main()
{//设置本地化setlocale(LC_ALL, "");return 0;
}

用链表来维护贪吃蛇

在snack.h中进行类型的声明 

1. 蛇身的节点

//蛇身体的节点
typedef struct SnakeNode
{//坐标int x;int y;//指向下一个节点的指针struct SnakeNode* nest;
}SnakeNode,* pSnakeNode;
//pSnakeNode是指向节点的指针类型
//等价于:typedef struct SnakeNode* pSnakeNode;

2. 创建贪吃蛇

贪吃蛇有许多需要维护的信息,将贪吃蛇创建为一个结构体。

//蛇的方向
enum DIRECTION
{UP = 1, //上DOWN,   //下LEFT,   //左RIGHT   //右
};
//蛇的状态
//游戏正常,撞墙,撞到自己,正常退出
enum GAME_STATUS
{OK,            //正常KILL_BY_WALL,  //撞墙KILL_BY_SELF,	//撞到自己END_NORMAL     //正常退出
};//贪吃蛇
typedef struct Snake
{pSnakeNode _pSnake;   //指向蛇头的指针pSnakeNode _pFood;    //指向食物的指针enum DIRECTION _dir;  //蛇的方向enum GAME_STATUES _status;  //游戏的状态int _food_weight;   //一个食物的分数int _score;         //总分数int _sleep_time;    //休息时间,时间越长,速度越慢,越短,速度越快
}Snake, *pSnake;

3.用枚举结构体,来枚举蛇属性的状态: 


//蛇的方向
enum DIRECTION
{UP = 1, //上DOWN,   //下LEFT,   //左RIGHT   //右
};//蛇的状态
//游戏正常,撞墙,撞到自己,正常退出
enum GAME_STATUS
{OK,            //正常KILL_BY_WALL,  //撞墙KILL_BY_SELF,	//撞到自己END_NORMAL     //正常退出
};

4. 定义特殊的符号,和特殊的数据

#define POS_X 24 //游戏刚开始的时候,蛇头的位置
#define POS_Y 5  //游戏刚开始的时候,蛇头的位置
#define WALL L'□'
#define BOOY L'●'
#define FOOD L'★'

三、开始游戏

1.设置游戏窗口大小和名字,隐藏光标

//1.设置窗口的大小,光标隐藏
system("mode con cols=110 lines=35");
system("title 贪吃蛇");HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄(通过这个句柄来对控制台进行操作)CONSOLE_CURSOR_INFO curInfo;                     //存有光标信息的结构体
//获得和hOutput句柄相关的控制台上的光标信息,存放在curInfo中
GetConsoleCursorInfo(houtput, &curInfo); curInfo.bVisible = false;  //修改光标信息//设置获得和hOutput句柄相关的控制台上的光标信息
SetConsoleCursorInfo(houtput, &curInfo); 

2. 打印欢迎界面和功能介绍(上一章的知识点):

//光标定位
void SetPos(int x, int y)
{//获取标准输出的句柄(通过这个句柄来对控制台进行操作)HANDLE hOutput = NULL;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//定位光标的位置COORD pos = { x, y };SetConsoleCursorPosition(hOutput, pos);
}//打印欢迎界面和功能介绍
void WelcomeToGame()
{SetPos(45, 16);printf("欢迎来的贪吃蛇小游戏\n");SetPos(48, 20);system("pause");system("cls"); //清空屏幕SetPos(35, 16);wprintf(L"用↑,↓,←,→来控制小蛇的移动,按F3加速,F4减速\n");SetPos(43, 18);wprintf(L"加速可以获得更高的分数");SetPos(45, 23);system("pause");system("cls");
}

3.绘制地图:

//3.绘制地图
void CreateMap()
{int i = 0;//上for (int i = 0; i < 35; i++){wprintf(L"%lc", WALL);}//下SetPos(0, 30);for (i = 0; i < 35; i++){wprintf(L"%lc", WALL);}//左for (i = 1; i < 30; i++){SetPos(0, i);wprintf(L"%lc\n", WALL);}//右for (i = 1; i < 30; i++){SetPos(68, i);wprintf(L"%lc\n", WALL);}SetPos(80, 0);
}

4.创建蛇

申请5个节点,使用头插,将蛇链接起来

//初始化蛇身
void InitSnake(pSnake ps)
{int i = 0;pSnakeNode cur = NULL;for (i = 0; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL){perror("InitSanke(): malloc fail!");return;}cur->nest = NULL;cur->x = POS_X + 2 * i;cur->y = POS_Y;if (ps->_pSnake == NULL){ps->_pSnake = cur;}else{cur->nest = ps->_pSnake;ps->_pSnake = cur;}}//打印:cur = ps->_pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BOOY);cur = cur->nest;}//设置贪吃蛇的属性ps->_dir = RIGHT;ps->_score = 0;ps->_food_weight = 10;ps->_sleep_time = 200;ps->_status = OK;
}

5.创建食物

//创建食物
void CreateFood(pSnake ps)
{int x = 0;  //取值范围:2 ~ 66  0~64int y = 0;  //          1 ~ 30  0~29
again:do{x = rand() % 65 + 2;y = rand() % 29 + 1;} while (x % 2 != 0);   //x 必须是 2 的倍数//x 和 y 的坐标不能和蛇的坐标相同pSnakeNode cur = ps->_pSnake;while (cur){if (x == cur->x && y == cur->y){goto again;}cur = cur->nest;}//创建食物的节点:pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));if (pFood == NULL){perror("CreaterFood():malloc fail");return;}pFood->x = x;pFood->y = y;pFood->nest = NULL;SetPos(x, y);wprintf(L"%lc", FOOD);ps->_pFood = pFood;}

6.初始化游戏的所以代码:

//游戏的初始化
void GameStart(pSnake ps)
{//0.设置窗口的大小,光标隐藏system("mode con cols=110 lines=35");system("title 贪吃蛇");HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄(通过这个句柄来对控制台进行操作)CONSOLE_CURSOR_INFO curInfo;                     //存有光标信息的结构体//获得和hOutput句柄相关的控制台上的光标信息,存放在curInfo中GetConsoleCursorInfo(houtput, &curInfo); curInfo.bVisible = false;  //修改光标信息//设置获得和hOutput句柄相关的控制台上的光标信息SetConsoleCursorInfo(houtput, &curInfo); //1.打印欢迎界面//2.功能介绍WelcomeToGame();//3.绘制地图CreateMap();//4.创建蛇InitSnake(ps);//5.创建食物CreateFood(ps);
}

四、运行游戏

1. 打印帮助信息

void PrintHelpInfo()
{SetPos(74, 15);wprintf(L"%s", L"不能穿墙,不能咬到自己");SetPos(71, 16);wprintf(L"%s", L"用↑,↓,←,→来控制小蛇的移动");SetPos(74, 17);wprintf(L"%s", L"按F3加速,F4减速\n");SetPos(71, 18);wprintf(L"%s", L"ESC:退出游戏,space:暂停游戏");SetPos(74, 20);wprintf(L"%s", L"制作者:@Run_Teenage");
}

2.定义一个宏,检测按键是否被按过

上一章有讲,可以去看一下

#define KEY_PRESS(kv) ((GetAsyncKeyState(kv)&1) ? 1:0)

3.游戏运行时,整体结构:

//游戏的运行:
void GameRun(pSnake ps)
{//打印帮助信息PrintHelpInfo();do{//打印总分数和食物的分数SetPos(74,10);printf("总分数:%d\n", ps->_score);SetPos(74, 11);printf("当前食物的分数:%2d\n", 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_DOWN) && ps->_dir != UP)//按下键时,并且向上走,不会有反应{ps->_dir = DOWN;}else if (KEY_PRESS(VK_SPACE)){//暂停Pause();}else if (KEY_PRESS(VK_F3)){//加速if (ps->_sleep_time > 80){ps->_sleep_time -= 30;ps->_food_weight += 2;}}else if (KEY_PRESS(VK_F4)){//减速if (ps->_food_weight > 2){ps->_sleep_time += 30;ps->_food_weight -= 2;}}else if (KEY_PRESS(VK_ESCAPE)){//正常退出游戏ps->_status = END_NORMAL;}//贪吃蛇走SnakeMove(ps);  //蛇走一步的过程Sleep(ps->_sleep_time);} while (ps->_status == OK);
}

4.实现暂停模块

//暂停
void Pause()
{while (1){Sleep(200);if (KEY_PRESS(VK_SPACE)){break;}}
}

5.实现贪吃蛇走一步的过程

//贪吃蛇走
void SnakeMove(pSnake ps)  //蛇走一步的过程
{//创建一个节点,表示蛇,即将到的下一个节点pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));if (pNextNode == NULL){perror("SnakeMove malloc");return;}switch (ps->_dir){case UP:pNextNode->x = ps->_pSnake->x;pNextNode->y = ps->_pSnake->y  - 1;break;case DOWN:pNextNode->x = ps->_pSnake->x;pNextNode->y = ps->_pSnake->y + 1;break;case LEFT:pNextNode->x = ps->_pSnake->x - 2;pNextNode->y = ps->_pSnake->y;break;case RIGHT:pNextNode->x = ps->_pSnake->x + 2;pNextNode->y = ps->_pSnake->y;break;}//检测下一个坐标是不是食物if (NextIsFood(pNextNode, ps)){//是食物EatFood(pNextNode, ps);}else{//不是食物NoFood(pNextNode, ps);}//检测蛇是否撞墙KillByWall(ps);//检测蛇是否撞到自己KillBySelf(ps);
}

5.1检查下一个位置是不是食物

//检测下一个坐标是不是食物
int NextIsFood(pSnakeNode pn, pSnake ps)
{return (pn->x == ps->_pFood->x && pn->y == ps->_pFood->y);
}

5.2下一个是食物

//下一个位置是食物,吃掉食物
void EatFood(pSnakeNode pn, pSnake ps)
{//头插ps->_pFood->nest = ps->_pSnake;ps->_pSnake = ps->_pFood;//释放next节点free(pn);pn = NULL;pSnakeNode cur = ps->_pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%c", BOOY);cur = cur->nest;}ps->_score += ps->_food_weight;//重新创建食物CreateFood(ps);
}

5.3下一个位置不是食物

//下一个位置不是食物
void NoFood(pSnakeNode pn, pSnake ps)
{//头插pn->nest = ps->_pSnake;ps->_pSnake = pn;pSnakeNode cur = ps->_pSnake;while (cur->nest->nest != NULL){SetPos(cur->x, cur->y);wprintf(L"%c", BOOY);cur = cur->nest;}//把最后一个位置的节点打印成空格SetPos(cur->nest->x , cur->nest->y);printf("  ");//释放最后一个位置的节点free(cur->nest);//把倒数第二的节点的地址置为NULLcur->nest = NULL;
}

5.4检查蛇是否撞到墙

//检测蛇是否撞墙
void KillByWall(pSnake ps)
{if (ps->_pSnake->x == 0 || ps->_pSnake->x == 68 ||ps->_pSnake->y == 0 || ps->_pSnake->y == 29){ps->_status = KILL_BY_WALL;}
}

5.5检查蛇是否撞到自己

遍历蛇头后面的节点的坐标是否和蛇的头节点重合,重合,则说明自己撞到了自己

//检测蛇是否撞到自己
void KillBySelf(pSnake ps)
{pSnakeNode cur = ps->_pSnake->nest;while (cur){if (cur->x == ps->_pSnake->x && cur->y == ps->_pSnake->y){ps->_status = KILL_BY_SELF;break;}cur = cur->nest;}
}

五、游戏结束 (善后工作)

打印游戏是为什么结束的,释放贪吃蛇的节点

//结束游戏 —— 善后工作(释放内存之类的)
void GameEnd(pSnake ps)
{SetPos(25, 15);switch (ps->_status){case END_NORMAL:printf("正常结束游戏");break;case KILL_BY_WALL:printf("撞上墙了,游戏结束");break;case KILL_BY_SELF:printf("咬到自己了,游戏结束");break;}//释放蛇身节点pSnakeNode cur = ps->_pSnake;while (cur){pSnakeNode del = cur;cur = cur->nest;free(del);}
}

六、合并游戏的全部流程,处理细节问题

#include"snack.h"void test()
{int ch = 0;do{system("cls");//创建贪吃蛇Snake snake = { 0 };//初始化游戏//1.打印欢迎界面//2.功能介绍//3.绘制地图//4.创建蛇//5.创建食物//6.设置游戏的相关信息GameStart(&snake);//运行游戏GameRun(&snake);//结束游戏 —— 善后工作(释放内存之类的)GameEnd(&snake);while (_kbhit()){_getch();    //吸收蛇动时,按键盘的键值带来的影响,不然游戏会有小bug}SetPos(24, 16);printf("再来一局吗?(Y/N)");ch = getchar();while (getchar() != '\n');} while (ch == 'Y' || ch == 'y');SetPos(0, 32);
}
int main()
{//设置本地化setlocale(LC_ALL, "");srand((unsigned int )time(NULL));test();return 0;
}

七、所以代码可以在引言的git中拿取

相关文章:

手撕——贪吃蛇小游戏(下)

引言 上一章介绍了实现贪吃蛇小游戏必备的知识点。 这章&#xff0c;让我们一起开启手搓核弹之旅吧。 先附上贪吃蛇代码的git&#xff1a;贪吃蛇小游戏_4_23 Shown_shuai/learn_c - 码云 - 开源中国 (gitee.com) 上一章的窗口&#xff1a; 手撕——贪吃蛇小游戏&#xff0…...

C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载

在 C 中&#xff0c;类的默认成员函数是编译器自动生成的重要机制&#xff0c;合理利用这些函数可以简化代码编写&#xff0c;同时避免资源管理错误。本文将从构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心内容展开&#xff0c;结合具体案例深入解析。 一、默认成员…...

【Jupyter 启动时如何指定目录】

你在 Windows 系统下运行 jupyter notebook 时&#xff0c;遇到了 Jupyter Notebook 打开的目录不是你想要的 E:\desktop\yolo-study&#xff0c;而是其他路径。这可能是由于 Jupyter 的默认配置问题 或 启动路径问题 导致的。 &#x1f50d; 原因分析 Jupyter 默认根目录设置错…...

PostSwigger Web 安全学习:CSRF漏洞2

CSRF 漏洞学习网站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF 漏洞&#xff1a;SameSite相关绕过 当浏览器访问服务器时&#xff0c;服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他…...

openharmony—4.1 softbus_tool 工具编译使用测试笔记(持续更新)

​ 相关资料&#xff1a; 1.communication_dsoftbus: 暂无描述 - Gitee.com 2.dsoftbus_tool: OpenHarmony 分布式软总线样例 3.OpenAtom OpenHarmony​ 4.OpenAtom OpenHarmony 编译该demo之前需要大家搭建拉取openharmony源码&#xff0c;搭建开发环境&#xff0c;同时全…...

关于 Web 服务器的五个案例

一、案例题目&#xff1a; 1.多 IP 访问多网站&#xff08;在 RHCE 练习二中的实验二&#xff09; 2.多端口访问多网站 3.多域名访问多网站 4.虚拟目录和用户控制 5.https/443 二、案例实验 2.多端口访问多网站 ① 开始还是先关闭我们的防火墙以及 selinux [rootserve…...

第十二章-PHP文件上传

第十二章-PHP文件上传 一&#xff0c;文件上传原理 一、HTTP协议与文件上传 1. 请求体结构 当表单设置enctype"multipart/form-data"时&#xff0c;浏览器会将表单数据编码为多部分&#xff08;multipart&#xff09;格式。 Boundary分隔符&#xff1a;随机生成的…...

shell脚本部署disu博客

#!/bin/bash #关闭防火墙 systemctl status firewalld &>/dev/null if [ $? -ne 0 ];then systemctl stop firewalld &>/dev/null else echo “firewalld is disabled” fi #关闭selinux filegetenforce if [ “$fine” “Disabled” ];then echo “firewalld…...

NdrpPointerUnmarshallInternal函数分析之pFormatPointee指针的确定

第一部分&#xff1a; 0: kd> p RPCRT4!NdrPointerUnmarshall0x29: 001b:77c46ce4 e8b6f6ffff call RPCRT4!NdrpPointerUnmarshall (77c4639f) 0: kd> t Breakpoint 4 hit RPCRT4!NdrpPointerUnmarshall: 001b:77c4639f 55 push ebp 0: kd> …...

STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)

第 1 章 延时&#xff1a;嵌入式系统的时间控制基石 1.1 延时基础&#xff1a;从概念到硬件实现 1.1.1 什么是延时&#xff1f; 定义&#xff1a;延时是通过软件或硬件手段&#xff0c;使程序执行过程中暂停指定时间&#xff0c;再继续后续操作的技术。本质是对时间的精确或…...

2025 FIC wp

这次比赛计算机和手机大部分题目都比较常规 第一和第四部分有点让人摸不着头脑 比赛的时候第一部分有四个题没出 第四部分基本都没怎么出 现在复盘一下 把我当时做题的心得和获取的新知识记录一下 互联网取证的部分就先学习一下别的师傅 检材 链接&#xff1a;https://pan.bai…...

STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换

1、标准库SPI初始化 这是标准库的SPI初始化配置 2、HAL库SPI初始化 这是HAL库函数的SPI初始化配置 可以看出&#xff0c;基本一直&#xff0c;除了 基本的io口配置区别&#xff0c;其他主要的读写函数不用动的。 3、SPI发送函数_替换对比 /* SPI写入一个字节 */ void SP…...

Cesium 三维场景中通过自定义着色器实现多种特效(纹理、光带、点光源、反射)

整体功能概述 构建一个基于 Cesium 的三维场景&#xff0c;加载三维瓦片集模型&#xff0c;同时提供多种特效&#xff0c;像夜景纹理、上下扫光、点光源以及反射纹理等&#xff0c;利用 dat.gui 库创建交互界面。 代码详解 白膜特效 nightFs.glsl void fragmentMain(Fragm…...

Java学习--HashMap

HaspMap是Java集合框架中最重要、最常用的数据结构之一。其基于哈希表实现了Map接口&#xff0c;在Java1.8的版本中&#xff0c;其采用了“数组链表红黑树”的混合结构&#xff0c;底层代码如下&#xff1a; transient Node<K,V>[] table; // 哈希桶数组 static class N…...

Monorepo、Lerna、Yarn Workspaces、pnpm Workspaces 用法

Monorepo 介绍 Monorepo是一种方案&#xff0c;而非具体的工具。 Monorepo指的是将多个相关的项目或模块放在同一个代码仓库中进行管理的方式。这种方案有以下优点&#xff1a; 方便代码共享&#xff1a;不同项目或模块之间可以方便地共享代码、组件、工具函数等&#xff0c…...

JVM指令手册:深入理解字节码执行机制

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 Java虚拟机&#xff08;JVM&#xff09;作为Java生态的核心执行引擎&#xff0c;其指令系统是理解程序底层运行机制的关键。本手册将系统解析JVM指令集…...

springboot logback 默认加载配置文件顺序

在 Spring Boot 应用中&#xff0c;Logback 默认加载配置文件的顺序遵循特定的规则。以下是详细的加载顺序和优先级说明&#xff1a; 1. 默认配置文件加载顺序 Logback 在 Spring Boot 中会按以下顺序查找并加载配置文件&#xff08;优先级从高到低&#xff09;&#xff1a; l…...

用 Nodemon 解决 npm run serve 频繁重启服务

Nodemon 是一个基于 Node.js 构建的开发工具&#xff0c;专为帮助开发者自动监控项目文件的更改而设计。每当文件发生变更时&#xff0c;Nodemon 会自动重启 Node.js 服务器&#xff0c;无需手动停止并重启。这对于提升开发速度、减少人工操作非常有帮助&#xff0c;尤其适用于…...

WEB安全--社会工程--SET钓鱼网站

1、选择要钓鱼的网站 2、打开kali中的set 3、启动后依次选择&#xff1a; 4、输入钓鱼主机的地址&#xff08;kali&#xff09;和要伪装的网站域名&#xff1a; 5、投放钓鱼网页&#xff08;服务器域名:80&#xff09; 6、获取账号密码...

系统架构师---基于规则的系统架构

引言 在业务规则高度动态且需快速响应的系统中&#xff0c;‌基于规则的系统架构风格&#xff08;Rule-Based System Architecture Style&#xff09;‌提供了一种将业务逻辑与代码解耦的标准化范式。从保险理赔的自动化审核到金融风控的实时拦截&#xff0c;规则引擎已成为企…...

嵌入式软件--stm32 DAY 4 中断系统

1.课后练习 学了这么长时间&#xff0c;现在让我们第一次做练习。 1.1往返流水灯 1.1.1 LED1-LED2-LED3-LED2-LED1循环 &#xff08;1&#xff09;工程准备 复制上一个寄存器实现的工程文档&#xff0c;删减修改我们正要实现的工程。为了区别练习和学习工程&#xff0c;我们…...

android开发制作aosp系统签名文件给普通apk签名使用

platform.pk8和platform.x509.pem复制出来放在同一目录下 将AOSP源码路径下build\target\product\security\platform.pk8和platform.x509.pem复制出来放在同一目录下 新开一个ternimal窗口执行下面命令&#xff0c;生成platform.pem文件 openssl pkcs8 -in platform.pk8 -info…...

AVL树的介绍与学习

目录 1.前言 2.AVL树 3.AVL树的插入 平衡因子的更新 更新停止的条件 旋转 1.前言 在学习了二叉搜索树&#xff0c;set和map之后&#xff0c;我们接下来趁热打铁&#xff0c;继续学习AVL树。 2.AVL树 1.AVL树具有二叉搜索树的性质&#xff0c;但是它的左右子树的高度差不…...

docker部署Mysql8一直密码错误记录

正常流程是这样得&#xff1a; 第一步 #拉镜像 docker pull mysql:8.0 第二步 #运行名为 mysql8 得容器 &#xff0c;MYSQL_ROOT_PASSWORD123456 设置密码 docker run -p 3307:3306 \ --name mysql8 \ -e MYSQL_ROOT_PASSWORD123456 \ -v /docker/mysql8/data:/var/lib/m…...

智慧水库与AI深度融合的实现方案及典型应用场景

以下是智慧水库与AI深度融合的实现方案及典型应用场景,结合行业前沿案例与技术架构展开: 一、智慧水库AI实现方案 1. 技术架构与核心工具 感知层: 多模态传感器网络:部署毫米波雷达水位计(精度3mm)、光纤光栅渗压计(分辨率0.01%FS)、高清智能球机(支持800万像素+AI分…...

大语言模型架构基础与挑战

大语言模型(Large Language Model, LLM)在近几年引领了自然语言处理领域的革命性进展。这类模型通常拥有极其庞大的参数规模(往往达到数十亿乃至数千亿级别),通过对海量文本数据进行自监督训练,展现出卓越的语言理解和生成能力。自2018年前后第一批大语言模型问世以来,基…...

KAG:通过知识增强生成提升专业领域的大型语言模型(二)

目录 摘要 Abstract 1 实验 1.1 实验设置 1.2 总体结果 1.3 消融研究 1.3.1 知识图谱索引消融 1.3.2 推理与检索消融 1.3.3 实验结果与讨论 2 KAG服务部署 2.1 安装Docker 2.2 安装Doker Compose 2.3 启动服务 2.4 查看状态 2.5 产品访问 3 KAG 0.6使用&#x…...

【Luogu】动态规划六

P1586 四方定理 - 洛谷 思路&#xff1a; 这题其实就是完全背包问题&#xff0c;但是有限制&#xff0c;最多数量只能是 4 所以我们可以定义 dp[i][j] 为 i 用 j 个数拼凑的总方案数 那么转移方程也很明显了&#xff0c;dp[i][j] dp[i - k*k][j - 1] 具体的&#xff0c;我…...

Postman接口测试: postman设置接口关联,实现参数化

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个…...

docker打开滚动日志

在 Docker 中启用滚动日志&#xff08;log rotation&#xff09;可以帮助你管理容器日志的大小&#xff0c;避免日志文件占用过多磁盘空间。以下是具体的操作步骤&#xff1a; 1. 修改 Docker 守护进程配置 Docker 的日志配置是通过 daemon.json 文件管理的。你需要修改此文件…...

单片机-89C51部分:5、点亮LED

飞书文档https://x509p6c8to.feishu.cn/wiki/SlB5wYD1QiPRzWkfijEcIvv8nyc 一、应用场景 二、点灯原理 插件led灯珠长引脚为正极,短引脚为负极。 LED&#xff08;发光二极管&#xff09;两端存在电压差&#xff0c;有一定的电流流过时会亮起。电流可以理解为水流&#xff0c;…...

Lua 第10部分 模式匹配

10.1 模式匹配的相关函数 字符串标准库提供了基于模式的 4 个函数。 我们已经初步了解过函数 find 和 gsub&#xff0c;其余两个函数分别是 match 和 gmatch (Global Match 的缩写&#xff09;。 函数 string.find 用于在指定的目标字符串中搜索指定的模式。最简单的模式就是一…...

Maven 4.0.0 模式-pom.xml配置详解

Maven 4.0.0 模式-pom.xml配置详解 ​ 此 pom.xml 文件涵盖了 Maven 4.0.0 模式支持的所有主要标签&#xff0c;包括项目元数据、依赖管理、构建配置、发布管理等。每个标签都配有详细注释&#xff0c;说明其作用、常见用法和可能的值。 ​ 此文件旨在展示标签的完整性&#…...

IDEA 连接 Oracle 数据库

IDEA 连接 Oracle 数据库...

机器人快速启动

机器人快速启动 ES机器人开机操作流程 方法一&#xff08;一体化底座启动&#xff09; 接通48V电源点击底座“Power”按钮观察电源指示灯亮起&#xff0c;蜂鸣器发出“嘀”声&#xff0c;代表底座启动完成 方法二&#xff08;控制手柄启动&#xff09; 长按手柄开关机键2秒后松…...

使用 MediaPipe 和 OpenCV 快速生成人脸掩膜(Face Mask)

在实际项目中&#xff0c;尤其是涉及人脸识别、换脸、图像修复等任务时&#xff0c;我们经常需要生成人脸区域的掩膜&#xff08;mask&#xff09;。这篇文章分享一个简单易用的小工具&#xff0c;利用 MediaPipe 和 OpenCV&#xff0c;快速提取人脸轮廓并生成二值掩膜图像。 …...

《全球反空间能力》报告翻译——部分1

全球反空间能力 已进行过破坏性反卫星测试的国家 美国 美国目前拥有世界上最先进的军事太空能力&#xff0c;尽管与中国的相对差距正在缩小。在冷战期间&#xff0c;美国开创了许多现今使用的国家安全太空应用&#xff0c;并在几乎所有类别中保持技术领先地位。美国军方在将…...

云原生课程-Docker

一次镜像&#xff0c;到处运行。 1. Docker详解&#xff1a; 1.1 Docker简介&#xff1a; Docker是一个开源的容器化平台&#xff0c;可以帮助开发者将应用程序和其依赖的环境打包成一个可移植的&#xff0c;可部署的容器。 docker daemon:是一个运行在宿主机&#xff08;DO…...

组件的基本知识

组件 组件的基本知识 组件概念组成步骤好处全局注册生命周期scoped原理 父子通信步骤子传父 概念 就是将要复用的标签&#xff0c;抽离放在一个独立的vue文件中&#xff0c;以供主vue文件使用 组成 三部分构成 template&#xff1a;HTML 结构 script: JS 逻辑 style: CSS 样…...

空间矩阵的思考

今天又看了些线性代数&#xff0c;引发了许多思考。   矩阵是以长和宽存储数据&#xff0c;那有没有一种新型的矩阵&#xff0c;以长宽高的形式存储数据呢&#xff1f;我不知道有没有&#xff0c;所以暂且称其为空间矩阵。   它肯定是存在的&#xff0c;可以这样抽象&#…...

【数据挖掘】时间序列预测-常用序列预测模型

常用序列预测模型 &#xff08;1&#xff09;AR&#xff08;自回归&#xff09;模型&#xff08;2&#xff09;ARIMA模型&#xff08;3&#xff09;Prophet模型&#xff08;4&#xff09;LSTM模型&#xff08;5&#xff09;Transformer模型&#xff08;6&#xff09;模型评估6.…...

将你的本地项目发布到 GitHub (新手指南)

目录 第 1 步&#xff1a;在 GitHub 上创建新的仓库 (Repository)第 2 步&#xff1a;将本地仓库连接到 GitHub 远程仓库第 3 步&#xff1a;(可能需要) 重命名你的默认分支第 4 步&#xff1a;将本地代码推送到 GitHub第 5 步&#xff1a;在 GitHub 上检查结果后续工作流程 你…...

[论文梳理] 足式机器人规划控制流程 - 接触碰撞的控制 - 模型误差 - 自动驾驶车的安全合规(4个课堂讨论问题)

目录 问题 1&#xff1a;足式机器人运动规划 & 控制的典型流程 (pipline) 1.1 问题 1.2 目标 1.3 典型流程&#xff08;Pipeline&#xff09; 1.3.1 环境感知&#xff08;Perception&#xff09; 1.3.2 高层规划&#xff08;High-Level Planning&#xff09; 1.3.3 …...

初中级前端面试全攻略:自我介绍模板、项目讲解套路与常见问答

为了给面试官留下专业而亲切的第一印象&#xff0c;自我介绍要突出与岗位相关的技能和项目经验&#xff0c;同时以自己擅长的领域开放式结尾​。通常可以按照以下思路组织自我介绍内容&#xff1a;首先简单介绍个人信息和工作年限&#xff0c;然后列出精通的前端技术栈&#xf…...

Android开发中svg转xml工具使用

要使用 svg2vector-cli 工具通过命令行将 SVG 文件转换为 Android 可用的 XML 矢量图标文件&#xff0c;可以单个文件转换或者整个文件夹批量转换&#xff0c;以下是详细的步骤和说明&#xff1a; 1. 准备工作 1.1 下载工具 首先需要下载 svg2vector-cli-1.0.0.jar 或更高版本…...

爬虫技术入门:基本原理、数据抓取与动态页面处理

引言 在当今数据驱动的时代&#xff0c;网络爬虫技术已成为获取和分析互联网数据的重要手段。无论是搜索引擎的网页收录、竞品数据分析&#xff0c;还是学术研究的语料收集&#xff0c;爬虫技术都发挥着关键作用。本文将深入浅出地讲解爬虫的基本原理&#xff0c;分析它能获取…...

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月27日第65弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…...

服务器数据备份,服务器怎么备份数据呢?

企业数据量呈指数级增长&#xff0c;服务器数据备份已成为保障业务连续性、抵御勒索攻击与合规审查的核心技术环节。当前&#xff0c;服务器数据备份方案需兼顾数据完整性、恢复时效性、存储经济性三大核心诉求&#xff0c;其实现路径可根据技术架构、数据规模及容灾等级划分为…...

语音识别质量的跟踪

背景 这个项目是用来生成结构化的电子病历的。数据的来源是医生的录音。中间有一大堆的处理&#xff0c;语音识别&#xff0c;关键字匹配&#xff0c;结构化处理&#xff0c;病历编辑......。最多的时候给上百家医院服务。 语音识别质量的跟踪 一、0225医院的训练后的情况分…...

【数据挖掘】时间序列预测-时间序列的平稳性

时间序列的平稳性 &#xff08;1&#xff09;平稳性定义&#xff08;2&#xff09;平稳性处理方法2.1 差分法2.2 季节调整&#xff08;Seasonal Adjustment&#xff09;2.3 趋势移除&#xff08;Detrending&#xff09;2.4 对数转换&#xff08;Logarithmic Transformation&…...