500行代碼實現貪吃蛇(2)

文章目錄

    • 3. 貪吃蛇的具體實現

3. 貪吃蛇的具體實現

  1. 首先,我們要讓整個程序適應本地化
int main()
{//修改適配本地中文環境setlocale(LC_ALL, "");return 0;
}
  1. 蛇身節點的創建
//蛇身結點的定義
typedef struct SnakeNode
{int x; int y;struct SnakeNode* next;
}SnakeNode, * pSnakeNode;//typedef struct SnakeNode* pSnakeNode;//上面的寫法和這個寫法是一個效果
  1. 再定義一個結構體來維護整個貪吃蛇游戲
//游戲的狀態
enum GAME_STATUS
{OK = 1,//正常運行ESC,//按了ESC鍵退出,正常退出KILL_BY_WALL,//撞墻KILL_BY_SELF//撞到自身
};//蛇行走的方向
enum DIRECTION
{UP = 1,DOWN,LEFT,RIGHT
};//貪吃蛇
typedef struct Snake
{pSnakeNode pSnake;//維護整條蛇的指針,是指向蛇頭pSnakeNode pFood;//指向食物的指針int Score;//當前累積的分數int FoodWeight;//一個食物的分數int SleepTime;//蛇休眠的時間,休眠的時間越短,蛇的速度越快,休眠的時間越長,蛇的速度越慢enum GAME_STATUS status;//當前的狀態enum DIRECTION dir;//蛇當前走的方向
}Snake, * pSnake;
  1. 游戲開始的函數

GameStart:

void GameStart(pSnake 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 SetPos(int x, int y)
{//獲得設備句柄HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//根據句柄設置光標的位置COORD pos = { x, y };SetConsoleCursorPosition(handle, pos);
}void WelcomeToGame()
{//歡迎信息SetPos(35, 10);printf("歡迎來到貪吃蛇小游戲\n");SetPos(38, 20);system("pause");system("cls");//功能介紹信息SetPos(15, 10);printf("用 ↑ . ↓ . ← . → 來控制蛇的移動,F3是加速,F4是減速\n");SetPos(15, 11);printf("加速能得到更高的分數");SetPos(38, 20);system("pause");system("cls");
}

繪制地圖:

#define WALL L'□'
void CreateMap()
{int i = 0;//上SetPos(0, 0);for (i = 0; i <= 56; i += 2){wprintf(L"%lc", WALL);}//下SetPos(0, 26);for (i = 0; i <= 56; i += 2){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);}
}

初始化蛇:

注意: 蛇的每個節點的x坐標必須是2的倍數,否則可能會出現蛇的?個節點有一半出現在墻體中,另外?半在墻外的現象,坐標不好對齊。

#define BODY L'●'//蛇默認的起始坐標
#define POS_X 24
#define POS_Y 5
void InitSnake(pSnake ps)
{//創建5個蛇身的結點pSnakeNode cur = NULL;int i = 0;for (i = 0; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));if (NULL == cur){perror("InitSnake():malloc()");return;}cur->x = POS_X + 2 * i;cur->y = POS_Y;cur->next = NULL;//頭插法if (NULL == ps->pSnake){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->dir = RIGHT;ps->FoodWeight = 10;ps->pFood = NULL;ps->Score = 0;ps->SleepTime = 200;ps->status = OK;
}

創建食物:

關于食物,就是在墻體內隨機生成?個坐標(x坐標必須是2的倍數),坐標不能和蛇的身體重合,然后打印★。

#define FOOD L'★'
void CreateFood(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 (x == cur->x && y == cur->y){goto again;}cur = cur->next;}//創建食物pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));if (NULL == pFood){perror("CreatFood():malloc()");return;}pFood->x = x;pFood->y = y;pFood->next = NULL;ps->pFood = pFood;SetPos(x, y);wprintf(L"%lc", FOOD);
}
int main()
{srand((unsigned int)time(NULL));return 0;
}
  1. 游戲運行的函數

打印幫助信息:

void PrintHelpInfo()
{SetPos(62, 15);printf("1.不能穿墻,不能咬到自己");SetPos(62, 16);printf("2.用 ↑.↓.←.→ 來控制蛇的移動");SetPos(62, 17);printf("3.F3是加速,F4是減速");SetPos(62, 18);printf("4.ESC:退出游戲 space:暫停游戲");
}

GameRun:

#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)
void GameRun(pSnake ps)
{//打印幫助信息PrintHelpInfo();if (KEY_PRESS(VK_UP) || KEY_PRESS(VK_DOWN) ||KEY_PRESS(VK_LEFT) || KEY_PRESS(VK_RIGHT) ||KEY_PRESS(VK_ESCAPE) || KEY_PRESS(VK_SPACE) ||KEY_PRESS(VK_F3) || KEY_PRESS(VK_F4)){;//消除之前 按任意鍵繼續 的影響,比如我按了空格然后進入了游戲,這里不檢測,那么下面的代碼會檢測到我按過空格,游戲一開始就會暫停}do{//當前的分數情況SetPos(62, 10);printf("總分:%5d\n", ps->Score);SetPos(62, 11);printf("食物的分值:%02d\n", ps->FoodWeight);//檢測按鍵//上、下、左、右、ESC、空格、F3、F4if (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_ESCAPE)){ps->status = ESC;break;}else if (KEY_PRESS(VK_SPACE)){//游戲要暫停pause();//暫停和恢復暫停}else if (KEY_PRESS(VK_F3)){if (ps->SleepTime > 80){ps->SleepTime -= 30;ps->FoodWeight += 2;}}else if (KEY_PRESS(VK_F4)){if (ps->FoodWeight > 2){ps->SleepTime += 30;ps->FoodWeight -= 2;}}//走一步SnakeMove(ps);//睡眠一下Sleep(ps->SleepTime);} while (OK == ps->status);
}

pause:

void pause()
{while (1){Sleep(100);if (KEY_PRESS(VK_SPACE)){break;}}
}

SnakeMove:

void SnakeMove(pSnake ps)
{pSnakeNode pNext = (pSnakeNode)malloc(sizeof(SnakeNode));if (NULL == pNext){perror("SnakeMove()::malloc()");return;}pNext->next = NULL;switch (ps->dir){case UP:pNext->x = ps->pSnake->x;pNext->y = ps->pSnake->y - 1;break;case DOWN:pNext->x = ps->pSnake->x;pNext->y = ps->pSnake->y + 1;break;case LEFT:pNext->x = ps->pSnake->x - 2;pNext->y = ps->pSnake->y;break;case RIGHT:pNext->x = ps->pSnake->x + 2;pNext->y = ps->pSnake->y;break;}//下一個坐標處是否是食物if (NextIsFood(ps, pNext)){//是食物就吃掉EatFood(ps, pNext);}else{//不是食物就正常走一步NotEatFood(ps, pNext);}//檢測撞墻KillByWall(ps);//檢測撞到自己KillBySelf(ps);
}

NextIsFood:

int NextIsFood(pSnake ps, pSnakeNode pNext)
{if (ps->pFood->x == pNext->x && ps->pFood->y == pNext->y){return 1;//下一個坐標處是食物}else{return 0;}
}

EatFood:

void EatFood(pSnake ps, pSnakeNode pNext)
{pNext->next = ps->pSnake;ps->pSnake = pNext;//打印蛇pSnakeNode cur = ps->pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->Score += ps->FoodWeight;//釋放舊的食物free(ps->pFood);ps->pFood = NULL;//新建食物CreateFood(ps);
}

NotEatFood:

void NotEatFood(pSnake ps, pSnakeNode pNext)
{//頭插法pNext->next = ps->pSnake;ps->pSnake = pNext;//釋放尾結點pSnakeNode cur = ps->pSnake;while (cur->next->next){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);//將尾節點的位置打印成空白字符SetPos(cur->next->x, cur->next->y);printf("  ");free(cur->next);cur->next = NULL;
}

KillByWall:

void KillByWall(pSnake ps)
{if (0 == ps->pSnake->x ||56 == ps->pSnake->x ||0 == ps->pSnake->y ||26 == ps->pSnake->y){ps->status = KILL_BY_WALL;}
}

KillBySelf:

void KillBySelf(pSnake ps)
{pSnakeNode cur = ps->pSnake->next;//從第二個節點開始while (cur){if (cur->x == ps->pSnake->x && cur->y == ps->pSnake->y){ps->status = KILL_BY_SELF;return;}cur = cur->next;}
}
  1. 游戲的善后工作
void GameEnd(pSnake ps)
{SetPos(15, 12);switch (ps->status){case ESC:printf("主動退出游戲,正常退出\n");break;case KILL_BY_WALL:printf("很遺憾,撞墻了,游戲結束\n");break;case KILL_BY_SELF:printf("很遺憾,咬到自己了,游戲結束\n");break;}//釋放貪吃蛇的鏈表資源pSnakeNode cur = ps->pSnake;pSnakeNode del = NULL;while (cur){del = cur;cur = cur->next;free(del);del = NULL;}free(ps->pFood);ps->pFood = NULL;ps  = NULL;
}
int main()
{SetPos(0, 26);//讓整個程序結束后的提示放到界面的最下面return 0;
}
  1. 讓游戲循環起來
void test()
{int ch = 0;do{//創建貪吃蛇Snake snake = { 0 };GameStart(&snake);//游戲開始前的初始化GameRun(&snake);//玩游戲的過程GameEnd(&snake);//善后的工作SetPos(20, 15);printf("再來一局嗎?(Y/N):");ch = getchar();getchar();//清理\n} while ('Y' == ch || 'y' == ch);
}

完整代碼:

//snake.h#include <locale.h>
#include <stdlib.h>
#include <windows.h>
#include <stdbool.h>
#include <stdio.h>#define WALL L'□'
#define BODY L'●'
#define FOOD L'★'//蛇默認的起始坐標
#define POS_X 24
#define POS_Y 5#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)//游戲的狀態
enum GAME_STATUS
{OK = 1,//正常運行ESC,//按了ESC鍵退出,正常退出KILL_BY_WALL,//撞墻KILL_BY_SELF//撞到自身
};//蛇行走的方向
enum DIRECTION
{UP = 1,DOWN,LEFT,RIGHT
};//蛇身結點的定義
typedef struct SnakeNode
{int x; int y;struct SnakeNode* next;
}SnakeNode, * pSnakeNode;//typedef struct SnakeNode* pSnakeNode;//上面的寫法和這個寫法是一個效果//貪吃蛇
typedef struct Snake
{pSnakeNode pSnake;//維護整條蛇的指針,是指向蛇頭pSnakeNode pFood;//指向食物的指針int Score;//當前累積的分數int FoodWeight;//一個食物的分數int SleepTime;//蛇休眠的時間,休眠的時間越短,蛇的速度越快,休眠的時間越長,蛇的速度越慢enum GAME_STATUS status;//當前的狀態enum DIRECTION dir;//蛇當前走的方向
}Snake, * pSnake;//游戲開始前的準備
void GameStart(pSnake ps);//游戲運行的整個邏輯
void GameRun(pSnake ps);//游戲結束的資源釋放
void GameEnd(pSnake ps);//定位控制臺光標位置
void SetPos(int x, int y);
//snake.c#include "snake.h"void SetPos(int x, int y)
{//獲得設備句柄HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//根據句柄設置光標的位置COORD pos = { x, y };SetConsoleCursorPosition(handle, pos);
}void WelcomeToGame()
{//歡迎信息SetPos(35, 10);printf("歡迎來到貪吃蛇小游戲\n");SetPos(38, 20);system("pause");system("cls");//功能介紹信息SetPos(15, 10);printf("用 ↑ . ↓ . ← . → 來控制蛇的移動,F3是加速,F4是減速\n");SetPos(15, 11);printf("加速能得到更高的分數");SetPos(38, 20);system("pause");system("cls");
}void CreateMap()
{int i = 0;//上SetPos(0, 0);for (i = 0; i <= 56; i += 2){wprintf(L"%lc", WALL);}//下SetPos(0, 26);for (i = 0; i <= 56; i += 2){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)
{//創建5個蛇身的結點pSnakeNode cur = NULL;int i = 0;for (i = 0; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));if (NULL == cur){perror("InitSnake():malloc()");return;}cur->x = POS_X + 2 * i;cur->y = POS_Y;cur->next = NULL;//頭插法if (NULL == ps->pSnake){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->dir = RIGHT;ps->FoodWeight = 10;ps->pFood = NULL;ps->Score = 0;ps->SleepTime = 200;ps->status = OK;
}void CreateFood(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 (x == cur->x && y == cur->y){goto again;}cur = cur->next;}//創建食物pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));if (NULL == pFood){perror("CreatFood():malloc()");return;}pFood->x = x;pFood->y = y;pFood->next = NULL;ps->pFood = pFood;SetPos(x, y);wprintf(L"%lc", FOOD);
}void GameStart(pSnake 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(62, 15);printf("1.不能穿墻,不能咬到自己");SetPos(62, 16);printf("2.用 ↑.↓.←.→ 來控制蛇的移動");SetPos(62, 17);printf("3.F3是加速,F4是減速");SetPos(62, 18);printf("4.ESC:退出游戲 space:暫停游戲");
}void pause()
{while (1){Sleep(100);if (KEY_PRESS(VK_SPACE)){break;}}
}int NextIsFood(pSnake ps, pSnakeNode pNext)
{if (ps->pFood->x == pNext->x && ps->pFood->y == pNext->y){return 1;//下一個坐標處是食物}else{return 0;}
}void EatFood(pSnake ps, pSnakeNode pNext)
{pNext->next = ps->pSnake;ps->pSnake = pNext;//打印蛇pSnakeNode cur = ps->pSnake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}ps->Score += ps->FoodWeight;//釋放舊的食物free(ps->pFood);ps->pFood = NULL;//新建食物CreateFood(ps);
}void NotEatFood(pSnake ps, pSnakeNode pNext)
{//頭插法pNext->next = ps->pSnake;ps->pSnake = pNext;//釋放尾結點pSnakeNode cur = ps->pSnake;while (cur->next->next){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);//將尾節點的位置打印成空白字符SetPos(cur->next->x, cur->next->y);printf("  ");free(cur->next);cur->next = NULL;
}void KillByWall(pSnake ps)
{if (0 == ps->pSnake->x ||56 == ps->pSnake->x ||0 == ps->pSnake->y ||26 == ps->pSnake->y){ps->status = KILL_BY_WALL;}
}void KillBySelf(pSnake ps)
{pSnakeNode cur = ps->pSnake->next;//從第二個節點開始while (cur){if (cur->x == ps->pSnake->x && cur->y == ps->pSnake->y){ps->status = KILL_BY_SELF;return;}cur = cur->next;}
}void SnakeMove(pSnake ps)
{pSnakeNode pNext = (pSnakeNode)malloc(sizeof(SnakeNode));if (NULL == pNext){perror("SnakeMove()::malloc()");return;}pNext->next = NULL;switch (ps->dir){case UP:pNext->x = ps->pSnake->x;pNext->y = ps->pSnake->y - 1;break;case DOWN:pNext->x = ps->pSnake->x;pNext->y = ps->pSnake->y + 1;break;case LEFT:pNext->x = ps->pSnake->x - 2;pNext->y = ps->pSnake->y;break;case RIGHT:pNext->x = ps->pSnake->x + 2;pNext->y = ps->pSnake->y;break;}//下一個坐標處是否是食物if (NextIsFood(ps, pNext)){//是食物就吃掉EatFood(ps, pNext);}else{//不是食物就正常走一步NotEatFood(ps, pNext);}//檢測撞墻KillByWall(ps);//檢測撞到自己KillBySelf(ps);
}void GameRun(pSnake ps)
{//打印幫助信息PrintHelpInfo();if (KEY_PRESS(VK_UP) || KEY_PRESS(VK_DOWN) ||KEY_PRESS(VK_LEFT) || KEY_PRESS(VK_RIGHT) ||KEY_PRESS(VK_ESCAPE) || KEY_PRESS(VK_SPACE) ||KEY_PRESS(VK_F3) || KEY_PRESS(VK_F4)){;//消除之前 按任意鍵繼續 的影響,比如我按了空格然后進入了游戲,這里不檢測,那么下面的代碼會檢測到我按過空格,游戲一開始就會暫停}do{//當前的分數情況SetPos(62, 10);printf("總分:%5d\n", ps->Score);SetPos(62, 11);printf("食物的分值:%02d\n", ps->FoodWeight);//檢測按鍵//上、下、左、右、ESC、空格、F3、F4if (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_ESCAPE)){ps->status = ESC;break;}else if (KEY_PRESS(VK_SPACE)){//游戲要暫停pause();//暫停和恢復暫停}else if (KEY_PRESS(VK_F3)){if (ps->SleepTime > 80){ps->SleepTime -= 30;ps->FoodWeight += 2;}}else if (KEY_PRESS(VK_F4)){if (ps->FoodWeight > 2){ps->SleepTime += 30;ps->FoodWeight -= 2;}}//走一步SnakeMove(ps);//睡眠一下Sleep(ps->SleepTime);} while (OK == ps->status);
}void GameEnd(pSnake ps)
{SetPos(15, 12);switch (ps->status){case ESC:printf("主動退出游戲,正常退出\n");break;case KILL_BY_WALL:printf("很遺憾,撞墻了,游戲結束\n");break;case KILL_BY_SELF:printf("很遺憾,咬到自己了,游戲結束\n");break;}//釋放貪吃蛇的鏈表資源pSnakeNode cur = ps->pSnake;pSnakeNode del = NULL;while (cur){del = cur;cur = cur->next;free(del);del = NULL;}free(ps->pFood);ps->pFood = NULL;ps  = NULL;
}
//test.c#include "snake.h"void test()
{int ch = 0;do{//創建貪吃蛇Snake snake = { 0 };GameStart(&snake);//游戲開始前的初始化GameRun(&snake);//玩游戲的過程GameEnd(&snake);//善后的工作SetPos(20, 15);printf("再來一局嗎?(Y/N):");ch = getchar();getchar();//清理\n} while ('Y' == ch || 'y' == ch);
}int main()
{//修改適配本地中文環境setlocale(LC_ALL, "");srand((unsigned int)time(NULL));test();//貪吃蛇游戲的測試SetPos(0, 26);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10099.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10099.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity 性能優化之LOD技術(十)

提示&#xff1a;僅供參考&#xff0c;有誤之處&#xff0c;麻煩大佬指出&#xff0c;不勝感激&#xff01; 文章目錄 LOD技術效果一、LOD技術是什么&#xff1f;二、LODGroup組件介紹三、LODGroup組件使用步驟添加組件添加模型 四、Project Settings中與LOD組件相關參數總結 L…

【DevOps】Linux 內核網絡子系統全面指南與性能調優

目錄 一、Linux 內核網絡子系統 1. Netfilter 主要特性 工作流程 2. Traffic Control (TC) 主要特性 工作流程 3. Socket 主要特性 工作流程 二、內核參數優化 1. net.ipv4.tcp_window_scaling 2. net.core.netdev_max_backlog 3. net.ipv4.tcp_rmem 和 net.ipv4…

第33次CSP認證Q1:詞頻統計

&#x1f344;題目描述 在學習了文本處理后&#xff0c;小 P 對英語書中的 &#x1d45b;n 篇文章進行了初步整理。 具體來說&#xff0c;小 P 將所有的英文單詞都轉化為了整數編號。假設這 &#x1d45b;n 篇文章中共出現了 &#x1d45a;m 個不同的單詞&#xff0c;則把它們…

網絡編程套接字 (二)---udosocket

本專欄內容為&#xff1a;Linux學習專欄&#xff0c;分為系統和網絡兩部分。 通過本專欄的深入學習&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn個人主頁&#xff1a;小小unicorn ?專欄分類&#xff1a;網絡 &#x1f69a;代碼倉庫&#xff1a;小小unicorn的代…

C++學習第二十九課:C++ 輸入輸出流詳解:從基礎到高級應用

在 C 中&#xff0c;流&#xff08;stream&#xff09;是一種用于實現輸入輸出操作的抽象概念。流可以看作是字節的流動&#xff0c;這些字節可以從一個地方流向另一個地方&#xff0c;例如從鍵盤輸入到程序中&#xff0c;或者從程序輸出到屏幕。C 提供了一套完整的流庫來處理各…

Qt中正則表達式的用法

一.基本功能介紹&#xff1a; 在Qt中&#xff0c;可以使用QRegularExpression類來處理正則表達式。以下是一些常用的正則表達式用法&#xff1a; 1.創建正則表達式對象&#xff1a; QRegularExpression regex("pattern"); 2.匹配字符串&#xff1a; QString str …

LeetCode 2960.統計已測試設備:看測試了多少次

【LetMeFly】2960.統計已測試設備&#xff1a;看測試了多少次 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-tested-devices-after-test-operations/ 給你一個長度為 n 、下標從 0 開始的整數數組 batteryPercentages &#xff0c;表示 n 個設備的電池百分比…

【QEMU系統分析之實例篇(十七)】

系列文章目錄 第十七章 QEMU系統仿真的機器創建分析實例 文章目錄 系列文章目錄第十七章 QEMU系統仿真的機器創建分析實例 前言一、QEMU是什么&#xff1f;二、QEMU系統仿真的機器創建分析實例1.系統仿真的命令行參數2.配置加速器configure_accelerators()do_configure_icount…

藍橋杯13屆JAVA A組 國賽

??????? package 藍橋杯國賽; // 貪心選個數最少的進行擺 // 2:1 ,3:1, 4:1,5 : 3,6:3,7:1 // 選 1&#xff0c;7&#xff0c;4&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;9 // 然后都選滿10個 public class 火彩棒數字 {public static void main(String[] a…

【CTFHub】HTTP 請求方式 302跳轉 cookie WP

1.請求方式 打開給出的URL進入一個頁面&#xff0c;提示原方法是GET&#xff0c;用CTFHUB方法就能獲得flag 思路&#xff1a;抓包&#xff0c;將GET方法改成CTFHUB方法進行重新發送請求&#xff0c;查看響應情況 1.打開代理服務器 2.打開BurpSuite 刷新頁面獲得攔截 3.發送…

【Excel VBA】深入理解 VBA 中的 CallByName 函數

動態調用方法與屬性&#xff1a;深入理解 VBA 中的 CallByName 函數 昨天在介紹Choose函數在復雜的VBA應用程序開發中&#xff0c;有時我們需要根據運行時的情況來決定調用哪個對象的哪個方法或屬性。這種靈活性可以通過 CallByName 函數實現。在本篇博客中&#xff0c;田辛老…

網絡Http和Socket通訊(基于面試)

每日一句&#xff1a;想得到世上最好的東西&#xff0c;先得讓世界看到最好的你 目錄 面試問OSI或TCP/IP,怎么回答&#xff1f; 面試問HTTP&#xff1f; 面試問Get類型&#xff0c;Pot類型區別&#xff1f; 面試什么是Socket套接字&#xff1f; 面試問什么是數據粘包&…

qt for android 的架構原理

qt for android實現架構&#xff0c;分享這幾幅很不錯圖。來自于 《Qt 林斌&#xff1a;整合Android IVI平臺打造統一的Qt數字座艙體驗》 1.實現架構圖 2.qt for android能力 3.java 和 qt混合開發 4. AutoMotive

46寸硅片為什么要留平邊(flat)?

知 識星球&#xff08;星球名&#xff1a; 芯片制造與封測社區&#xff0c;星球號&#xff1a; 63559049&#xff09;里的學員問&#xff1a; 2&#xff0c; 4&#xff0c; 6寸硅片都有 平 邊&#xff0c;它們有什么作用 &#xff1f; 硅片的平邊&#xff08;Flat&…

經典權限五張表案例分析

文章目錄 模塊分析模塊分析 描述五張表的關系重要知識講解抽取成一個BaseServletSpringIOC思想(底層)實現代碼IOC概述 SPI機制(為學習框架做思想和技術鋪墊)SPI引入1. 標準/規范2. 具體的實現3. 調用 SPI介紹SPI練習JDBC4.0免注冊驅動原理Servlet實現方式三 ServletContainerIn…

idea使用前的全局配置,一次配置,多次使用

前提&#xff1a;每次導入一個新的項目&#xff0c;就需要重新設置編碼、maven、jdk、git版本等信息。實際每個項目所用到的配置信息是一致的&#xff0c;除非換一家公司&#xff0c;不然不會改動到這些內容。 idea版本&#xff1a;2024.1.1 1.1、全局Maven配置 IDEA啟動頁面…

微火一文盤點:為何全域運營系統會成為創業新風口?

當前&#xff0c;微火全域運營已經成為創業的新風口&#xff0c;想要做微火全域運營服務商的創業者數量日益增多。據目前了解到的最新消息&#xff0c;微火全域運營系統的市場占有率已經超過了48%&#xff0c;并且還在持續不斷地上漲中。 所謂微火全域運營系統&#xff0c;就是…

InLine Chat功能優化對標Github Copilot,CodeGeeX帶來更高效、更直觀的編程體驗!

VSCode中的CodeGeeX 插件上線InLine Chat功能后&#xff0c;收到不少用戶的反饋&#xff0c;大家對行內交互編程這一功能非常感興趣。近期我們針對這個功能再次進行了深度優化&#xff0c;今天詳細介紹已經在VSCode插件v2.8.0版本上線的 CodeGeeX InLine Chat功能&#xff0c;以…

藍橋杯成績已出

藍橋杯的成績早就已經出來了&#xff0c;雖然沒有十分驚艷 &#xff0c;但是對于最終的結果我是心滿意足的&#xff0c;感謝各位的陪伴&#xff0c;關于藍橋杯的刷題筆記我已經堅持更新了49篇&#xff0c;但是現在即將會告別一段落&#xff0c;人生即將進入下一個規劃。我們一起…

Spring框架學習筆記(一):Spring基本介紹(包含IOC容器底層結構)

1 官方資料 1.1 官網 https://spring.io/ 1.2 進入 Spring5 下拉 projects, 進入 Spring Framework 進入 Spring5 的 github 1.3 在maven項目中導入依賴 <dependencies><!--加入spring開發的基本包--><dependency><groupId>org.springframework<…