基于链表实现贪吃蛇游戏

本文中,我们将使用链表和一些Win32 API的知识来实现贪吃蛇小游戏

一、功能

(1)游戏载入界面

(2)地图的绘制

(3)蛇身的移动和变长

(4)食物的生成

(5)死亡判定

(6)计算得分

(7)退出游戏和暂停游戏

实现贪吃蛇小游戏,我们需要创建3个文件来实现不同的部分

  • Snake.c:游戏函数的实现
  • Snake.h:结构体定义、头文件引用、宏定义和函数声明
  • test.c:主函数的实现

二、Snake.h 

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <stdbool.h>
#include <locale.h>#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)#define WALL L'□'
#define BODY L'●'
#define FOOD L'★'//蛇的初始位置
#define POS_X 24
#define POS_Y 5enum GAME_STATUS
{RUN,ESC,KILL_BY_WALL,KILL_BY_SELF,
};enum DIRECTION
{UP,DOWN,LEFT,RIGHT,
};//蛇⾝节点
typedef struct SnakeNode
{short x;short y;struct SnakeNode* next;
}SnakeNode;typedef struct Snake
{SnakeNode* pSnake;//指向蛇头SnakeNode* Food; int SleepTime;int Score;int FoodScore;enum GAME_STATUS Status;enum DIRECTION Dir;
}Snake;void GameStart(Snake* ps);void GameRun(Snake* ps);void GameEnd(Snake* ps);void SetPos(short x, short y);//设置光标坐标void WelcomeToGame();//欢迎界面void CreateMap();//创建地图void InitSnake(Snake* ps);//初始化蛇void CreateFood(Snake* ps);//生成食物void PrintHelpInfo();//打印教程void SnakeMove(Snake* ps);//蛇身移动void EatFood(Snake* ps, SnakeNode* next);//移动后吃到食物void NotEatFood(Snake* ps, SnakeNode* next);//移动后没吃到食物void KillByWall(Snake* ps);//检测是否撞墙void KillBySelf(Snake* ps);//检测是否撞到自己

三、Snake.c

在Snake.c中,我们将整个游戏拆分成游戏前的准备、游戏运行中和游戏结束后三部分

首先要在头文件中定义蛇的节点等相关信息

enum GAME_STATUS //游戏状态的枚举
{RUN, //游戏正常运行中ESC, //正常退出游戏KILL_BY_WALL, //撞到墙导致游戏结束KILL_BY_SELF, //撞到自己导致游戏结束
};enum DIRECTION //蛇身方向的枚举
{UP,DOWN,LEFT,RIGHT,
};//蛇⾝节点
typedef struct SnakeNode
{short x; //x轴坐标short y; //y轴坐标struct SnakeNode* next;
}SnakeNode;typedef struct Snake
{SnakeNode* pSnake; //指向蛇头SnakeNode* Food;  //指向食物int SleepTime; //蛇身运动的速度int Score; //总分数int FoodScore; //每个食物的分数enum GAME_STATUS Status; //游戏运行的状态enum DIRECTION Dir; //蛇身方向
}Snake;

接下来就可以开始设计游戏前的准备程序了

2.1 游戏前的准备

为了美观,我们可以使用一些cmd命令来设置控制台窗口的长宽等信息

控制台窗口实际上是有坐标的,也就是有行和列的

最左上角的位置的坐标为(0,0),像这样的一个字符高为1 宽为1

所以我们可以通过cmd命令将控制台设置为30行,100列,并将标题改成贪吃蛇

void GameStart(Snake* ps)
{system("mode con cols=100 lines=30");system("title 贪吃蛇");HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//获得设备句柄CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(handle, &CursorInfo);      //获得光标信息CursorInfo.bVisible = false;                    //设置光标为不可见SetConsoleCursorInfo(handle, &CursorInfo);      //保存光标信息//欢迎界面WelcomeToGame();//创建地图CreateMap();//初始化蛇InitSnake(ps);//生成食物CreateFood(ps);
}

将剩下的四个功能分别分装在四个函数中

(1)欢迎界面

void WelcomeToGame()//欢迎界面
{SetPos(45, 10);printf("欢迎来到贪吃蛇小游戏");SetPos(45, 15);system("pause");system("cls");SetPos(35, 10);printf("用 ↑.↓.←.→ 控制蛇的行动,F3为加速,F4为减速");SetPos(35, 11);printf("加速能得到更多的分数");SetPos(45, 15);system("pause");system("cls");
}

其中,SetPos函数是用来设置光标坐标的,因为在控制台中printf中的内容会从光标的位置开始打印。

void SetPos(short x, short y) // 设置光标坐标
{COORD pos = {x, y};HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(handle, pos);
}

完成后的效果如下:

(2)创建地图

创建地图时需要用到宽字符的打印,宽字符也就是高为1 宽为2的字符,需要用wprintf函数打印

void CreateMap() // 创建地图
{SetPos(0, 0);int i = 0;for (i = 0; i < 58; i += 2){SetPos(i, 0);wprintf(L"%lc", L'□');}for (i = 0; i < 58; i += 2){SetPos(i, 26);wprintf(L"%lc", L'□');}for (i = 1; i < 26; i++){SetPos(0, i);wprintf(L"%lc", L'□');}for (i = 1; i < 26; i++){SetPos(56, i);wprintf(L"%lc", L'□');}
}

使用循环把墙体打印出来即可 

我们也可以用宏定义将 L'□' 替换

#define WALL L'□'

(3)初始化蛇

void InitSnake(Snake *ps) // 初始化蛇
{SnakeNode *cur = ps->pSnake = NULL;for (int i = 0; i < 5; i++){cur = (SnakeNode *)malloc(sizeof(SnakeNode));if (cur == NULL){perror("InitSnake:malloc fail");return;}cur->next = NULL;cur->x = POS_X + i * 2;cur->y = POS_Y;if (ps->pSnake == NULL)ps->pSnake = cur;else{cur->next = ps->pSnake;ps->pSnake = cur;}}while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->Food = NULL;ps->SleepTime = 200;ps->Score = 0;ps->FoodScore = 10;ps->Status = RUN;ps->Dir = RIGHT;
}

对Snake结构体中的各项信息进行初始化即可,主要难点在于蛇身的创建 

这里的蛇身和蛇的初始位置也用了宏定义

#define BODY L'●'
//蛇的初始位置
#define POS_X 24
#define POS_Y 5

 (4)生成食物

void CreateFood(Snake *ps) // 生成食物
{int x = 0;int y = 0;SnakeNode *cur = ps->pSnake;
again:do{x = rand() % 53 + 2;y = rand() % 25 + 1;} while (x % 2 == 1);while (cur){if (cur->x == x || cur->y == y){goto again;break;}cur = cur->next;}ps->Food = (SnakeNode *)malloc(sizeof(SnakeNode));if (ps->Food == NULL){perror("CreateFood:malloc fail");return;}ps->Food->x = x;ps->Food->y = y;SetPos(x, y);wprintf(L"%lc", FOOD);
}

随机生成食物要用到rand函数,并且食物不能跑出地图外,我们要注意一下细节

1.宽字符占两格,所以x必须为偶数

2.食物要保持在地图内部,x轴范围为2~54,也就是(0~52)+2,y轴同理

3.食物不能和蛇身重合

这里的食物也用了宏定义

#define FOOD L'★'

2.2 游戏运行中

这一部分需要包含分数等信息的打印和按键输入的判定等功能

这里将按键输入的判断封装为了宏

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

GetAsyncKeyState的返回值是short类型,在上一次调用完该函数后,如果返回的16位的short数据中最高位是1,说明按键的状态为按下,最高位是0则为抬起 

void GameRun(Snake* ps)
{PrintHelpInfo();//打印教程do{//打印信息SetPos(60, 10);printf("当前得分:%2d", ps->Score);SetPos(60, 11);printf("当前速度:%3d", (400 - ps->SleepTime) / 40);SetPos(60, 12);printf("每个食物得分:%2d", ps->FoodScore);//判断按键if (KEY_PRESS(VK_UP) && ps->Dir != DOWN){ps->Dir = UP;}if (KEY_PRESS(VK_DOWN) && ps->Dir != UP){ps->Dir = DOWN;}if (KEY_PRESS(VK_LEFT) && ps->Dir != RIGHT){ps->Dir = LEFT;}if (KEY_PRESS(VK_RIGHT) && ps->Dir != LEFT){ps->Dir = RIGHT;}if (KEY_PRESS(VK_ESCAPE)){ps->Status = ESC;break;}if (KEY_PRESS(VK_SPACE)){pause();}if (KEY_PRESS(VK_F3)){if (ps->SleepTime > 40){ps->SleepTime -= 40;ps->FoodScore += 2;}}if (KEY_PRESS(VK_F4)){if (ps->FoodScore > 2){ps->SleepTime += 40;ps->FoodScore -= 2;}}Sleep(ps->SleepTime);//蛇身移动SnakeMove(ps);} while (ps->Status == RUN);
}

(1)打印教程

void PrintHelpInfo() // 打印教程
{SetPos(60, 16);printf("请按空格键开始游戏");SetPos(60, 17);printf("不能撞到墙上或者撞到自己");SetPos(60, 18);printf("用 ↑.↓.←.→ 控制蛇的行动");SetPos(60, 19);printf("F3为加速,F4为减速");SetPos(60, 20);printf("ESC:退出游戏  space:暂停游戏");
}

效果如下

(2)暂停游戏

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

这里需要实现按一次空格暂停,再按一次恢复的效果,所以在循环内部还需要设置按键的判定。 

(3)蛇身移动

void SnakeMove(Snake *ps) // 蛇身移动
{SnakeNode *next = (SnakeNode *)malloc(sizeof(SnakeNode));if (next == NULL){perror("SnakeMove:malloc fail");return;}switch (ps->Dir){case UP:next->x = ps->pSnake->x;next->y = ps->pSnake->y - 1;break;case DOWN:next->x = ps->pSnake->x;next->y = ps->pSnake->y + 1;break;case LEFT:next->x = ps->pSnake->x - 2;next->y = ps->pSnake->y;break;case RIGHT:next->x = ps->pSnake->x + 2;next->y = ps->pSnake->y;break;}if (next->x == ps->Food->x && next->y == ps->Food->y)EatFood(ps, next);elseNotEatFood(ps, next);KillByWall(ps);KillBySelf(ps);
}

malloc一个新节点放到蛇头下一步移动到的位置,替换成新的蛇头。位置的计算根据蛇身的方向来计算坐标即可。

如果蛇的下一步吃到了食物,就不需要尾删,如果没吃到食物则需要尾删一次并且抹除尾巴

并且每一步移动都需要判定是否撞墙或撞到自己 

(4)移动后吃到食物的情况

void EatFood(Snake *ps, SnakeNode *next) // 移动后吃到食物
{next->next = ps->pSnake;ps->pSnake = next;SetPos(next->x, next->y);wprintf(L"%lc", BODY);ps->Score += ps->FoodScore;free(ps->Food);ps->Food = NULL;CreateFood(ps);
}

将原先的蛇头和新节点相连,更新蛇头的地址并且打印出新蛇头,不要忘了吃到食物后加分,还要创建一个新的食物 

(5)移动后没吃到食物的情况

void NotEatFood(Snake *ps, SnakeNode *next) // 移动后没吃到食物
{next->next = ps->pSnake;ps->pSnake = next;SnakeNode *cur = ps->pSnake;while (cur->next->next){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}SetPos(cur->next->x, cur->next->y);printf("  ");free(cur->next);cur->next = NULL; // 不置空会出现问题
}

还是将原先的蛇头和新节点链接,但是这次需要把尾部的节点删除并抹除尾节点 

(6)检测是否撞墙

void KillByWall(Snake *ps) // 检测是否撞墙
{if (ps->pSnake->x == 0 ||ps->pSnake->x == 56 ||ps->pSnake->y == 0 ||ps->pSnake->y == 25){ps->Status = KILL_BY_WALL;}
}

检测蛇头的坐标和墙的坐标是否重合即可 

(7)检测是否撞到自己

void KillBySelf(Snake *ps) // 检测是否撞到自己
{SnakeNode *cur = ps->pSnake->next;while (cur){if (ps->pSnake->x == cur->x && ps->pSnake->y == cur->y){ps->Status = KILL_BY_SELF;}cur = cur->next;}
}

 检测蛇头的坐标是否和蛇身任一节点重合即可

2.3 游戏结束后

void GameEnd(Snake *ps)
{SetPos(24, 12);switch (ps->Status){case KILL_BY_SELF:printf("你撞到了自己");break;case KILL_BY_WALL:printf("你撞到墙了");break;case ESC:printf("游戏退出中...");break;}SnakeNode *cur = ps->pSnake;while (ps->pSnake){ps->pSnake = ps->pSnake->next;free(cur);cur = ps->pSnake;}
}

根据游戏的状态打印不同的信息,并且释放蛇身的内存空间 

2.4 完整代码

#include "snake.h"void SetPos(short x, short y)//设置光标坐标
{COORD pos = { x,y };HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(handle, pos);
}void WelcomeToGame()//欢迎界面
{SetPos(45, 10);printf("欢迎来到贪吃蛇小游戏");SetPos(45, 15);system("pause");system("cls");SetPos(35, 10);printf("用 ↑.↓.←.→ 控制蛇的行动,F3为加速,F4为减速");SetPos(35, 11);printf("加速能得到更多的分数");SetPos(45, 15);system("pause");system("cls");
}void CreateMap()//创建地图
{SetPos(0, 0);int i = 0;for (i = 0; i < 58; i += 2){SetPos(i, 0);wprintf(L"%lc", WALL);}for (i = 0; i < 58; i += 2){SetPos(i, 26);wprintf(L"%lc", WALL);}for (i = 1; i < 26; i++){SetPos(0, i);wprintf(L"%lc", WALL);}for (i = 1; i < 26; i++){SetPos(56, i);wprintf(L"%lc", WALL);}
}void InitSnake(Snake* ps)//初始化蛇
{SnakeNode* cur = ps->pSnake = NULL;for (int i = 0; i < 5; i++){cur = (SnakeNode*)malloc(sizeof(SnakeNode));if (cur == NULL){perror("InitSnake:malloc fail");return;}cur->next = NULL;cur->x = POS_X + i * 2;cur->y = POS_Y;if (ps->pSnake == NULL)ps->pSnake = cur;else{cur->next = ps->pSnake;ps->pSnake = cur;}}while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->Food = NULL;ps->SleepTime = 200;ps->Score = 0;ps->FoodScore = 10;ps->Status = RUN;ps->Dir = RIGHT;
}void CreateFood(Snake* ps)//生成食物
{int x = 0;int y = 0;SnakeNode* cur = ps->pSnake;
again:do {x = rand() % 53 + 2;y = rand() % 25 + 1;} while (x % 2 == 1);while (cur){if (cur->x == x || cur->y == y){goto again;break;}cur = cur->next;}ps->Food = (SnakeNode*)malloc(sizeof(SnakeNode));if (ps->Food == NULL){perror("CreateFood:malloc fail");return;}ps->Food->x = x;ps->Food->y = y;SetPos(x, y);wprintf(L"%lc", FOOD);
}void GameStart(Snake* ps)
{system("mode con cols=100 lines=30");system("title 贪吃蛇");HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(handle, &CursorInfo);CursorInfo.bVisible = false;SetConsoleCursorInfo(handle, &CursorInfo);WelcomeToGame();CreateMap();InitSnake(ps);CreateFood(ps);
}void PrintHelpInfo()//打印教程
{SetPos(60, 16);printf("请按空格键开始游戏");SetPos(60, 17);printf("不能撞到墙上或者撞到自己");SetPos(60, 18);printf("用 ↑.↓.←.→ 控制蛇的行动");SetPos(60, 19);printf("F3为加速,F4为减速");SetPos(60, 20);printf("ESC:退出游戏  space:暂停游戏");
}void pause()//暂停游戏
{while (1){Sleep(200);if (KEY_PRESS(VK_SPACE)){break;}}
}void EatFood(Snake* ps, SnakeNode* next)//移动后正好吃到食物
{next->next = ps->pSnake;ps->pSnake = next;SetPos(next->x, next->y);wprintf(L"%lc", BODY);ps->Score += ps->FoodScore;free(ps->Food);ps->Food = NULL;CreateFood(ps);
}void NotEatFood(Snake* ps, SnakeNode* next)//移动后没吃到食物
{next->next = ps->pSnake;ps->pSnake = next;SnakeNode* cur = ps->pSnake;while (cur->next->next){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}SetPos(cur->next->x, cur->next->y);printf("  ");free(cur->next);cur->next = NULL;//亲测不置空会出现问题
}void KillByWall(Snake* ps)//检测是否撞墙
{if (ps->pSnake->x == 0 ||ps->pSnake->x == 56 ||ps->pSnake->y == 0 ||ps->pSnake->y == 25){ps->Status = KILL_BY_WALL;}
}void KillBySelf(Snake* ps)//检测是否撞到自己
{SnakeNode* cur = ps->pSnake->next;while (cur){if (ps->pSnake->x == cur->x && ps->pSnake->y == cur->y){ps->Status = KILL_BY_SELF;}cur = cur->next;}
}void SnakeMove(Snake* ps)//蛇身移动
{SnakeNode* next = (SnakeNode*)malloc(sizeof(SnakeNode));if (next == NULL){perror("SnakeMove:malloc fail");return;}switch (ps->Dir){case UP:next->x = ps->pSnake->x;next->y = ps->pSnake->y - 1;break;case DOWN:next->x = ps->pSnake->x;next->y = ps->pSnake->y + 1;break;case LEFT:next->x = ps->pSnake->x - 2;next->y = ps->pSnake->y;break;case RIGHT:next->x = ps->pSnake->x + 2;next->y = ps->pSnake->y;break;}if (next->x == ps->Food->x && next->y == ps->Food->y)EatFood(ps, next);elseNotEatFood(ps, next);KillByWall(ps);KillBySelf(ps);
}void GameRun(Snake* ps)
{PrintHelpInfo();do{//打印信息SetPos(60, 10);printf("当前得分:%2d", ps->Score);SetPos(60, 11);printf("当前速度:%3d", (400 - ps->SleepTime) / 40);SetPos(60, 12);printf("每个食物得分:%2d", ps->FoodScore);//判断按键if (KEY_PRESS(VK_UP) && ps->Dir != DOWN){ps->Dir = UP;}if (KEY_PRESS(VK_DOWN) && ps->Dir != UP){ps->Dir = DOWN;}if (KEY_PRESS(VK_LEFT) && ps->Dir != RIGHT){ps->Dir = LEFT;}if (KEY_PRESS(VK_RIGHT) && ps->Dir != LEFT){ps->Dir = RIGHT;}if (KEY_PRESS(VK_ESCAPE)){ps->Status = ESC;break;}if (KEY_PRESS(VK_SPACE)){pause();}if (KEY_PRESS(VK_F3)){if (ps->SleepTime > 40){ps->SleepTime -= 40;ps->FoodScore += 2;}}if (KEY_PRESS(VK_F4)){if (ps->FoodScore > 2){ps->SleepTime += 40;ps->FoodScore -= 2;}}Sleep(ps->SleepTime);//蛇身移动SnakeMove(ps);} while (ps->Status == RUN);
}void GameEnd(Snake* ps)
{SetPos(24, 12);switch (ps->Status){case KILL_BY_SELF:printf("你撞到了自己");break;case KILL_BY_WALL:printf("你撞到墙了");break;case ESC:printf("游戏退出中...");break;}SnakeNode* cur = ps->pSnake;while (ps->pSnake){ps->pSnake = ps->pSnake->next;free(cur);cur = ps->pSnake;}
}

四、test.c

#include "snake.h"void Test()
{srand((unsigned int)time(NULL));char ch = 0;do{Snake snake;GameStart(&snake);GameRun(&snake);GameEnd(&snake);if (snake.Status == ESC)break;SetPos(24, 13);printf("再来一局吗?(Y/N):");scanf(" %c", &ch);} while (ch == 'Y' || ch == 'y');SetPos(0, 27);
}int main()
{setlocale(LC_ALL, "chs");Test();return 0;
}

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

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

相关文章

CentOS 7 部署 ZeroTier Moon 节点

ZeroTier是一套使用UDP协议构建的SD-WAN网络软件&#xff0c;其主要有三部分组成&#xff1a;行星服务器Planet、月亮服务器Moon、客户端节点LEFA&#xff0c;行星服务器是ZeroTier的根节点&#xff0c;可以采用ZeroTier官方的服务器&#xff0c;也可以使用开源代码自行搭建 月…

JAVA处理类似饼状图占比和100%问题,采用最大余额法

前言&#xff1a; 在做数据统计报表的时候&#xff0c;有两种方式解决占比总和达不到100%或者超过100%问题。 第一种方式是前端echart图自带的算分框架。 第二种方式是java后端取处理这个问题。 现存问题&#xff1a; 前端通过饼状图的方式去展示各个分类的占比累加和为100%问题…

公司宣传电子画册的制作方法

​制作公司宣传电子画册是一种非常有效的方式&#xff0c;可以展示公司的形象和产品&#xff0c;同时也可以吸引更多的潜在客户。不仅低碳环保&#xff0c;还省了不少人力和财力&#xff0c;只要一个二维码、一个链接就能随时随地访问公司的宣传画册。以下是一些制作电子画册的…

TSINGSEE青犀视频智慧电梯管理平台,执行精准管理、提升乘梯安全

一、方案背景 随着城市化进程的不断加快&#xff0c;我国已经成为全球最大的电梯生产和消费市场&#xff0c;电梯也成为人们日常生活中不可或缺的一部分。随着电梯数量的激增&#xff0c;电梯老龄化&#xff0c;维保数据不透明&#xff0c;物业管理成本高&#xff0c;政府监管…

openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表

文章目录 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表211.1 禁止操作211.2 高危操作 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表 各项操作请严格遵守指导书操作&#xff0c;同时避免执行如下高危操作。 211.1 禁止操作 表1中描述在产品的操…

【golang】22、functional options | 函数式编程、闭包

文章目录 一、配置 Option1.1 options1.2 funcitonal options 一、配置 Option 1.1 options https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html I’ve been trying on and off to find a nice way to deal with setting options in a…

数学公式OCR识别php 对接mathpix api 使用公式编译器

数学公式OCR识别php 对接mathpix api 一、注册账号官网网址&#xff1a;https://mathpix.com 二、该产品支持多端使用注意说明&#xff08;每月10次&#xff09; 三、api 对接第一步创建create keyphp对接api这里先封装两个请求函数&#xff0c;get 和post &#xff0c;通过官方…

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动 2024/1/30 12:58 缘起&#xff0c;为了在ubuntu20.4.6下使用whisper&#xff0c;以前用的是GTX1080M&#xff0c;装了535的驱动。 现在在PDD拼多多上了入手了一张二手的GTX1080&#xff0c;需要将安装最新的545的驱动程序&#…

VxTerm:SSH工具中的中文显示和乱码时的相关信息和一些基本的知识

当我们写的程序含有控制台(Console)输出时&#xff0c;如果输入内容包含中文时&#xff0c;我们一般需要知道下面的信息&#xff0c;才能正确的搞清楚怎么处理中文显示的问题&#xff1a; 1、实际程序或文件中的实际编码&#xff1a; Linux下的应用程序和文本文件&#xff0c;…

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析

本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案&#xff0c;开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞&#xff0c;该漏洞源于文件server/application/api/contr…

云原生Kubernetes: Ubuntu 安装 K8S 1.23版本(单Master架构) 及故障恢复

目录 一、实验 1.环境 2.安装 Ubuntu 3.连接Ubuntu 4.master节点安装docker 5.node节点安装docker 6.master节点安装K8S 7.添加K8S工作节点 8.安装网络插件calico 9.故障 10.故障恢复 11.测试k8s网络和coredns 二、问题 1.Ubuntu如何修改镜像源 2.Ubuntu和Windo…

DataTable.Load(reader)注意事项

对于在C#中操作数据库查询&#xff0c;这样的代码很常见&#xff1a; using var cmd ExecuteCommand(sql); using var reader cmd.ExecuteReader(); DataTable dt new DataTable(); dt.Load(reader); ...一般的查询是没问题的&#xff0c;但是如果涉及主键列的查询&#xf…

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型

目录 往期精彩内容&#xff1a; 前言 1 快速傅里叶变换FFT原理介绍 第一步&#xff0c;导入部分数据 第二步&#xff0c;故障信号可视化 第三步&#xff0c;故障信号经过FFT可视化 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 交叉注意力机制 …

网站地址怎么改成HTTPS?

现在&#xff0c;所有类型的网站都需要通过 HTTPS 协议进行安全连接&#xff0c;而实现这一目标的唯一方法是使用 SSL 证书。如果您不将 HTTP 转换为 HTTPS&#xff0c;浏览器和应用程序会将您网站的连接标记为不安全。 但用户询问如何将我的网站从 HTTP 更改为 HTTPS。在此页…

移动端设计规范 - 文字使用规范

这是一篇关于移动端产品界面设计时&#xff0c;文字大小的使用规范&#xff0c;前端人员如果能了解一点的话&#xff0c;在实际开发中和设计沟通时&#xff0c;节省沟通成本&#xff0c;也能提高设计落地开发时的还原度。 关于 在做移动端产品设计时&#xff0c;有时候使用文字…

【开源精选导航】GitHub-Chinese-Top-Charts:一榜在手,优质中文项目轻松找寻

各位热爱开源技术的朋友们&#xff0c;你们是否有过这样的困扰&#xff1a;面对浩瀚的GitHub海洋&#xff0c;想找寻那些具有高质量中文文档的优秀开源项目却无从下手&#xff1f;今天&#xff0c;我们就为大家揭晓一个宝藏般的开源项目——GitHub 中文项目集合&#xff08;访问…

二维数组移动,合并数值简易2048

2848简易核心运算 --多元素合并数组举例4*4 -- 星空露珠韩永旗制作 --数据合并并重新赋值 --多元素合并数组举例4*4 -- 星空露珠韩永旗制作 --数据合并并重新赋值 local data{{0,2,0,2}, {4,2,0,8}, {8,0,8,4}, {2,2,4,8}} local ch{{1…

【Node.js基础】Node.js的介绍与安装

文章目录 前言一、什么是Node.js&#xff1f;二、安装Node.js2.1 Windows系统2.2 macOS系统2.3 Linux系统 三、运行js代码总结 前言 随着互联网技术的不断发展&#xff0c;构建高性能、实时应用的需求日益增长。Node.js作为一种服务器端运行时环境&#xff0c;以其事件驱动、非…

万户 ezOFFICE SendFileCheckTemplateEdit.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

从比亚迪的整车智能战略,看王传福的前瞻市场布局

众所周知&#xff0c;作为中国新能源汽车的代表企业&#xff0c;比亚迪在中国乃至全球的新能源汽车市场一直都扮演着引领者的角色。2024年新年伊始&#xff0c;比亚迪又为新能源汽车带来了一项重磅发布。 整车智能才是真智能 近日&#xff0c;在“2024比亚迪梦想日”上&#xf…