贪吃蛇项目: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语言准备开数据结构的新坑),我们下篇文章见。
相关文章:

贪吃蛇项目:GameRun与GameEnd部分:游戏的主体运行与善后部分
准备工作:打印得分信息 在进行GameStart之前,我们需要在地图的右侧打印帮助信息,以及目前玩家的得分情况和一个食物在当前速度下的得分情况(加速的状态下按比例增加食物的分数,减速的状态下则相反)…...

mysql索引、事务以及存储引擎
目录 一、索引 1)索引定义 2)工作方式 3)创建索引的依据 4)索引类型 1、index普通索引 2、unique唯一索引 3、主键索引 4、多列组合索引 5、全文索引 5)删除索引 6)查看索引 7)索…...

idea添加文档注释
一、easy javadoc插件 在settings的plugins中下载easy javadoc插件。 安装完成后重启idea,再次打开settings界面。会出现easyDoc相关配置。 二、设置模版以及使用 类描述模版参考设置: /** * 类描述 -> * * Author: ywz * Date: $Date$ */ 方法描述…...
python函数练习
1、编写函数,传入N,求123…N的和 def s_sum(num):i 1sum1 0while i < num:sum1 ii 1return sum1num int(input(请输入一个整数:)) print(和为:,s_sum(num))2、编写一个函数,定义一个列表,求列表中的最大值 d…...

基于PHP的奶茶商城系统
有需要请加文章底部Q哦 可远程调试 基于PHP的奶茶商城系统 一 介绍 此奶茶商城系统基于原生PHP开发,数据库mysql,ajax实现数据交换。系统角色分为用户和管理员。系统在原有基础上添加了糖度的选择。 技术栈 phpmysqlajaxphpstudyvscode 二 功能 用户…...

物联网“此用户无权修改接入点名称设置”解决方案
根本原因apns-conf.xml里面没有 符合 物理网卡 的配置 可以先加一个APN试一下,看看默认的MCC和MNC是什么 然后在”命令行“查询一下 adb shell sqlite3 /data/user_de/0/com.android.providers.telephony/databases/telephony.db "select * from carriers wh…...
网工常见面试题
1-10题 1.介绍TCP/IP四层、五层模型作用及每层包含的协议 TCP/IP四层模型 应用层: 作用:直接与应用程序交互,定义了应用程序如何通过网络发送数据。包含协议:HTTP(网页浏览)、FTP(文件传输&…...

SQL实现UUIDv7
当我们选择数据库的主键类型时,通常会考虑自增数字或者 UUID。但是这两种类型都有优缺点,自增字段简单有序,性能良好,最大的问题是无法保证全局唯一性,分布式场景受限;UUID 具有全局唯一性,适合…...

2024期权交易佣金手续费最低是多少?期权交易有哪些成本?
显性成本 期权交易的显性成本包含期权交易的佣金和交易所费用,分别支付给券商和交易所,统一由券商代收。 佣金 期权佣金是期权交易时支付给券商的费用,佣金通常以交易金额的一定比例计算,可以是固定费用,也可以是滑…...

合合信息智能文档抽取:赋能不良资产管理行业的数字化转型
官.网地址:合合TextIn - 合合信息旗下OCR云服务产品 随着数字化浪潮的汹涌澎湃,全球各行各业正经历着前所未有的变革。人工智能技术的快速发展,以其独特的创新能力和应用潜力,正在深刻地改变着业务模式,推动产业效率的…...

【别再用Excel了!】这款免费可视化工具能帮你轻松提升效率
现代数据分析和展示的需求已经远远超出了传统工具的能力,尤其是在需要快速、直观和高效地处理复杂数据的情况下。山海鲸可视化通过其强大的功能和易用性,成为了设计师以及各类新手用户的理想选择。下面我就以一个可视化设计师的角度,和大家简…...
python holidays获取中国节日
在Python中,holidays库是一个流行的库,用于处理各种国家和地区的公共假期。然而,需要注意的是,截至2024年,holidays库的官方版本可能并不直接支持中国的所有节日。不过,我们可以通过扩展或自定义该类库来添…...

Jenkins流水线发布,一篇就解决你的所有疑惑
这次搭建的项目比较常规,前端是react写的,后端是springboot,并且由于是全栈开发,所以是在同一个项目中。接下来我演示下怎么用jenkins进行自动化发布。 1.jenkins必装插件 这里用到的是jenkinsFile主要是基于Groovy这个沙盒,有些前置插件。这里使用maven进行打包,所以需…...

安装zabbix时报错Could not resolve host: mirrors.huaweicloud.com;Unknown error解决办法
目录 1、问题原因 2、解决办法 3、知识拓展 DNS的区别 DNS配置文件解析 域名解析过程 4、书籍推荐 当安装Zabbix server,Web前端,agent时出现: [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安装过程中会出…...
【Linux】CentOS 7 安装配置 postfix 邮件服务器随笔
本文并不是完整配置教程,只是配置过程中零散代码随笔,不成系统 记录配置 PostFix 邮件服务器过程,由于经常用到,会不定时更新完善 yum install -y postfix dovecot cyrus-sasl-plain cyrus-sasl mailx# 设置hostname hostnamect…...

vue3 使用JsMind的方法,以及引入提示报错,无法找到模块“jsmind”的声明文件
最终结果: 一、使用:使用yarn或者npm 安装 yarn add jsmind npm install vue-jsmind 二、引入 两种方法:(如果这样引入没问题按照这样引入) import "jsmind/style/jsmind.css"; import JsMind from &quo…...

狗都能看懂的DBSCAN算法详解
文章目录 DBSCAN简介DBSCAN算法流程运行机制举个实例 DBSCAN算法特点DBSCAN参数选取技巧 ϵ \epsilon ϵ的选取:找突变点MinPts的选取 DBSCAN简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的…...
运维岗高危操作
序号 高危操作指令 可能存在风险 维护操作要求 1 rm –rf rm –rf是删除文件夹和里面附带内容的一种最快捷的方法,可能会文件误删,导致数据丢失 使用rm –rf命令时千万要小心,可以在.bashrc里面添加: alias rm ‘rm -i’ ,…...

【ajax基础02】URL详解
目录 一:什么是URL 二:URL组成 协议 编辑 域名(在url中必须写) 资源路径 三:URL查询参数 定义: 语法格式: 如何利用axios实现特定数据查询: 语法格式: 案例:…...

MySQL 7种Join的定义图解示范结果(所有join类型)
文章目录 MySQL 7种Join的定义&图解&示范&结果(所有join类型)基本知识笛卡尔积 建表&填充数据1-Join不带条件account筛选 1-Inner Join 内连接不带条件account相同where筛选玩点特殊的 2-Left Join 左连接不带条件account筛选 3-Right J…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...

【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)
目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题,描述如下: 我在qtdesigner用界面拖了一个QTableView控件,object name为【tableView_electrode】,然后【提升为】了自定义的类【Steer_Electrode_Table】&…...