C從零開始實現貪吃蛇大作戰

?

?個人主頁:星紜-CSDN博客

系列文章專欄 : C語言

踏上取經路,比抵達靈山更重要!一起努力一起進步!

有關Win32API的知識點在上一篇文章:

目錄

一.地圖

1.控制臺基本介紹

2.寬字符

1.本地化

2.類項

3.setlocale函數

4.打印寬字符?

3.地圖坐標

?二.游戲的結構設計

1.基礎結構

2.游戲流程(未完成)

3.核心邏輯實現

1.游戲開始

1.控制臺設置?

2.歡迎界面?

3.創建地圖

?4.初始化蛇

5.創建食物

4.游戲運行

?1.打印信息

2.判斷按鍵?

?3.蛇的移動

5.游戲結束?


一.地圖

這個游戲中,我們是通過控制臺來完成的。首先就是需要完成這個地圖。

1.控制臺基本介紹

接下來介紹有關控制臺窗口的一些知識點,當運行程序,需要在控制臺上輸出信息,打印的時候,第一個字符是在控制臺最左上角打印的。我們將這個位置的坐標當作(0,0).

?

橫向的坐標軸稱為x軸,從左向右依次增長,縱向的坐標軸是y軸,從上到下依次增長。

2.寬字符

?普通的字符是占一個字節的,寬字符是占用兩個字節的。

?

打印字符,不難發現,兩個英文字符的寬度是等于一個中文字符的寬度的。?而且一個英文字符的高大概是其寬的兩倍。

1.<locale.h>本地化

<locale.h>提供的函數用于控制C標準庫中對于不同的地區會產生不一樣行為的部分。

在標準中,以來地區的部分有以下幾項:

  1. 數字量的格式
  2. 貨幣量的格式
  3. 字符集
  4. 日期和時間的表示形式

2.類項

通過修改地區,程序可以改變它的?為來適應世界的不同區域。但地區的改變可能會影響庫的許多部 分,其中?部分可能是我們不希望修改的。所以C語??持針對不同的類項進?修改,下?的?個宏, 指定?個類項:

  1. ? LC_COLLATE:影響字符串?較函數 strcoll() 和 strxfrm() 。
  2. ? LC_CTYPE:影響字符處理函數的?為。
  3. ? LC_MONETARY:影響貨幣格式。
  4. ? LC_NUMERIC:影響 printf() 的數字格式。
  5. ? LC_TIME:影響時間格式 strftime() 和 wcsftime() 。
  6. ? LC_ALL-針對所有類項修改,將以上所有類別設置為給定的語?環境。

參考:setlocale,_wsetlocale | Microsoft Learn?

3.setlocale函數

char *setlocale(int category,const char *locale
);

這個函數用于修改當前地區,可針對一個類項修改,也可以針對所有類型。

第一個參數是前面說明的類項目中的一個,那么每次都只會影響一個類項,如果第一個參數是LC_ALL就會影響所有的類項。

C標準給第二個參數僅僅定義了兩種取值:“C”正常模式和“”本地模式

在任意程序開始執行之前,都會隱藏執行調用:

    setlocale(LC_ALL, "C");

?當地區設置為"C"時,庫函數按正常?式執?,?數點是?個點。 當程序運?起來后想改變地區,就只能顯?調?setlocale函數。?""作為第2個參數,調?setlocale 函數就可以切換到本地模式,這種模式下程序會適應本地環境。 ?如:切換到我們的本地模式后就?持寬字符(漢字)的輸出等。

setlocale(LC_ALL, " ");//切換到本地環境

4.打印寬字符?

如果想要在屏幕上打印寬字符,那么該如何打印呢?

為了區分寬字符與普通字符,寬字符的字面量前面必須加上前綴 L ,否則C語言會把字面量當作窄字符類型來處理。

同時還需要另一個函數wprintf函數來打印寬字符,用法與printf一樣。寬字符的占位符為%lc,寬字符串的占位符為%ls.

	setlocale(LC_ALL, "");wprintf(L"%lc\n", L'□');wprintf(L"%lc\n", L'●');wprintf(L"%lc\n", L'★');

打印一個寬字符選喲占用兩個字符的位置,那么我們在貪吃蛇中使用寬字符,就需要處理好地圖上坐標的位置的計算。

3.地圖坐標

我們假設實現一個三十行六十列的地圖,在圍繞地圖畫出墻。

#define WALL L'□'   //墻
#define BODY L'●'   //蛇身
#define FOOD L'★'  //食物

需要打印的東西總共有三個分別是墻,蛇身,食物。為了方便,我們define。

1.蛇身與食物

初始化狀態,假設蛇的其實長度是5,蛇的每一個節點都是BODY.并且在一個固定的位置開始生成。

從該圖不難發現,蛇與食物的每一個節點的坐標都應該是偶數,不能是技術,否則就就不對其了,而且會出現身體一半在墻體之內,一半在墻體之外的現象。

?二.游戲的結構設計

1.基礎結構

在游戲運行過程中,蛇每次吃一個食物,蛇的身體就會變長一節,如果我們使用鏈表來儲存蛇的信息,那么蛇的每一個節點其實就是鏈表的每一個節點,每一個節點就需要記錄好蛇身節點的位置,以及下一個節點的位置。

typedef struct SnakeNode {int x;int y;struct SnakeNode* next;
}SnakeNode,*pSnakeNode;

為了方便管理這個游戲,我們在封裝一個Snake的結構來維護整個貪吃蛇。

//蛇的運動方向:上下左右
enum DIRECTION { UP = 1, DOWN, RIGHT, LEFT };
//游戲運行狀態:正常運行,撞墻,撞自己,非正常結束。
//非正常結束:比如按Esc退出游戲。
enum GAME_STATUS { OK, KILL_BY_WALL, KILL_BY_SELF, END_NORMAL };typedef struct GreedySnake {pSnakeNode _pSnake;pSnakeNode _pFood;enum DIRECTION _Dir;enum GAME_STATUS _Status;int _Score;int _FoodWeight;int _SleepTime;//可以理解為蛇的運行速度。
}GSnake,*pGSnake;

2.游戲流程(未完成)

3.核心邏輯實現

程序開始就設置程序?持本地模式,然后進?游戲的主邏輯。 主邏輯分為3個過程:

  1. ?? 游戲開始(GameStart)完成游戲的初始化
  2. ? 游戲運?(GameRun)完成游戲運?邏輯的實現
  3. ?? 游戲結束(GameEnd)完成游戲結束的說明,實現資源釋放

1.游戲開始

?這個模塊需要完成游戲的初始化任務。

  1. 控制臺的設置
  2. 歡迎界面

1.控制臺設置?
	//一.設置控制臺以及光標//設置控制臺窗口的大小system("mode con cols=100 lines=30");//設置控制臺窗口的名字system("title 貪吃蛇");//獲得標準輸出設備的句柄HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);//定義一個光標信息的結構體CONSOLE_CURSOR_INFO cursor_info = { 0 };//獲取和houput句柄相關的控制臺上的光標的信息,存放在cursor_info中GetConsoleCursorInfo(houtput, &cursor_info);//修改光標信息cursor_info.bVisible = false;//可見度//設置和houtput句柄相關的控制臺上的光標的信息SetConsoleCursorInfo(houtput, &cursor_info);

在這里需要更改控制臺窗口的名字,以及將光標不可見。

2.歡迎界面?

1.首先需要完成坐標定位函數,這樣方便我們在特定的位置打印信息

void SetPos(int x, int y) {HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x, y };SetConsoleCursorPosition(houtput, pos);}

2.然后就是歡迎界面以及游戲規則的講解

void WelcomeToGame() {SetPos(36,13);printf("歡迎來到星紜的貪吃蛇小游戲");SetPos(40,25);system("pause");system("cls");SetPos(15,10);printf("游戲規則介紹:");SetPos(24,13);wprintf(L"用 ↑. ↓ . ← . → 來控制蛇的移動,按F3加速,F4減速\n");SetPos(36,16);printf("加速可以獲得更更高的分數");SetPos(40,25);system("pause");system("cls");
}

?

3.創建地圖

?創建地圖就是將地圖打印出來,因為是寬字符打印,所以使用wprintf函數進行打印。

void CreateMap() {int i = 0;//上面的墻for (i = 0; i < 60; i += 2) {wprintf(L"%lc",WALL);}//左邊的墻for (i = 1; i <= 30; i++) {SetPos(0,i);wprintf(L"%lc", WALL);}//右邊的墻for (i = 1; i <= 30; i++) {SetPos(58,i);wprintf(L"%lc", WALL);}//下面的墻for (i = 2; i < 57; i += 2) {SetPos(i,30);wprintf(L"%lc", WALL);}SetPos(0, 33);
}
?4.初始化蛇

蛇最開始?度為5節,每節對應鏈表的?個節點,蛇?的每?個節點都有??的坐標。?創建5個節點,然后將每個節點存放在鏈表中進?管理。創建完蛇?后,將蛇的每?節打印在屏幕上。

  1. ?? 蛇的初始位置從(10,5)開始。?再設置當前游戲的狀態,蛇移動的速度,默認的?向,初始成績,每個?物的分數。
  2. ? 游戲狀態是:OK
  3. ? 蛇的移動速度:200毫秒
  4. ?? 蛇的默認?向:RIGHT
  5. ?? 初始成績:0
  6. ? 每個?物的分數:10
void InitSnake(pGSnake ps) {//創建五個蛇節點,并完成頭插pSnakeNode cur = NULL;int i = 0;for (i = 0; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));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;}}//打印蛇cur = ps->_pSnake;while (cur) {SetPos(cur->x,cur->y);wprintf(L"%lc",BODY);cur = cur->next;}//初始化游戲ps->_SleepTime = 200;ps->_Score = 0;ps->_Dir = RIGHT;ps->_Status = OK;ps->_FoodWeight = 10;
}
5.創建食物
void CreateFood(pGSnake ps) {int x = 0;int y = 0;again:do {x = rand() % 55 + 2;y = rand() % 29 + 1;} while (x % 2 != 0);pSnakeNode cur = ps->_pSnake;while (cur) {if (cur->x == x && cur->y == y) {goto again;}cur = cur->next;}pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));pFood->x = x;pFood->y = y;SetPos(x, y);wprintf(L"%lc",FOOD);ps->_pFood = pFood;
};

4.游戲運行

游戲運行期間,右側打印幫助信息,提示玩家,坐標開始位置(64,15)?

根據游戲狀態檢測游戲是否繼續,如果狀態時OK,游戲繼續,其他狀態游戲結束。

并且根據游戲的過程中,按鍵的情況來確定蛇的下一步方向,或者是否加速減速,暫停或者退出游戲。

  1. ? 上:VK_UP
  2. ?? 下:VK_DOWN
  3. ? 左:VK_LEFT
  4. ? 右:VK_RIGHT
  5. ? 空格:VK_SPACE
  6. ? ESC:VK_ESCAPE
  7. ? F3:VK_F3
  8. ? F4:VK_F4

這是所需的虛擬按鍵

?1.打印信息
void PrintHelpInfo()
{SetPos(60,10);wprintf(L"用 ↑. ↓ . ← . → 來控制蛇的移動方向");SetPos(70,12);wprintf(L"按F3加速,F4減速");SetPos(66,14);printf("加速可以獲得更更高的分數");
}

在控制臺窗口中,打印游戲規則以及分數。

2.判斷按鍵?
#define KEY_PRESS(vk) ((GetAsyncKeyState(vk) & 1) ? 1 : 0)
?3.蛇的移動

先創建下?個節點,根據移動?向和蛇頭的坐標,蛇移動到下?個位置的坐標。 確定了下?個位置后,看下?個位置是否是?物(NextIsFood),是?物就做吃?物處理 (EatFood),如果不是?物則做前進?步的處理(NoFood)。?蛇?移動后,判斷此次移動是否會造成撞墻(KillByWall)或者撞上??蛇?(KillBySelf),從?影 響游戲的狀態。

int NextisFood(pSnakeNode pNextNode, pGSnake ps) {if (ps->_pFood->x == pNextNode->x && ps->_pFood->y == pNextNode->y) {return 1;}return 0;
}
void EatFood(pSnakeNode pNextNode, pGSnake ps) {ps->_pFood->next = ps->_pSnake;ps->_pSnake = ps->_pFood;free(pNextNode);pSnakeNode cur = ps->_pSnake;while (cur) {SetPos(cur->x, cur->y);wprintf(L"%lc", L'●');cur = cur->next;}ps->_Score += ps->_FoodWeight;CreateFood(ps);}
void NoFood(pSnakeNode pNextNode, pGSnake ps) {pNextNode->next = ps->_pSnake;ps->_pSnake = pNextNode;pSnakeNode 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(pGSnake ps) {if ((ps->_pSnake->x == 0) ||(ps->_pSnake->x == 58) ||(ps->_pSnake->y == 0) ||(ps->_pSnake->y == 29)) {ps->_Status = KILL_BY_WALL;return 1;}return 0;
}
void KillBySelf(pGSnake ps) {pSnakeNode cur = ps->_pSnake->next;while (cur) {if (cur->x == ps->_pSnake->x && cur->y == ps->_pSnake->y) {ps->_pSnake = KILL_BY_SELF;break;}cur = cur->next;}}
void SnakeMove(pGSnake ps) {pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));switch (ps->_Dir) {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;pNextNode->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);}KillByWall(ps);KillBySelf(ps);
}

5.游戲結束?

游戲狀態不再是OK(游戲繼續)的時候,要告知游戲結束的原因,并且釋放蛇?節點。

void GameEnd(pGSnake ps) {system("cls");SetPos(32, 12);switch (ps->_Status) {case END_NORMAL:printf("游戲已結束。");break;case KILL_BY_WALL:printf("蛇撞墻!游戲結束。");break;case KILL_BY_SELF:printf("蛇撞到自己!游戲結束。");break;}printf("總得分:%d", ps->_Score);//pSnakeNode cur = ps->_pSnake;while (cur) {pSnakeNode del = cur;cur = cur->next;free(del);}SetPos(0, 26);}

三.代碼

greedysnake.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<stdbool.h>
#include<locale.h>
#include<time.h>
#define WALL L'□'   //墻
#define BODY L'●'   //蛇
#define FOOD L'★'  //食物typedef struct SnakeNode {int x;int y;struct SnakeNode* next;
}SnakeNode, * pSnakeNode;
//蛇的運動方向:上下左右
enum DIRECTION { UP = 1, DOWN, RIGHT, LEFT };
//游戲運行狀態:正常運行,撞墻,撞自己,非正常結束。
//非正常結束:比如按Esc退出游戲。
enum GAME_STATUS { OK, KILL_BY_WALL, KILL_BY_SELF, END_NORMAL };typedef struct GreedySnake {pSnakeNode _pSnake;pSnakeNode _pFood;enum DIRECTION _Dir;enum GAME_STATUS _Status;int _Score;int _FoodWeight;int _SleepTime;//可以理解為蛇的運行速度。
}GSnake,*pGSnake;#define POS_X 10 //起始位置x
#define POS_Y 5  //起始位置y//游戲開始
void GameStart(pGSnake ps);void WelcomeToGame();
void CreateMap();
void InitSnake(pGSnake ps);
void CreateFood(pGSnake ps);//游戲運行
void GameRun(pGSnake ps); void PrintHelpInfo();
#define KEY_PRESS(vk) ((GetAsyncKeyState(vk) & 1) ? 1 : 0)
void SnakeMove(pGSnake ps);
int NextisFood(pSnakeNode pNextNode, pGSnake ps);
void EatFood(pSnakeNode pNextNode, pGSnake ps);
void NoFood(pSnakeNode pNextNode, pGSnake ps);
void KillByWall(pGSnake ps);
void KillBySelf(pGSnake ps);void GameEnd(pGSnake ps);

greedysnake.c

#define _CRT_SECURE_NO_WARNINGS 
#include"greedysnake.h"void SetPos(int x, int y) {HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x, y };SetConsoleCursorPosition(houtput, pos);}
void WelcomeToGame() {SetPos(36, 13);printf("歡迎來到星紜的貪吃蛇小游戲");SetPos(40, 25);system("pause");system("cls");SetPos(15, 10);printf("游戲規則介紹:");SetPos(24, 13);wprintf(L"用 ↑. ↓ . ← . → 來控制蛇的移動,按F3加速,F4減速\n");SetPos(36, 16);printf("加速可以獲得更更高的分數");SetPos(40, 25);system("pause");system("cls");
}
void CreateMap() {int i = 0;//上面的墻for (i = 0; i < 60; i += 2) {wprintf(L"%lc", WALL);}//左邊的墻for (i = 1; i <= 30; i++) {SetPos(0, i);wprintf(L"%lc", WALL);}//右邊的墻for (i = 1; i <= 30; i++) {SetPos(58, i);wprintf(L"%lc", WALL);}//下面的墻for (i = 2; i < 57; i += 2) {SetPos(i, 30);wprintf(L"%lc", WALL);}}
void InitSnake(pGSnake ps) {//創建五個蛇節點,并完成頭插pSnakeNode cur = NULL;int i = 0;for (i = 0; i < 5; i++){cur = (pSnakeNode)malloc(sizeof(SnakeNode));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;}}//打印蛇cur = ps->_pSnake;while (cur) {SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}//初始化游戲ps->_SleepTime = 200;ps->_Score = 0;ps->_Dir = RIGHT;ps->_Status = OK;ps->_FoodWeight = 10;
}
void CreateFood(pGSnake ps) {int x = 0;int y = 0;
again:do {x = rand() % 47 + 6;y = rand() % 25 + 3;} while (x % 2 != 0);pSnakeNode cur = ps->_pSnake;while (cur) {if (cur->x == x && cur->y == y) {goto again;}cur = cur->next;}pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));pFood->x = x;pFood->y = y;SetPos(x, y);wprintf(L"%lc", FOOD);ps->_pFood = pFood;
};void GameStart(pGSnake ps) {//一.設置控制臺以及光標//設置控制臺窗口的大小system("mode con cols=100 lines=36");//設置控制臺窗口的名字system("title 貪吃蛇");//獲得標準輸出設備的句柄HANDLE houtput = NULL;houtput = GetStdHandle(STD_OUTPUT_HANDLE);//定義一個光標信息的結構體CONSOLE_CURSOR_INFO cursor_info = { 0 };//獲取和houput句柄相關的控制臺上的光標的信息,存放在cursor_info中GetConsoleCursorInfo(houtput, &cursor_info);//修改光標信息cursor_info.bVisible = false;//可見度//設置和houtput句柄相關的控制臺上的光標的信息SetConsoleCursorInfo(houtput, &cursor_info);//二.打印歡迎界面WelcomeToGame();//三.創建地圖CreateMap();//四.初始化蛇InitSnake(ps);//五.隨機生成食物CreateFood(ps);};void PrintHelpInfo()
{SetPos(60, 10);wprintf(L"用 ↑. ↓ . ← . → 來控制蛇的移動方向");SetPos(70, 12);wprintf(L"按F3加速,F4減速");SetPos(66, 14);printf("加速可以獲得更更高的分數");
}
void pause() {while (1) {Sleep(1);if (KEY_PRESS(VK_SPACE)) {break;}}}
int NextisFood(pSnakeNode pNextNode, pGSnake ps) {if (ps->_pFood->x == pNextNode->x && ps->_pFood->y == pNextNode->y) {return 1;}return 0;
}
void EatFood(pSnakeNode pNextNode, pGSnake ps) {ps->_pFood->next = ps->_pSnake;ps->_pSnake = ps->_pFood;free(pNextNode);pSnakeNode cur = ps->_pSnake;while (cur) {SetPos(cur->x, cur->y);wprintf(L"%lc", L'●');cur = cur->next;}ps->_Score += ps->_FoodWeight;CreateFood(ps);}
void NoFood(pSnakeNode pNextNode, pGSnake ps) {pNextNode->next = ps->_pSnake;ps->_pSnake = pNextNode;pSnakeNode 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(pGSnake ps) {if ((ps->_pSnake->x == 0) ||(ps->_pSnake->x == 58) ||(ps->_pSnake->y == 0) ||(ps->_pSnake->y == 29)) {ps->_Status = KILL_BY_WALL;return 1;}return 0;
}
void KillBySelf(pGSnake ps) {pSnakeNode cur = ps->_pSnake->next;while (cur) {if (cur->x == ps->_pSnake->x && cur->y == ps->_pSnake->y) {ps->_Status = KILL_BY_SELF;break;}cur = cur->next;}}
void SnakeMove(pGSnake ps) {pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));switch (ps->_Dir) {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;pNextNode->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);}KillByWall(ps);KillBySelf(ps);
}
void GameRun(pGSnake ps) {//打印幫助信息PrintHelpInfo();//循環do {SetPos(66, 8);printf("游戲得分:%4d", ps->_Score);printf("食物重量:%4d", ps->_FoodWeight);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;break;}else if (KEY_PRESS(VK_F3)) {if (ps->_SleepTime > 80) {ps->_SleepTime -= 30;ps->_FoodWeight += 2;}}else if (KEY_PRESS(VK_F4)) {if (ps->_SleepTime < 320) {ps->_SleepTime += 30;ps->_FoodWeight -= 2;}}Sleep(ps->_SleepTime);SnakeMove(ps);} while (ps->_Status == OK);}void GameEnd(pGSnake ps) {system("cls");SetPos(32, 12);switch (ps->_Status) {case END_NORMAL:printf("游戲已結束。");break;case KILL_BY_WALL:printf("蛇撞墻!游戲結束。");break;case KILL_BY_SELF:printf("蛇撞到自己!游戲結束。");break;}printf("總得分:%d", ps->_Score);pSnakeNode cur = ps->_pSnake;while (cur) {pSnakeNode del = cur;cur = cur->next;free(del);}SetPos(0, 26);}

源.c

#define _CRT_SECURE_NO_WARNINGS 
#include"greedysnake.h"int main()
{srand((unsigned int)time(NULL));setlocale(LC_ALL, "");GSnake snake = { 0 };//游戲初始化GameStart(&snake);//游戲運行中GameRun(&snake);GameEnd(&snake);SetPos(0, 33);system("pause");return 0;
}

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

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

相關文章

解釋Vue中transition的理解

在Vue中&#xff0c;transition組件用于在元素或組件插入、更新或移除時應用過渡效果。Vue 2和Vue 3都提供了transition組件&#xff0c;但兩者之間有一些差異和更新。以下是關于Vue 2和Vue 3中transition組件的理解&#xff1a; Vue 2中的transition 在Vue 2中&#xff0c;t…

Golang 如何使用 gorm 存取帶有 emoji 表情的數據

Golang 如何使用 gorm 存取帶有 emoji 表情的數據 結論&#xff1a;在 mysql 中盡量使用 utf8mb4&#xff0c;不要使用 utf8。db報錯信息&#xff1a;Error 1366 (HY000): Incorrect string value: \\xE6\\x8C\\xA5\\xE7\\xAC\\xA6...根本原因&#xff1a;emoji 4個字節&#x…

MybatisPlus分頁查詢

分頁查詢controller寫法 public PageResult findByList(RequestBody UserDTO userDTO) {// 分頁IPage<User> page new Page(UserDTO.getPageNumber(), UserDTO.getPageSize());// 條件構造器QueryWrapper queryWrapper new QueryWrapper();queryWrapper.eq("user…

【深度學習】第1章

概論: 機器學習是對研究問題進行模型假設,利用計算機從訓練數據中學習得到模型參數,并最終對數據進行預測和分析,其基礎主要是歸納和統計。 深度學習是一種實現機器學習的技術,是機器學習重要的分支。其源于人工神經網絡的研究。深度學習的模型結構是一種含多隱層的神經…

Springboot應用的配置管理

Spring Boot應用的配置管理 在本文中&#xff0c;我們將深入探討Spring Boot的配置文件&#xff08;application.properties/yaml&#xff09;&#xff0c;以及如何在不同環境中管理配置和使用Spring Config Server。此外&#xff0c;我們還將分享一些高級配置技巧&#xff0c…

Spring Cloud Alibaba 架構-Sentinel整合nacos和gateway

官網地址 sentinel官網: https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 sentinel 下載地址: https://github.com/alibaba/Sentinel/releases nacos官網: https://nacos.io/zh-cn/docs/deployment.html nacos下載地址: https://github.com/alibaba/nacos/releas…

Shopee單個商品詳情采集

Shopee商品詳情頁數據采集實戰 作為東南亞地區最大的電商平臺之一,Shopee擁有超過3億活躍用戶。對于跨境電商企業、市場分析師等角色而言,從Shopee獲取商品數據是非常有價值的。本文將介紹如何使用Python程序采集Shopee單個商品詳情頁數據。 1. 確定采集目標和技術方案 確定…

路由傳參和獲取參數的三種方式

路由傳參和獲取參數在前端開發中是一個常見的需求&#xff0c;特別是在使用如 Vue.js、React 等前端框架時。下面&#xff0c;我將以 Vue.js 為例&#xff0c;介紹三種常見的路由傳參和獲取參數的方式&#xff1a; 1. 使用 params 傳參 傳參&#xff1a; 在路由配置中&#…

SQL Server 2022 STRING_SPLIT表值函數特性增強

SQL Server 2022 STRING_SPLIT表值函數特性增強 1、本文內容 List item語法參數返回類型注解 適用于&#xff1a;SQL Server 2016 (13.x) 及更高版本Azure SQL 數據庫Azure SQL 托管實例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析終結點Microsoft Fabric 中的倉…

golang內置包strings和bytes中的Map函數的理解和使用示例

在go的標志內置包strings和bytes中都有一個函數Map, 這個函數的作用是&#xff1a; 將輸入字符串/字節切片中的每個字符使用函數處理后映射后返回一份字符串/字節切片的副本&#xff0c;如果函數中的某個字符返回負數則刪除對應的字符。 作用很簡單&#xff0c;當時對于新手來…

Qt_tftp(未總結)

記錄一下tftp傳輸,日后總結 #ifndef CLIENTWORK_H #define CLIENTWORK_H#include <QObject> #include <QThread>#include <QHostAddress>

關于C的\r回車在不同平臺的問題

首先我們需要搞明白\r和\n是兩回事 \r是回車&#xff0c;前者使光標到行首&#xff0c;&#xff08;carriage return&#xff09; \n是換行&#xff0c;后者使光標下移一格&#xff0c;&#xff08;line feed&#xff09; Linux平臺下 #include <stdio.h> int main()…

Unidac連接Excel文件

終于找到一個連接字符串&#xff0c;記錄一下 UniConnection1.ConnectString : Format(Provider NameODBC;Server"DRIVERMicrosoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb); DBQ%s", [FileName]); UniConnection1.connected:true; UniConnection1.gettable…

神經網絡不確定性綜述(Part I)——A survey of uncertainty in deep neural networks

相關鏈接&#xff1a; 神經網絡不確定性綜述(Part I)——A survey of uncertainty in deep neural networks-CSDN博客 神經網絡不確定性綜述(Part II)——Uncertainty estimation_Single deterministic methods-CSDN博客 神經網絡不確定性綜述(Part III)——Uncertainty est…

Python實現xml解析并輸出到Excel上

1.編寫xml文件 2.使用Python的ElementTree模塊來解析XML import xml.etree.ElementTree as ET from openpyxl import Workbook # 解析XML函數 def parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot() --打開根節點data []for user in root.findall(Users/Us…

1.手動LogisticRegression模型的訓練和預測

通過這個示例&#xff0c;可以了解邏輯回歸模型的基本原理和訓練過程&#xff0c;同時可以通過修改和優化代碼來進一步探索機器學習模型的訓練和調優方法。 過程: 生成了一個模擬的二分類數據集&#xff1a;通過隨機生成包含兩個特征的數據data_x&#xff0c;并基于一定規則生…

秋招突擊——算法打卡——5/25、5/26——尋找兩個正序數組的中位數

題目描述 自我嘗試 首先&#xff0c;就是兩個有序的數組進行遍歷&#xff0c;遍歷到一半即可。然后求出均值&#xff0c;下述是我的代碼。但這明顯是有問題的&#xff0c;具體錯誤的代碼如下。計算復雜度太高了&#xff0c;O&#xff08;n&#xff09;&#xff0c;所以會超時&…

數據結構--《二叉樹》

二叉樹 1、什么是二叉樹 二叉樹(Binar Tree)是n(n>0)個結點的優先集合&#xff0c;該集合或者為空集(稱為空二叉樹)&#xff0c;或者由一個根結點和兩顆互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹構成。 這里給張圖&#xff0c;能更直觀的感受二叉樹&#xff1…

GDPU JavaWeb mvc模式

搭建一個mvc框架的小實例。 簡易計算器 有一個名為inputNumber.jsp的頁面提供一個表單&#xff0c;用戶可以通過表單輸入兩個數和運算符號提交給Servlet控制器&#xff1b;由名為ComputerBean.java生成的JavaBean負責存儲運算數、運算符號和運算結果&#xff0c;由名為handleCo…

C#中獲取FTP服務器文件

1、從ftp下載pdf的方法 public static void DownloadPdfFileFromFtp(string ftpUrl,string user,string password string localPath) { // 創建FtpWebRequest對象 FtpWebRequest request (FtpWebRequest)WebRequest.Create(ftpUrl); request.Method WebRequestMethods.Ftp…