贪吃蛇项目:GameRun与GameEnd部分:游戏的主体运行与善后部分

准备工作:打印得分信息

            在进行GameStart之前,我们需要在地图的右侧打印帮助信息,以及目前玩家的得分情况和一个食物在当前速度下的得分情况(加速的状态下按比例增加食物的分数,减速的状态下则相反),至于打印的方法,在上两篇文章中已经介绍完毕,这里我们直接给出实现代码:

void GameIntroduction()
{Set_Pos(65, 10);wprintf(L"↑ ↓ ← →进行移动\n");Set_Pos(65, 11);wprintf(L"退出游戏请按Esc\n");Set_Pos(65, 12);wprintf(L"暂停请按空格\n");Set_Pos(65, 13);wprintf(L"小键盘1,2键加减速\n");
}void ScoreStat(pSnake ps)
{REPOSITION(63, 8);wprintf(L"当前总分数%d", ps->_Socre);REPOSITION(63, 7);wprintf(L"当前速度一个食物分数为%d", ps->_foodWeight);
}void GameRun(pSnake ps)
{GameIntroduction();do{ScoreStat(ps);} while (ps->_Status == OK);
}

           打印获得的成绩放在循环里面,则是因为每次玩家按完加减速之后,得分的权重都会改变,要实时更新。而我们的介绍信息则只需要打印一遍。

一,键位检测的实现

在此之前,我们要先定义一个宏:

#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)

            这里我们只需要知道它能检测键位是否被按过即可,不做过多介绍,如果想更为细节的了解,可以参考官网的解释:getAsyncKeyState 函数 (winuser.h) - Win32 apps | Microsoft Learn

接下来我们用多个if-else语句来实现玩家按下不同键位时的检测:

void GameRun(pSnake ps)
{GameIntroduction();do{ScoreStat(ps);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_NUMPAD1)){if (ps->_SleepTime > 100){ps->_SleepTime -= 50;ps->_foodWeight += 2;}}else if (KEY_PRESS(VK_NUMPAD2)){if (ps->_SleepTime < 500){ps->_SleepTime += 50;ps->_foodWeight -= 2;}}else if (KEY_PRESS(VK_SPACE)){Pause();}else if (KEY_PRESS(VK_ESCAPE)){ps->_Status = END_NOMAL;break;}} while (ps->_Status == OK);
}

           这里当玩家按上键时调整蛇的方向为上,但如果此时方向朝下调整方向为上,就会使蛇自己咬住自己。左右方向也是同理。下面为实现的暂停函数(Pause):

void Pause()
{while (!KEY_PRESS(VK_SPACE)){Sleep(200);}
}

当玩家在此按下空格键时,我们结束暂停的状态。

           当然,在每次检测完后,用Sleep函数暂停一下,至于暂停的时间,其实就是根据蛇的移动速度来设置:

Sleep(ps->_SleepTime);

二,蛇的移动函数的实现

2.1下一个位置节点的初始化

           我们这里使用SnakeMove来命名我们的移动函数。由于我们的链表需要使用malloc开辟,所以我们需要用malloc来开辟蛇的下一个位置的节点,当然在开辟完成后,我们还需要检验开辟是否成功:

	pSnakeNode NextNode = (pSnakeNode)malloc(sizeof(SnakeNode));if (NextNode == NULL){perror("malloc():SnakeMove:NextNode");return;}

           我们已经知道,控制台的长宽之比为1 :2,所以,如果接下来蛇往左移动,则他的x坐标则需要增加两个字符位置,向上向下则只需要移动y一个字符位置即可:

NextNode->x = ps->_pSnake->x;
NextNode->y = ps->_pSnake->y;
NextNode->next = NULL;
switch (ps->_Dir)
{case RIGHT:{NextNode->x += 2;NextNode->y += 0;break;}case LEFT:{NextNode->x -= 2;NextNode->y += 0;break;}case UP:{NextNode->x += 0;NextNode->y += 1;break;}case DOWN:{NextNode->x += 0;NextNode->y -= 1;break;}
}

2.2判断下一个位置是否为食物

           接下来如果下一个位置为食物,或不为食物,我们也需要检测,首先我们设置一个函数NestIsFood来检验下一个位置是否为食物:

int NextIsFood(pSnakeNode psn, pSnake ps)
{return(psn->x == ps->_pFood->x && psn->y == ps->_pFood->y);
}

           直接返回值即可,如果下一个位置为食物,我们用EatFood函数将蛇的长度加一,否则我们使用NoFood来让蛇移动一格:

void EatFood(pSnake ps, pSnakeNode psn)
{psn->next = ps->_pSnake;ps->_pSnake = psn;pSnakeNode cur = ps->_pSnake;while (cur){Set_Pos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->_Socre += ps->_foodWeight;free(ps->_pFood);FoodInit(ps);
}
void NoFood(pSnake ps, pSnakeNode psn)
{psn->next = ps->_pSnake;ps->_pSnake = psn;pSnakeNode cur = ps->_pSnake;while (cur->next->next){Set_Pos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}REPOSITION(cur->next->x, cur->next->y);printf("  ");free(cur->next);cur->next = NULL;
}

           这里我们说明一下NoFood函数中打印两个空格的原因,因为我们的蛇是通过打印移动的,所以当我们把NextNode节点接到蛇头上时,我们需要把最后一个节点删除,但仔细思考一下,上回打印蛇身的字符是否还会保留,这会使它遗留在屏幕上。所以我们要打印两个空格(因为我们的蛇身为宽字符占两个字节)将其从屏幕上抹除。

2.3判断蛇是否咬住自身或撞墙

           这里我们用两个函数KillByWall,KillBySelf来分别表示蛇是否撞墙,蛇是否咬住自己。是否撞墙我们只需要判断蛇头位置是否与墙体位置重合,而是否咬住自己只需要判断蛇头位置是否与自身的其他部分重合:

int KillBySelf(pSnake ps)
{pSnakeNode cur = ps->_pSnake->next;while (cur){if ((ps->_pSnake->x == cur->x) && (ps->_pSnake->y == cur->y)){ps->_Status = KILL_BY_SELF;return 1;}cur = cur->next;}return 0;
}int KillByWall(pSnake ps)
{if ((ps->_pSnake->x == 0) || (ps->_pSnake->x == 56) || (ps->_pSnake->y == 0) || (ps->_pSnake->y == 26)){ps->_Status = KILL_BY_WALL;return 1;}return 0;
}

           其实设置为void类型也可以,不过为了区分情况,方便起见,我用返回1或0来区分是否撞墙(咬自己)。

2.4GameRun部分代码

void GameRun(pSnake ps)
{GameIntroduction();do{ScoreStat(ps);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_NUMPAD1)){if (ps->_SleepTime > 100){ps->_SleepTime -= 50;ps->_foodWeight += 2;}}else if (KEY_PRESS(VK_NUMPAD2)){if (ps->_SleepTime < 500){ps->_SleepTime += 50;ps->_foodWeight -= 2;}}else if (KEY_PRESS(VK_SPACE)){Pause();}else if (KEY_PRESS(VK_ESCAPE)){ps->_Status = END_NOMAL;break;}Sleep(ps->_SleepTime);SnakeMove(ps);} while (ps->_Status == OK);
}

2.5SnakeMove部分代码

void SnakeMove(pSnake ps)
{pSnakeNode NextNode = (pSnakeNode)malloc(sizeof(SnakeNode));if (NextNode == NULL){perror("malloc():SnakeMove:NextNode");return;}NextNode->x = ps->_pSnake->x;NextNode->y = ps->_pSnake->y;NextNode->next = NULL;switch (ps->_Dir){case RIGHT:{NextNode->x += 2;NextNode->y += 0;break;}case LEFT:{NextNode->x -= 2;NextNode->y += 0;break;}case UP:{NextNode->x += 0;NextNode->y += 1;break;}case DOWN:{NextNode->x += 0;NextNode->y -= 1;break;}}if (NextIsFood(NextNode,ps)){EatFood(ps, NextNode);}else{NoFood(NextNode,ps);}KillByWall(ps);KillBySelf(ps);
}

三,GameEnd部分

           这一部分其实没有什么好说的,因为我们上面的代码已经将蛇的状态信息设置好了,所以我们这里只需要根据上面储存进去的信息来打印我们目前的游戏状态即可:

void GameEnd(pSnake ps)
{pSnakeNode cur = ps->_pSnake;Set_Pos(24, 12);switch (ps->_Status){case END_NOMAL:printf("你主动退出游戏\n");break;case KILL_BY_SELF:printf("你咬到自己了 ,游戏结束!\n");break;case KILL_BY_WALL:printf("你撞墙了,游戏结束!\n");break;}while (cur){pSnakeNode del = cur;cur = cur->next;free(del);}
}

四,完整游戏代码

4.1Snake.h

#pragma once
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>#define WALL L'□'
#define FOOD L'★'
#define BODY L'●'
#define POS_X 24
#define POS_Y 5#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)typedef struct SnakeNode
{int x;int y;struct SnakeNode* next;
}SnakeNode, * pSnakeNode;typedef struct Snake
{pSnakeNode _pSnake;//维护整条蛇的指针pSnakeNode _pFood;//维护⻝物的指针enum DIRECTION _Dir;//蛇头的⽅向,默认是向右enum GAME_STATUS _Status;//游戏状态int _Socre;//游戏当前获得分数int _foodWeight;//默认每个⻝物10分int _SleepTime;//每⾛⼀步休眠时间
}Snake, * pSnake;enum DIRECTION
{UP = 1,DOWN,LEFT,RIGHT
};enum GAME_STATUS
{OK,//正常运⾏KILL_BY_WALL,//撞墙KILL_BY_SELF,//咬到⾃⼰END_NOMAL//正常结束
};void REPOSITION(short x, short y);//调整输入的光标位置void WelcomeMenu();//设置欢迎与介绍菜单void GameMap();//设置游戏地图void GameIntroduction();//设置在游戏过程中的提醒void GameStart(pSnake ps);//游戏的初始化void SnakeInit(pSnake ps);//蛇身的初始化void FoodInit(pSnake ps);//初始化食物void GameRun(pSnake ps);//游戏主体运行部分void ScoreStat(pSnake ps);//分数统计void Pause();//空格暂停void SnakeMove(pSnake ps);//控制蛇移动的函数int NextIsFood(pSnakeNode psn, pSnake ps);//判断下一个位置是否为食物void EatFood(pSnake ps, pSnakeNode psn);//是食物的情况下吃掉食物void NoFood(pSnakeNode psn, pSnake ps);//非食物的情况下进行移动int KillBySelf(pSnake ps);int KillByWall(pSnake ps);void GameEnd(pSnake ps);

4.2Snake.c

           这里面的设置位置函数是REPOSITION(这是我第一遍做成功的代码,至于文章里面Set_Pos是我为了写文章又重新写了一遍代码)。

#include "snake.h"void REPOSITION(short x, short y)
{HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x,y };SetConsoleCursorPosition(houtput,pos);
}void WelcomeMenu()
{REPOSITION(35, 10);wprintf(L"欢迎来到贪吃蛇小游戏");REPOSITION(35, 20);system("pause");system("cls");REPOSITION(35, 10);wprintf(L"按 ↑ ↓ ← →键操控贪吃蛇移动\n");REPOSITION(35, 11);wprintf(L"按小键盘‘1’或‘2’键加速或减速\n");REPOSITION(35, 12);wprintf(L"Tips:加速吃食物有额外分数加成");REPOSITION(35, 20);system("pause");system("cls");
}void GameMap()
{REPOSITION(0, 0);int i = 0;for (; i < 58; i += 2){wprintf(L"%lc", WALL);}REPOSITION(0, 26);for (i = 0; i < 58; i += 2){wprintf(L"%lc", WALL);}for (i = 1; i < 26; i++){REPOSITION(0, i);wprintf(L"%lc", WALL);}for (i = 1; i < 26; i++){REPOSITION(56, i);wprintf(L"%lc", WALL);}
}void GameIntroduction()
{REPOSITION(65, 10);wprintf(L"↑ ↓ ← →进行移动\n");REPOSITION(65, 11);wprintf(L"退出游戏请按Esc\n");REPOSITION(65, 12);wprintf(L"暂停请按空格\n");REPOSITION(65, 13);wprintf(L"小键盘1,2键加减速\n");
}void GameStart(pSnake ps)
{srand((unsigned int)time(NULL));system("mode con cols=100 lines=30");system("title 贪吃蛇");HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo = { 25,false };SetConsoleCursorInfo(houtput, &CursorInfo);WelcomeMenu();GameMap();SnakeInit(ps);FoodInit(ps);
}void SnakeInit(pSnake ps)
{int i = 0;pSnakeNode cur = NULL;for (i = 0; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL){perror("SnakeInit():malloc()cur:");return;}cur->next = NULL;cur->x = POS_X + 2 * i;cur->y = POS_Y;if (ps->_pSnake == NULL){ps->_pSnake = cur;}else{cur->next = ps->_pSnake;ps->_pSnake = cur;}}cur = ps->_pSnake;while (cur){REPOSITION(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->_Dir = RIGHT;ps->_foodWeight = 10;ps->_SleepTime = 300;ps->_Socre = 0;ps->_Status = OK;
}void FoodInit(pSnake ps)
{int x = 0;int y = 0;again:do{x = rand()%53 + 2;y = rand()%24 + 1;} while (x % 2 != 0);pSnakeNode cur = ps->_pSnake;while (cur){if (cur->x == x && cur->y == y)goto again;cur = cur->next;}pSnakeNode cur2 = (pSnakeNode)malloc(sizeof(SnakeNode));if (cur2 == NULL){perror("malloc():FoofInit:cur2:");return;}cur2->next = NULL;cur2->x = x;cur2->y = y;REPOSITION(x, y);wprintf(L"%lc", FOOD);ps->_pFood = cur2;cur2 = NULL;
}void ScoreStat(pSnake ps)
{REPOSITION(63, 8);wprintf(L"当前总分数%d", ps->_Socre);REPOSITION(63, 7);wprintf(L"当前速度一个食物分数为%d", ps->_foodWeight);
}void Pause()
{while (!KEY_PRESS(VK_SPACE)){Sleep(200);}
}int NextIsFood(pSnakeNode psn, pSnake ps)
{return(psn->x == ps->_pFood->x && psn->y == ps->_pFood->y);
}void EatFood(pSnake ps,pSnakeNode psn)
{psn->next = ps->_pSnake;ps->_pSnake = psn;pSnakeNode cur = ps->_pSnake;while (cur){REPOSITION(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->_Socre += ps->_foodWeight;free(ps->_pFood);FoodInit(ps);
}void NoFood(pSnakeNode psn,pSnake ps)
{psn->next = ps->_pSnake;ps->_pSnake = psn;pSnakeNode cur = ps->_pSnake;while (cur->next->next){REPOSITION(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}REPOSITION(cur->next->x, cur->next->y);printf("  ");free(cur->next);cur->next = NULL;
}int KillByWall(pSnake ps)
{if ((ps->_pSnake->x == 0)|| (ps->_pSnake->x == 56)|| (ps->_pSnake->y == 0)|| (ps->_pSnake->y == 26)){ps->_Status = KILL_BY_WALL;return 1;}return 0;
}int KillBySelf(pSnake ps)
{pSnakeNode cur = ps->_pSnake->next;while (cur){if ((ps->_pSnake->x == cur->x)&& (ps->_pSnake->y == cur->y)){ps->_Status = KILL_BY_SELF;return 1;}cur = cur->next;}return 0;
}void SnakeMove(pSnake ps)
{pSnakeNode NextNode = (pSnakeNode)malloc(sizeof(SnakeNode));if (NextNode == NULL){perror("malloc():SnakeMove:NextNode");return;}NextNode->x = ps->_pSnake->x;NextNode->y = ps->_pSnake->y;NextNode->next = NULL;switch (ps->_Dir){case RIGHT:{NextNode->x += 2;NextNode->y += 0;break;}case LEFT:{NextNode->x -= 2;NextNode->y += 0;break;}case UP:{NextNode->x += 0;NextNode->y += 1;break;}case DOWN:{NextNode->x += 0;NextNode->y -= 1;break;}}if (NextIsFood(NextNode,ps)){EatFood(ps, NextNode);}else{NoFood(NextNode,ps);}KillByWall(ps);KillBySelf(ps);
}void GameRun(pSnake ps)
{GameIntroduction();do{ScoreStat(ps);if (KEY_PRESS(VK_UP) && ps->_Dir != DOWN){ps->_Dir = DOWN;}else if (KEY_PRESS(VK_DOWN) && ps->_Dir != UP){ps->_Dir = UP;}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_NUMPAD1)){if (ps->_SleepTime > 100){ps->_SleepTime -= 50;ps->_foodWeight += 2;}}else if (KEY_PRESS(VK_NUMPAD2)){if (ps->_SleepTime < 500){ps->_SleepTime += 50;ps->_foodWeight -= 2;}}else if (KEY_PRESS(VK_SPACE)){Pause();}else if (KEY_PRESS(VK_ESCAPE)){ps->_Status = END_NOMAL;break;}Sleep(ps->_SleepTime);SnakeMove(ps);} while (ps->_Status == OK);
}void GameEnd(pSnake ps)
{pSnakeNode cur = ps->_pSnake;REPOSITION(24, 12);switch (ps->_Status){case END_NOMAL:printf("你主动退出游戏\n");break;case KILL_BY_SELF:printf("你咬到自己了 ,游戏结束!\n");break;case KILL_BY_WALL:printf("你撞墙了,游戏结束!\n");break;}while (cur){pSnakeNode del = cur;cur = cur->next;free(del);}
}

4.3test.c

#include "snake.h"void test()
{int ch = 0;do{Snake snake = { 0 };GameStart(&snake);//游戏初始化GameRun(&snake);//游戏运行GameEnd(&snake);//游戏的善后处理REPOSITION(20, 15);printf("再来一局吗?(y/n):");ch = getchar();getchar();} while (ch == 'y');system("cls");
}int main()
{setlocale(LC_ALL, "");test();return 0;
}

           贪吃蛇的内容到这里就完结了,至于下一次更新要到7月10号左右了(一是过暑假了想摸会鱼,二是在c语言准备开数据结构的新坑),我们下篇文章见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建筑信息模型(BIM)的应用与案例研究:塑造建筑与施工的新纪元

在数字化浪潮的推动下&#xff0c;建筑信息模型&#xff08;Building Information Modeling, BIM&#xff09;已从一项新兴技术发展为建筑与施工领域不可或缺的核心工具。本文将深入探讨BIM技术的应用原理&#xff0c;分享实际案例&#xff0c;揭示其如何引领建筑行业走向更加高…

Docker(八)-Docker运行mysql8容器实例

1.运行mysql8容器实例并挂载数据卷 -e:配置环境变量 --lower_case_table_names1 设置忽略表名大小写一定要放在镜像之后运行mysql8容器实例之前&#xff0c;先查看是否存在mysql8镜像以及是否存在已运行的mysql实例docker run -d -p 3306:3306 --privilegedtrue -v 【宿主机日…

2.深入探索Python世界:从快捷键到变量类型,掌握数据运算的奥秘

在Python编程的奇妙之旅中&#xff0c;我们不仅需要理解代码的逻辑和结构&#xff0c;还需要熟练掌握工具和技巧&#xff0c;以便更高效地编写和调试代码。本篇文章将带您深入了解PyCharm的常用快捷键、Python中的注释、函数、变量、数据类型以及基本的运算符&#xff0c;为您揭…

修复 pprof ---node_exproter访问漏洞(go-pprof-leak)

前言&#xff1a; ** 在Go语言中&#xff0c;pprof和debug包是用来检测和避免goroutine泄漏&#xff0c;避免导致goroutine泄漏&#xff0c;进而消耗大量系统资源。不过对于安全而言确又存在一定风险&#xff0c;** 风险&#xff1a; 通过node_exporter web发现 190.168.46.1…

关于Claude3.5-Sonnet引以为傲的功能,在半年前就被某国产平台无情碾压的那档事!

前言&#xff1a; Anthropic声称其每隔几个月就会对Claude发布一次重大版本的更新。距离今年3月份Claude3发布&#xff0c;已经又过去了3个多月的时间。果不其然&#xff0c;6月21日Anthropic 在X上正式官宣发布全新大模型 Claude3.5 Sonnet&#xff0c;号称它能够碾压GPT4o&a…

前端Web开发HTML5+CSS3+移动web视频教程 Day1

链接 HTML 介绍 写代码的位置&#xff1a;VSCode 看效果的位置&#xff1a;谷歌浏览器 安装插件 open in browser&#xff1a; 接下来要保证每次用 open in browser 打开的是谷歌浏览器。只需要将谷歌浏览器变为默认的浏览器就可以了。 首先进入控制面板&#xff0c;找到默…

Windows11环境下安装Vmware Workstation 16的方法

1、下载VMWare 从网盘下载 https://pan.baidu.com/share/init?surlUpcnqiRv6nUuzO0EOZ22zg 提取码&#xff1a;8888 2、安装VMware虚拟机   第1步&#xff1a;双击上面准备好的Vmware Workstation 16虚拟机软件安装包&#xff0c;即可看到如图所示的安装向导初始界面&#x…

编程设计思想

健康检查脚本 nmap:扫描端口 while true do healthycurl B:httpPORT/healthy -i | grep HTTP/1.1 | tail -n 1 | awk {print $2} done 批量操作类型脚本&#xff08;记录每一步日志&#xff09; 将100个nginx&#xff1a;vn推送到harbor仓库192.168.0.100 根据镜像对比sha值…

数据中心网络100GbE发展趋势

100G光产品的技术突破不断满足超大规模数据中心的需求。5G的发展使许多行业能够实现高数据吞吐量和低延迟。从2017年至今&#xff0c;不少企业已经升级到100G数据中心网络&#xff0c;进而追求400G/800G网络。与此同时&#xff0c;其他小型数据中心已逐渐升级至100G。 是什么推…

安装与配置:MySQL的环境搭建之旅(二)

目录 引言&#xff1a;从理论到实践的跨越 一、安装MySQL&#xff1a;跨平台的便捷指南 Windows环境 Linux环境 macOS环境 二、基本配置&#xff1a;端口设置与字符集选择 三、从零到一的蜕变 引言&#xff1a;从理论到实践的跨越 在前一章节《MySQL简介》中&#xff0c…

【efinix】efinity如何安装官方补丁patch

efinix官网可以下载efinity的官方补丁。 下载 efinity-2023.2.307.5.10-windows-x64-patch.zip 解压缩补丁zip 压缩包内容 files/ : updated files to be copied into the Efinity installation run.sh : patch installation script (Linux on…

ZGC垃圾收集的主要流程

值得说明的是&#xff0c;在执行就地迁移时&#xff0c;ZGC 必须首先压缩指定为对象迁移区域内的对象&#xff0c;这可能会对性能产生负面影响。增加堆大小可以帮助 ZGC 避免使用就地迁移。 如上图&#xff0c;ZGC 的工作流程主要包括以下几个步骤&#xff1a; &#xff08;STW…

深入理解计算机系统 CSAPP 家庭作业7.13

用一下496页提到的工具咯 A: whereis libm.a file lidm.a gedit libm.a libm.a是个ASCII text文件打开一看原来 libm-2.27.a 和libmvec.a才是我们要看的 所以我们cd到目标地址后 ar -t libm-2.27.a ar -t libmvec.a B: gcc -Og bar5.c foo5.c 用之前的两个文件链接后生成…

若依项目实战------企业人力资源管理平台

一、数据库名称规范化及建表相关 1.术语名称 1.系统名称&#xff1a;企业人力资源管理平台英文翻译&#xff1a;Enterprise Human Resource Management Platform缩写&#xff1a;EHR 2.员工信息管理&#xff08;Employee Information Management 缩写&#xff1a;EIM&#…

使用API有效率地管理Dynadot域名,为文件夹更名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

适用于 Windows 11 的 5 大数据恢复软件 [免费和付费]

为什么我们需要Windows 11数据恢复软件&#xff1f; 计算机用户经常遇到的一件事就是数据丢失&#xff0c;这种情况随时可能发生。错误地删除重要文件和文件夹可能会非常令人担忧&#xff0c;但幸运的是&#xff0c;有一种方法可以恢复 PC 上丢失的数据。本文将向您展示可用于…

通过Socket通信实现局域网下Amov无人机连接与数据传输

1.局域网下的通信 1.1 局域网 厂家提供的方式是通过Homer图数传工具(硬件)构建的amov局域网实现通信连接. 好处是通信距离足够长,支持150m;坏处是"局部",无法访问互联网. &#xff3b;&#xff29;&#xff2d;&#xff21;&#xff27;&#xff25;&#xff1a;…

经销or直营,新老车企殊途终要同归

步入2024&#xff0c;汽车圈的新人、老人都逐渐活成了对方的样子。 2024年5月&#xff0c;先后有消息传来&#xff0c;阿维塔要从直营模式全部转向经销模式&#xff0c;蔚来新发布的子品牌“乐道”未来可能考虑合作或加盟&#xff0c;并单独建设门店。 而就在5月1日&#xff…

Qt开发 | Qt控件 | QTabWidget基本用法 | QListWidget应用详解 | QScrollArea应用详解

文章目录 一、QTabWidget基本用法二、QListWidget应用详解1.列表模式1.1 基本操作1.2 添加自定义item1.3 如何添加右键菜单1.4 QListWidget如何删除item 2.图标模式 三、QScrollArea应用详解 一、QTabWidget基本用法 QTabWidget 是 Qt 框架中的一个类&#xff0c;它提供了一个选…

DM达梦数据库数学函数整理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…