【C语言项目】贪吃蛇(下)

在这里插入图片描述
个人主页~
源码在Gitee仓库~
上一篇贪吃蛇(上)~


贪吃蛇

  • 四、核心的实现
    • 游戏测试
    • 1、GameStart
      • (1)控制台窗口大小和名字设置
      • (2)光标隐藏
      • (3)打印欢迎界面
      • (4)创建地图
      • (5)初始化蛇
      • (6)创建第一个食物
      • 最终的GameStart
    • 2、GameRun
      • (1)定义一个宏来检测按键状态
      • (2)PrintHelpInfo
      • (3)SnakeMove
      • (4)NextIsFood
      • (5)EatFood
      • (6)NoFood
      • (7)KillBySelf
      • (8)KillByWall
      • 最终的GameRun
    • 3、GameEnd
  • 五、源代码拷贝
    • Snake.h
    • Snake.c
    • game.h
    • 实际运行

四、核心的实现

游戏测试

#include <locale.h>
void test()
{int ch = 0;srand((unsigned int)time(NULL));//时间戳,用来实现随机数do{Snake snake = { 0 };GameStart(&snake);GameRun(&snake);GameEnd(&snake);SetPos(20, 15);printf("再来⼀局吗?(Y/N):");ch = getchar();getchar();} while (ch == 'Y');SetPos(0, 27);}
int main()
{//修改当前地区为本地模式,为了⽀持中⽂宽字符的打印setlocale(LC_ALL, "");//测试逻辑test();return 0;
}

1、GameStart

(1)控制台窗口大小和名字设置

system("mode con cols=100 lines=30");
system("title 贪吃蛇");

(2)光标隐藏

	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(houtput, &CursorInfo);CursorInfo.bVisible = false;SetConsoleCursorInfo(houtput, &CursorInfo);

(3)打印欢迎界面

void WelcomeToGame()
{SetPos(40, 15);printf("欢迎来到贪吃蛇⼩游戏");SetPos(40, 25);// “按任意键继续”的出现的位置system("pause");//可以让页面暂停在这个位置,直到用户按下一个键system("cls");//清除屏幕SetPos(25, 12);printf("⽤ ↑ . ↓ . ← . → 分别控制蛇的移动, F3为加速,F4为减速\n");SetPos(25, 13);printf("加速将能得到更⾼的分数。\n");SetPos(40, 25);// “按任意键继续”的出现的位置,这里可以让文字出现的位置看起来比较美观system("pause");system("cls");
}

在这里插入图片描述
在这里插入图片描述

(4)创建地图

组成地图的小格子需要用宽字符打印
58行就打印29次

#define WALL L'□'  
//在头文件中定义
void CreateMap()
{//上int i = 0;for (i = 0; i < 29; i++){wprintf(L"%lc", WALL);}//下SetPos(0, 26);for (i = 0; i < 29; i++){wprintf(L"%lc", WALL);}//左for (i = 1; i <= 25; i++){SetPos(0, i);wprintf(L"%lc", WALL);}//右for (i = 1; i <= 25; i++){SetPos(56, i);wprintf(L"%lc", WALL);}
}

在这里插入图片描述

(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("malloc fail");exit(1);}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){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);//将蛇的身体依据链表打印出来cur = cur->next;}ps->_dir = RIGHT;//初始蛇的方向ps->_food_weight = 10;//每个食物的分数ps->_sleep_time = 200;//每两次打印蛇身的间隔,也就是蛇身的速度ps->_sorce = 0;//初始总分数ps->_status = OK;//蛇的初始状态
}

在这里插入图片描述

(6)创建第一个食物

void CreateFood(pSnake ps)
{int x = 0;int y = 0;
again:	do{x = rand() % 53 + 2;//我们要的x坐标值介于2~54间,任意数%53得到的值介于0~52,加上2就在2~56范围y = rand() % 25 + 1;//我们要的y坐标值介于1~25间,任意数%25得到的值介于0~24,加上1就在1~25范围//随机数时间戳,根据时间计算的数据,由于时间是不可修改切没有相同时候的,所以它产生的数字被认为是随机数} while (x % 2 != 0);pSnakeNode cur = ps->_pSnake;//记录蛇头结点while (cur){if (x == cur->x && y == cur->y){goto again;}cur = cur->next;}//如果食物与蛇身上某一节点重合了,则回到again处重新生成pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));//不重合就生成食物if (pFood == NULL){perror("malloc fail");exit(2);}pFood->x = x;pFood->y = y;pFood->next = NULL;SetPos(x, y);wprintf(L"%lc", FOOD);//在对应位置处打印食物ps->_pFood = pFood;
}

在这里插入图片描述

最终的GameStart

void GameStart(pSnake ps)
{//设置控制台窗⼝的⼤⼩,30⾏,100列//mode 为DOS命令system("mode con cols=100 lines=30");//设置cmd窗⼝名称system("title 贪吃蛇"); //获取标准输出的句柄(⽤来标识不同设备的数值)HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//影藏光标操作CONSOLE_CURSOR_INFO CursorInfo;//获取控制台光标信息GetConsoleCursorInfo(hOutput, &CursorInfo);//隐藏控制台光标CursorInfo.bVisible = false; //设置控制台光标状态SetConsoleCursorInfo(hOutput, &CursorInfo);//打印欢迎界⾯WelcomeToGame();//打印地图CreateMap();//初始化蛇InitSnake(ps);//创造第⼀个⻝物CreateFood(ps);
}

2、GameRun

(1)定义一个宏来检测按键状态

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

在上一篇博文中我们介绍了GetAsyncKeyState函数,我们封装一个宏可以判断某个键是否被按下

(2)PrintHelpInfo

void PrintHelpInfo()
{SetPos(64, 14);wprintf(L"%ls", L"不能穿墙,不能咬到自己");SetPos(64, 16);wprintf(L"%ls", L"用 ↑. ↓ . ← . → 来控制蛇的移动");SetPos(64, 18);wprintf(L"%ls", L"按F3加速,F4减速");SetPos(64, 20);wprintf(L"%ls", L"按ESC退出游戏,按空格暂停游戏");SetPos(64, 24);wprintf(L"%ls", L"s_little_monster_倾情制作");
}

在这里插入图片描述

(3)SnakeMove

void SnakeMove(pSnake ps)
{pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));//开辟预测的下一个节点if (pNextNode == NULL){perror("malloc fail");exit(3);}switch (ps->_dir)//用switch语句判断此时蛇的走向{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;//注意左右移动是加减2pNextNode->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);}//判断下一个位置是否为食物,是则进入EatFood,不是则进入NoFoodKillBySelf(ps);KillByWall(ps);//检查是否撞到自己或墙而死亡
}

(4)NextIsFood

int NextIsFood(pSnakeNode pn,pSnake ps)
{return (ps->_pFood->x == pn->x && ps->_pFood->y == pn->y);//如果当前位置是食物则返回非0值,不是返回0
}

(5)EatFood

void EatFood(pSnakeNode pn, pSnake ps)
{ps->_pFood->next = ps->_pSnake;ps->_pSnake = ps->_pFood;//吃掉食物,让食物成为蛇的头节点free(pn);//因为节点pn与节点_pFood是一个节点,所以free掉其中的一个pn = NULL;pSnakeNode cur = ps->_pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}//打印蛇身ps->_sorce += ps->_food_weight;//加分CreateFood(ps);//重新制造食物
}

(6)NoFood

void NoFood(pSnakeNode pn, pSnake ps)
{pn->next = ps->_pSnake;ps->_pSnake = pn;//同EatFood,将下一节点成为头结点pSnakeNode cur = ps->_pSnake;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("  ");//将尾节点打印为空格free(cur->next);//free掉尾节点cur->next = NULL;
}

(7)KillBySelf

void KillBySelf(pSnake ps)
{pSnakeNode pur = ps->_pSnake->next;while (pur){//当此时的蛇头位置与蛇身某一节点重合时if (pur->x == ps->_pSnake->x && pur->y == ps->_pSnake->y){ps->_status = KILL_BY_SELF;//修改状态为 KILL_BY_SELFbreak;}pur = pur->next;}
}

在这里插入图片描述

(8)KillByWall

void 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;//修改状态为 KILL_BY_WALL}
}

在这里插入图片描述

最终的GameRun

void GameRun(pSnake ps)
{PrintHelpInfo();//游戏玩法帮助打印do{SetPos(64, 10);printf("总分数:%d\n", ps->_sorce);SetPos(64, 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_SPACE)){Pause();//暂停,等待再按下空格继续}else if (KEY_PRESS(VK_ESCAPE)){ps->_status = END_NORMAL;}else if (KEY_PRESS(VK_F3))//F3为加速,休眠时间变少也就是蛇的速度变快,每个食物分数增加2{if(ps->_sleep_time > 80)//速度不能太快{ps->_sleep_time -= 30;ps->_food_weight += 2;}}else if (KEY_PRESS(VK_F4))//F4为减速,休眠时间变多也就是蛇的速度变慢,每个食物分数减少2{if(ps->_food_weight > 2)//食物分数要在2分以上{ps->_sleep_time += 30;ps->_food_weight -= 2;}}SnakeMove(ps);//蛇每走一步要进行的活动Sleep(ps->_sleep_time);//走一步休眠的时间,也就是蛇的速度} while (ps->_status == OK);//当游戏状态为OK时循环继续
}

3、GameEnd

当游戏状态不为OK时,告知游戏结束的原因并释放蛇身

void GameEnd(pSnake ps)
{SetPos(24, 12);switch (ps->_status){case END_NORMAL:wprintf(L"主动结束游戏");break;case KILL_BY_SELF:wprintf(L"撞到自己了,游戏结束");break;case KILL_BY_WALL:wprintf(L"撞到墙了,游戏结束");break;}pSnakeNode pur = ps->_pSnake;while (pur){pSnakeNode del = pur;pur = pur->next;free(del);}
}

五、源代码拷贝

Snake.h

#pragma once#include <stdio.h>
#include <windows.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>#define POS_X 24
#define POS_Y 5#define WALL L'□'
#define BODY L'◆'
#define FOOD L'★'enum DIRECTION
{UP = 1,DOWN,LEFT,RIGHT
};enum GAME_STATUS
{OK,KILL_BY_WALL,KILL_BY_SELF,END_NORMAL
};typedef struct SnakeNode 
{int x;int y;struct SnakeNode* next;
}SnakeNode, *pSnakeNode;typedef struct Snake
{pSnakeNode _pSnake;pSnakeNode _pFood;enum DRECTION _dir;enum GAME_STATUS _status;int _food_weight;int _sorce;int _sleep_time;
}Snake,*pSnake;void SetPos(short x, short y);void GameStart(pSnake ps);void CreateMap();void WelcomeToGame();void InitSnake(pSnake ps);void CreateFood(pSnake ps);void GameRun(pSnake ps);void SnakeMove(pSnake ps);int NextIsFood(pSnakeNode pn, pSnake ps);void EatFood(pSnakeNode pn, pSnake ps);void NoFood(pSnakeNode pn, pSnake ps);void KillByWall(pSnake ps);void KillBySelf(pSnake ps);void GameEnd(pSnake ps);

Snake.c

#include "snake.h"void SetPos(short x, short y)
{HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x,y };SetConsoleCursorPosition(houtput, pos);
}void WelcomeToGame()
{SetPos(40, 14);wprintf(L"欢迎来到贪吃蛇小游戏\n");SetPos(42, 20);system("pause");system("cls");SetPos(25, 14);wprintf(L"用 ↑. ↓ . ← . → 来控制蛇的移动,按F3加速,F4减速\n");SetPos(25, 15);wprintf(L"加速能够得到更高的分数\n");SetPos(42, 20);system("pause");system("cls");
}void CreateMap()
{//上int i = 0;for (i = 0; i < 29; i++){wprintf(L"%lc", WALL);}//下SetPos(0, 26);for (i = 0; i < 29; i++){wprintf(L"%lc", WALL);}//左for (i = 1; i <= 25; i++){SetPos(0, i);wprintf(L"%lc", WALL);}//右for (i = 1; i <= 25; i++){SetPos(56, i);wprintf(L"%lc", WALL);}
}
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("malloc fail");exit(1);}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){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);//将蛇的身体依据链表打印出来cur = cur->next;}ps->_dir = RIGHT;//初始蛇的方向ps->_food_weight = 10;//每个食物的分数ps->_sleep_time = 200;//每两次打印蛇身的间隔,也就是蛇身的速度ps->_sorce = 0;//初始总分数ps->_status = OK;//蛇的初始状态
}void CreateFood(pSnake ps)
{int x = 0;int y = 0;
again:	do{x = rand() % 53 + 2;//我们要的x坐标值介于2~54间,任意数%53得到的值介于0~52,加上2就在2~56范围y = rand() % 25 + 1;//我们要的y坐标值介于1~25间,任意数%25得到的值介于0~24,加上1就在1~25范围//随机数时间戳,根据时间计算的数据,由于时间是不可修改切没有相同时候的,所以它产生的数字被认为是随机数} while (x % 2 != 0);pSnakeNode cur = ps->_pSnake;//记录蛇头结点while (cur){if (x == cur->x && y == cur->y){goto again;}cur = cur->next;}//如果食物与蛇身上某一节点重合了,则回到again处重新生成pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));//不重合就生成食物if (pFood == NULL){perror("malloc fail");exit(2);}pFood->x = x;pFood->y = y;pFood->next = NULL;SetPos(x, y);wprintf(L"%lc", FOOD);//在对应位置处打印食物ps->_pFood = pFood;
}void GameStart(pSnake ps)
{system("mode con cols=100 lines=30");system("title 贪吃蛇");HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);//隐藏光标CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(houtput, &CursorInfo);CursorInfo.bVisible = false;SetConsoleCursorInfo(houtput, &CursorInfo);WelcomeToGame();CreateMap();InitSnake(ps);CreateFood(ps);}void PrintHelpInfo()
{SetPos(64, 14);wprintf(L"%ls", L"不能穿墙,不能咬到自己");SetPos(64, 16);wprintf(L"%ls", L"用 ↑. ↓ . ← . → 来控制蛇的移动");SetPos(64, 18);wprintf(L"%ls", L"按F3加速,F4减速");SetPos(64, 20);wprintf(L"%ls", L"按ESC退出游戏,按空格暂停游戏");SetPos(64, 24);wprintf(L"%ls", L"s_little_monster_倾情制作");
}#define KEY_PRESS(vk)  ((GetAsyncKeyState(vk)&1)?1:0)void Pause()
{while (1){Sleep(200);if (KEY_PRESS(VK_SPACE)){break;}}
}int NextIsFood(pSnakeNode pn,pSnake ps)
{return (ps->_pFood->x == pn->x && ps->_pFood->y == pn->y);//如果当前位置是食物则返回非0值,不是返回0
}void EatFood(pSnakeNode pn, pSnake ps)
{ps->_pFood->next = ps->_pSnake;ps->_pSnake = ps->_pFood;//吃掉食物,让食物成为蛇的头节点free(pn);//因为节点pn与节点_pFood是一个节点,所以free掉其中的一个pn = NULL;pSnakeNode cur = ps->_pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}//打印蛇身ps->_sorce += ps->_food_weight;//加分CreateFood(ps);//重新制造食物
}void NoFood(pSnakeNode pn, pSnake ps)
{pn->next = ps->_pSnake;ps->_pSnake = pn;//同EatFood,将下一节点成为头结点pSnakeNode cur = ps->_pSnake;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("  ");//将尾节点打印为空格free(cur->next);//free掉尾节点cur->next = NULL;
}void KillBySelf(pSnake ps)
{pSnakeNode pur = ps->_pSnake->next;while (pur){//当此时的蛇头位置与蛇身某一节点重合时if (pur->x == ps->_pSnake->x && pur->y == ps->_pSnake->y){ps->_status = KILL_BY_SELF;//修改状态为 KILL_BY_SELFbreak;}pur = pur->next;}
}void 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;//修改状态为 KILL_BY_WALL}
}void SnakeMove(pSnake ps)
{pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));//开辟预测的下一个节点if (pNextNode == NULL){perror("malloc fail");exit(3);}switch (ps->_dir)//用switch语句判断此时蛇的走向{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;//注意左右移动是加减2pNextNode->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);}//判断下一个位置是否为食物,是则进入EatFood,不是则进入NoFoodKillBySelf(ps);KillByWall(ps);//检查是否撞到自己或墙而死亡
}void GameRun(pSnake ps)
{PrintHelpInfo();//游戏玩法帮助打印do{SetPos(64, 10);printf("总分数:%d\n", ps->_sorce);SetPos(64, 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_SPACE)){Pause();//暂停,等待再按下空格继续}else if (KEY_PRESS(VK_ESCAPE)){ps->_status = END_NORMAL;}else if (KEY_PRESS(VK_F3))//F3为加速,休眠时间变少也就是蛇的速度变快,每个食物分数增加2{if(ps->_sleep_time > 80)//速度不能太快{ps->_sleep_time -= 30;ps->_food_weight += 2;}}else if (KEY_PRESS(VK_F4))//F4为减速,休眠时间变多也就是蛇的速度变慢,每个食物分数减少2{if(ps->_food_weight > 2)//食物分数要在2分以上{ps->_sleep_time += 30;ps->_food_weight -= 2;}}SnakeMove(ps);//蛇每走一步要进行的活动Sleep(ps->_sleep_time);//走一步休眠的时间,也就是蛇的速度} while (ps->_status == OK);//当游戏状态为OK时循环继续
}void GameEnd(pSnake ps)
{SetPos(24, 12);switch (ps->_status){case END_NORMAL:wprintf(L"主动结束游戏");break;case KILL_BY_SELF:wprintf(L"撞到自己了,游戏结束");break;case KILL_BY_WALL:wprintf(L"撞到墙了,游戏结束");break;}pSnakeNode pur = ps->_pSnake;while (pur){pSnakeNode del = pur;pur = pur->next;free(del);}
}

game.h

#include "snake.h"
#include <locale.h>
void test()
{int c = 0;do{system("cls");Snake snake = { 0 };GameStart(&snake);GameRun(&snake);GameEnd(&snake);SetPos(20, 15);printf("再来一局吗?(Y/N):");c = getchar();while (getchar() != '\n');} while (c == 'Y');SetPos(0, 27);
}int main()
{setlocale(LC_ALL, "");//本地化srand((unsigned int)time(NULL));//时间戳随机数test();return 0;
}

实际运行

贪吃蛇的实际运行


今日分享就到这里了~

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

富阳区石弹村全景图-没拍到景点内容

- - - 石梯山庄旁停车场拍摄 建议雨后去 整个山到处都是消息 整座山都在渗水

云原生技术解析

云原生的概念 云原生是一种软件架构和部署方法&#xff0c;旨在利用云计算的优势&#xff0c;以更灵活、可扩展和可靠的方式构建和部署应用程序。它主要关注在容器、微服务、自动化和持续交付等方面。 云原生技术是指以云计算作为基础&#xff0c;以平台和工具为依托&#xff0…

鸿蒙HarmonyOS开发:List列表组件的使用详解及案例演示(二)

文章目录 一、List组件简介1、List组件2、ListItem组件3、ListItemGroup组件 二、使用ForEach渲染列表三、设置列表分割线四、设置List排列方向五、索引值计算规则六、示例演示1、AlphabetIndexer组件2、代码3、效果 一、List组件简介 在我们常用的手机应用中&#xff0c;经常…

Redis继续(黑马)

Redis持久化 RDB与AOF RDB记录是二进制数据&#xff0c;Redis停机时会触发保存&#xff0c;名称&#xff1a; dump.rdb 缺点&#xff1a;间歇式复制可能存在宕机数据更新丢失 AOF 记录的写操作命令&#xff0c;每秒记录一下&#xff0c;也存在数据更新丢失的可能&#xff0c;相…

7. path路径绘制:使用path绘制曲线

曲线在SVG中通常是通过贝塞尔曲线命令来绘制的&#xff0c;包括二次贝塞尔曲线&#xff08;Q&#xff09;和三次贝塞尔曲线&#xff08;C&#xff09;。这些命令允许我们创建平滑的曲线路径。 贝塞尔曲线的原理 贝塞尔曲线的基本原理是通过控制点和锚点来定义一条曲线的形状。…

Shell循环语句之while

一.while语句 重复测试某个条件&#xff0c;只要条件成立则反复执行 whlie 条件测试操作 do 命令序列 done 示例&#xff1a; 1.计算1到100所有整数的和 2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和、奇数和…

基于Springboot的家教管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的家教管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

JVM 类的使用与卸载

文章目录 1. 类的使用2. 类的卸载2.1 类、类的加载器、类的实例之间的引用关系2.2 何种情况会被卸载2.3 类卸载在实际生产中情况如何2.4 方法区的垃圾回收 上一篇文章: JVM 类的加载过程详解 介绍了类的加载过程, 这篇文章来介绍类在完成加载后的使用及其卸载. 1. 类的使用 任何…

设计模式-结构型-适配器模式-Adapter

地址类 public class Address {public void street() {System.out.println("普通的街道");}public void zip() {System.out.println("普通的邮政编码");}public void city() {System.out.println("普通的城市");} } 荷兰地址类 public class …

青蒿素优化算法(AO)-2024年新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、综合淘汰阶…

GPT 大型语言模型可视化教程

网址&#xff1a; LLM Visualization 简介 欢迎来到 GPT 大型语言模型演练&#xff01;在这里&#xff0c;我们将探索只有 85,000 个参数的 nano-gpt 模型。 它的目标很简单&#xff1a;取一个由六个字母组成的序列&#xff1a; C B A B B C 并按字母顺序排列&#xff0c;即…

微软为美国情报机构打造定制GPT-4

近日&#xff0c;微软公司宣布成功为美国情报机构打造了一款定制化的GPT-4生成式AI模型&#xff0c;该模型与互联网完全断开连接&#xff0c;标志着大型语言模型首次在安全环境中得到应用。这项技术突破将为情报分析工作带来革命性的变革&#xff0c;同时也引发了业界对人工智能…

poll 机制

poll 机制 一、poll机制概述二、使用流程三、编程3.1 驱动编程3.1 应用编程 四、POLL 机制的内核代码详解五、编译后上机实验 poll 机制与休眠唤醒机制的区别&#xff1a; 休眠唤醒方式时&#xff0c;进程如果没有得到唤醒信号&#xff0c;需要一直休眠&#xff0c;进程就干不了…

练习队列的相关操作:循环队列

1. 思路解析 循环队列就是在只有有限的空间时使用队列实现循环存储数据&#xff0c;有双向链表和数组两种选择&#xff0c;这里我们使用数组实现循环队列&#xff08;因为链表我不会 >-<&#xff09; 2. 相关函数及其实现 2.1 判空与判满 判空&#xff1a;直接返回头尾…

---随笔--Java实现TCP通信(双端通信接收与发送)

---随笔--Java实现TCP通信&#xff08;双端通信接收与发送&#xff09; 引言1. 什么是TCP通信2. 服务器与客户端核心代码2.1 服务器ServerSocket端核心代码2.2 用户Socket端核心代码2.3 小贴士之关于try-with-resources自动关闭资源的使用 3. 具体服务器端实现4. 具体客户端实现…

ONES 功能上新 | 近期产品新功能一览

支持在 ONES Project 中通过弹窗查看、编辑 ONES Wiki 页面。 应用场景&#xff1a; 当需要在 ONES Project 中查看 ONES Wiki 的页面内容时&#xff0c;可以直接点击工作项关联的 ONES Wiki 页面或项目文档组件中的页面&#xff0c;即可在 ONES Project 中通过弹窗查看 ONES W…

计算机毕业设计python+spark知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

本科毕业设计&#xff08;论文&#xff09;开题报告 课题名称 基于Spark的音乐推荐与数据分析系统 的设计与实现 课题类型 系统设计 学院 大数据与人工智能学院 班级 专业 数据科学与大数据技术 指导教师 职称 学生姓名 学号 重庆工程学院教务处制 1.课…

机器学习中的精确度、召回率、F1分数

精确度与召回率 上图左边为混淆矩阵&#xff0c;四个区域分别为&#xff1a;真阳性&#xff08;True positive&#xff09;&#xff0c;真阴性&#xff08;True negative&#xff09;&#xff0c;假阳性&#xff08;False positive&#xff09;&#xff0c;假阴性&#xff08;F…

华为学习之旅,创建应用全流程

快速入门 开发准备 对于HarmonyOS应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用(如下) &#xff0c;快速了解工程目录的主要文件&#xff0c;熟悉HarmonyOS应用开发流程。 基本概念 UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&am…

【python量化交易】qteasy使用教程07——创建更加复杂的自定义交易策略

创建更加复杂的自定义交易策略 使用交易策略类&#xff0c;创建更复杂的自定义策略开始前的准备工作本节的目标继承Strategy类&#xff0c;创建一个复杂的多因子选股策略策略和回测参数配置&#xff0c;并开始回测 本节回顾 使用交易策略类&#xff0c;创建更复杂的自定义策略 …