?
?個人主頁:星紜-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標準庫中對于不同的地區會產生不一樣行為的部分。
在標準中,以來地區的部分有以下幾項:
- 數字量的格式
- 貨幣量的格式
- 字符集
- 日期和時間的表示形式
2.類項
通過修改地區,程序可以改變它的?為來適應世界的不同區域。但地區的改變可能會影響庫的許多部 分,其中?部分可能是我們不希望修改的。所以C語??持針對不同的類項進?修改,下?的?個宏, 指定?個類項:
- ? LC_COLLATE:影響字符串?較函數 strcoll() 和 strxfrm() 。
- ? LC_CTYPE:影響字符處理函數的?為。
- ? LC_MONETARY:影響貨幣格式。
- ? LC_NUMERIC:影響 printf() 的數字格式。
- ? LC_TIME:影響時間格式 strftime() 和 wcsftime() 。
- ? 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個過程:
- ?? 游戲開始(GameStart)完成游戲的初始化
- ? 游戲運?(GameRun)完成游戲運?邏輯的實現
- ?? 游戲結束(GameEnd)完成游戲結束的說明,實現資源釋放
1.游戲開始
?這個模塊需要完成游戲的初始化任務。
- 控制臺的設置
- 歡迎界面
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個節點,然后將每個節點存放在鏈表中進?管理。創建完蛇?后,將蛇的每?節打印在屏幕上。
- ?? 蛇的初始位置從(10,5)開始。?再設置當前游戲的狀態,蛇移動的速度,默認的?向,初始成績,每個?物的分數。
- ? 游戲狀態是:OK
- ? 蛇的移動速度:200毫秒
- ?? 蛇的默認?向:RIGHT
- ?? 初始成績:0
- ? 每個?物的分數: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,游戲繼續,其他狀態游戲結束。
并且根據游戲的過程中,按鍵的情況來確定蛇的下一步方向,或者是否加速減速,暫停或者退出游戲。
- ? 上:VK_UP
- ?? 下:VK_DOWN
- ? 左:VK_LEFT
- ? 右:VK_RIGHT
- ? 空格:VK_SPACE
- ? ESC:VK_ESCAPE
- ? F3:VK_F3
- ? 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;
}