柚子快報邀請碼778899分享:c語言 開發(fā)語言 C--貪吃蛇
柚子快報邀請碼778899分享:c語言 開發(fā)語言 C--貪吃蛇
目錄
前言
簡單的準備工作
蛇的節(jié)點
開始前?void GameStart(pSnake ps)
void WelcomeToGame()
void CreateMap()
? void InitSnake(pSnake ps)
?void CreateFood(pSnake ps)
游戲進行 void GameRun(pSnake ps)
? int NextIsFood(pSnakeNode psn, pSnake ps)
?void NoFood(pSnakeNode psn, pSnake ps)
void SnakeMove(pSnake ps)
游戲結(jié)束 void GameEnd(pSnake ps)
源碼
test.c
snake.h
snake.cpp
總結(jié)
前言
貪吃蛇游戲是一個耳熟能詳?shù)男∮螒?本次我們講解他的簡單的實現(xiàn),需要掌握基本的API知識(http://t.csdnimg.cn/uHH6y),簡單的C語言知識和基本的數(shù)據(jù)結(jié)構(gòu)鏈表
簡單的準備工作
效果展示
屏幕錄制 2024-05-16 092902
蛇的節(jié)點
在游戲運?的過程中,蛇每次吃?個?物,蛇的?體就會變??節(jié),如果我們使?鏈表存儲蛇的信 息,那么蛇的每?節(jié)其實就是鏈表的每個節(jié)點。每個節(jié)點只要記錄好蛇?節(jié)點在地圖上的坐標就?, 所以蛇節(jié)點結(jié)構(gòu)如下:
typedef struct SnakeNode
{
int x;
int y;
struct SnakeNode* next;
}SnakeNode, * pSnakeNode;
但是這樣不好維護這一條蛇,要管理整條貪吃蛇,我們再封裝?個Snake的結(jié)構(gòu)來維護整條貪吃蛇
typedef struct Snake
{
pSnakeNode _pSnake;維護整條蛇的指針
pSnakeNode _pFood;維護?物的指針
enum DIRECTION _Dir;頭的?向默認是向右
enum GAME_STATUS _Status;游戲狀態(tài)
int _Socre;當(dāng)前獲得分數(shù)
int _Add;默認每個?物10分
int _SleepTime;每??步休眠時間
}Snake, * pSnake;
開始前?void GameStart(pSnake ps)
游戲開始,先打印蛇的身體和地圖,以及一些幫助的提示語句,先完成一些準備工作
void GameStart(pSnake ps)
{
設(shè)置控制臺窗?的??,30?,100列
//mode 為DOS命令
system("mode con cols=100 lines=30");
//設(shè)置cmd窗?名稱
system("title 貪吃蛇");
//獲取標準輸出的句柄(?來標識不同設(shè)備的數(shù)值)
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //影藏光標操作
CONSOLE_CURSOR_INFO CursorInfo; //打印歡迎界?
WelcomeToGame(); //打印地圖
CreateMap(); //初始化蛇
GetConsoleCursorInfo(hOutput, &CursorInfo);//獲取控制臺光標信息
CursorInfo.bVisible = false; //隱藏控制臺光標
SetConsoleCursorInfo(hOutput, &CursorInfo);//設(shè)置控制臺光標狀態(tài)
InitSnake(ps);
//創(chuàng)造第?個?物
CreateFood(ps);
}
void WelcomeToGame()
在游戲正式開始之前,做?些功能提醒,來讓玩家了解游戲方法與規(guī)則,其中SetPos是一個已經(jīng)封裝后的函數(shù),可以把這個字體打在這個坐標
void WelcomeToGame()
{
SetPos(40, 15);
printf("歡迎來到貪吃蛇?游戲");
SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點
system("pause");
system("cls");
SetPos(25, 12);
printf("? ↑ . ↓ . ← . → 分別控制蛇的移動, F3為加速,F(xiàn)4為減速\n");
SetPos(25, 13);
printf("加速將能得到更?的分數(shù)。\n");
SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點
system("pause");
system("cls");
}
void CreateMap()
創(chuàng)建地圖就是將強打印出來,因為是寬字符打印,所有使?wprintf函數(shù),打印格式串前使?L 打印地圖的關(guān)鍵是要算好坐標,才能在想要的位置打印墻體。
void CreateMap()
{
int i = 0;
//上(0,0)-(56, 0)
SetPos(0, 0);
for (i = 0; i < 58; i += 2)
{
wprintf(L"%c", WALL);
} //下(0,26)-(56, 26)
SetPos(0, 26); for (i = 0; i < 58; i += 2)
{ wprintf(L"%c", WALL);
} //左//x是0,y從1開始增?
for (i = 1; i < 26; i++)
{
SetPos(0, i);
wprintf(L"%c", WALL);} //是56y從1開始增?
for (i = 1; i < 26; i++)
{
SetPos(56, i);
wprintf(L"%c", WALL);
}
}
? void InitSnake(pSnake ps)
蛇最開始?度為5節(jié),每節(jié)對應(yīng)鏈表的?個節(jié)點,蛇?的每?個節(jié)點都有??的坐標。 創(chuàng)建5個節(jié)點,然后將每個節(jié)點存放在鏈表中進?管理。創(chuàng)建完蛇?后,將蛇的每?節(jié)打印在屏幕上。?再設(shè)置當(dāng)前游戲的狀態(tài),蛇移動的速度,默認的?向,初始成績,蛇的狀態(tài),每個?物的分數(shù)。
void InitSnake(pSnake ps)
{
pSnakeNode cur = NULL;
int i = 0;
//創(chuàng)建蛇?節(jié)點,并初始化坐標
//頭插法
for (i = 0; i < 5; i++)
{
//創(chuàng)建蛇?的節(jié)點
cur = (pSnakeNode)malloc(sizeof(SnakeNode));
if (cur == NULL)
{
perror("InitSnake()::malloc()");
return;
}
//設(shè)置坐標
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"%c", BODY);
cur = cur->next;
}
//
初始化貪吃蛇數(shù)據(jù)
ps->_SleepTime = 200;
ps->_Socre = 0;
ps->_Status = OK;
ps->_Dir = RIGHT;
ps->_Add = 10;
}
?void CreateFood(pSnake ps)
先隨機?成?物的坐標 ?
x坐標必須是2的倍數(shù) ??物的坐標不能和蛇?每個節(jié)點的坐標重復(fù)?創(chuàng)建?物節(jié)點,打印?物
void CreateFood(pSnake ps)
{
int x = 0;
int y = 0;
again:
//產(chǎn)?的x坐標應(yīng)該是2倍數(shù),這樣才可能和蛇頭坐標對?。
do
{
x = rand() % 53 + 2;
y = rand() % 25 + 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)); //創(chuàng)建?物
if (pFood == NULL)
{
perror("CreateFood::malloc()");
return;
}
else
{
pFood->x = x;
pFood->y = y;
SetPos(pFood->x, pFood->y);
wprintf(L"%c", FOOD);
ps->_pFood = pFood;
}
}
游戲進行 void GameRun(pSnake ps)
游戲運?期間,右側(cè)打印幫助信息,提?玩家 根據(jù)游戲狀態(tài)檢查游戲是否繼續(xù),如果是狀態(tài)是OK,游戲繼續(xù),否則游戲結(jié)束。 如果游戲繼續(xù),就是檢測按鍵情況,確定蛇下?步的?向,或者是否加速減速,是否暫?;蛘咄顺鲇?戲。 確定了蛇的?向和速度,蛇就可以移動了。
void GameRun(pSnake ps)
{
//打印右側(cè)幫助信息
PrintHelpInfo();
do
{
SetPos(64, 10); printf("得分:%d ", ps->_Socre);
printf("每個?物得分:%d分", ps->_Add);
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_NOMAL;
break;
}
else if (KEY_PRESS(VK_F3))
{
if (ps->_SleepTime >= 50)
{
ps->_SleepTime -= 30;
ps->_Add += 2;
}
}
else if (KEY_PRESS(VK_F4))
{
if (ps->_SleepTime < 350)
{
ps->_SleepTime += 30;
ps->_Add -= 2;
if (ps->_SleepTime == 350)
{
ps->_Add = 1;
}
}
}
//蛇每次?定之間要休眠的時間,時間短,蛇移動速度就快
Sleep(ps->_SleepTime);
SnakeMove(ps);
} while (ps->_Status == OK);
}
? int NextIsFood(pSnakeNode psn, pSnake ps)
是一個判斷下一個位置是食物的函數(shù),會在下面SnakeMove起到作用,是食物的話將吃掉,不是的話將繼續(xù)按按鍵運動
int NextIsFood(pSnakeNode psn, pSnake ps)
{
return (psn->x == ps->_pFood->x) && (psn->y == ps->_pFood->y);
}
?void NoFood(pSnakeNode psn, pSnake ps)
將下?個節(jié)點頭插?蛇的?體,并將之前蛇?最后?個節(jié)點打印為空格,放棄掉蛇?的最后?個節(jié)點,在時間是毫米的瞬間完成,造成移動的效果
void NoFood(pSnakeNode psn, pSnake ps)
{
//頭插法
psn->next = ps->_pSnake;
ps->_pSnake = psn;
pSnakeNode cur = ps->_pSnake;
//打印蛇
while (cur->next->next)
{
SetPos(cur->x, cur->y);
wprintf(L"%c", BODY);
}
//最后?個位置打印空格,然后釋放節(jié)點
SetPos(cur->next->x, cur->next->y);
printf(" ");
free(cur->next);
cur->next = NULL;
}
void SnakeMove(pSnake ps)
蛇?移動先創(chuàng)建下?個節(jié)點,根據(jù)移動?向和蛇頭的坐標,蛇移動到下?個位置的坐標。 確定了下?個位置后,看下?個位置是否是?物(NextIsFood),是?物就做吃?物處理 (EatFood),如果不是?物則做前進?步的處理(NoFood)。 蛇?移動后,判斷此次移動是否會造成撞墻(KillByWall)或者撞上??蛇?(KillBySelf),從?影 響游戲的狀態(tài)
void SnakeMove(pSnake ps)
{
//創(chuàng)建下?個節(jié)點
pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));
if (pNextNode == NULL)
{
perror("SnakeMove()::malloc()");
return;
} //確定下?個節(jié)點的坐標,下?個節(jié)點的坐標根據(jù),蛇頭的坐標和?向確定
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);
}
游戲結(jié)束 void GameEnd(pSnake ps)
游戲結(jié)束 游戲狀態(tài)不再是OK(游戲繼續(xù))的時候,要告知游戲技術(shù)的原因,并且釋放蛇?節(jié)點。
void GameEnd(pSnake ps)
{
pSnakeNode cur = ps->_pSnake;
SetPos(24, 12);
switch (ps->_Status)
{
case END_NOMAL:
printf("您主動退出游戲\n");
break;
case KILL_BY_SELF: printf("您撞上??了 ,游戲結(jié)束!\n");
break;
case KILL_BY_WALL:
printf("您撞墻了,游戲結(jié)束!\n"); } //釋放蛇?的節(jié)點
while (cur)
{
pSnakeNode del = cur;
cur = cur->next;
free(del);
}
}
源碼
test.c
#include "Snake.h"
#include
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();//清理\n } while (ch == 'Y');
SetPos(0, 27);
}
int main()
{
//修改當(dāng)前地區(qū)為本地模式,為了?持中?寬字符的打印
setlocale(LC_ALL, "");
test();
return 0;
}
snake.h
#pragma once
#include
#include
#include
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)
//?向
enum DIRECTION
{
UP = 1,
DOWN,
LEFT,
RIGHT
};
//游戲狀態(tài)
enum GAME_STATUS
{
OK,//正常運?
KILL_BY_WALL,//撞墻
KILL_BY_SELF,//咬到??
END_NOMAL//正常結(jié)束
};
#define WALL L'□'
#define BODY L'●' // ★ ○● ◇◆ □■
#define FOOD L' ★ ' // ★ ○● ◇◆ □■ //蛇的初始位置
#define POS_X 24
#define POS_Y 5 //蛇?節(jié)點
typedef struct SnakeNode
{
int x;
int y;
struct SnakeNode* next;
}SnakeNode, * pSnakeNode;
typedef struct Snake
{
pSnakeNode _pSnake;//整條蛇的指針
pSnakeNode _pFood;//維護?物的指針
enum DIRECTION _Dir;//蛇頭的?向默認是向右
enum GAME_STATUS _Status;//游戲狀態(tài)
int _Socre;//當(dāng)前獲得分數(shù)
int _Add;//默認每個?物
int _SleepTime;//每??步休眠時間
}Snake, * pSnake;
//游戲開始前的初始化
void GameStart(pSnake ps); //游戲運?過程
void GameRun(pSnake ps); //結(jié)束
void GameEnd(pSnake ps); //設(shè)置光標的坐標
void SetPos(short x, short y); //歡迎界?
void WelcomeToGame(); //打印幫助信息
void PrintHelpInfo(); //創(chuàng)建地圖
void CreateMap();//初始化蛇
void InitSnake(pSnake ps); //?物
void CreateFood(pSnake ps);暫停響應(yīng)
void pause(); //下?個節(jié)點是?物
int NextIsFood(pSnakeNode psn, pSnake ps); //吃?物
void EatFood(pSnakeNode psn, pSnake ps); //不吃?物
void NoFood(pSnakeNode psn, pSnake ps); //撞墻檢測
int KillByWall(pSnake ps); //撞??檢測
int KillBySelf(pSnake ps); //蛇的移動
void SnakeMove(pSnake ps); //游戲初始化
void GameStart(pSnake ps); //游戲運?
void GameRun(pSnake ps); //游戲結(jié)束
void GameEnd(pSnake ps);
snake.cpp
#include "Snake.h"
//設(shè)置光標的坐標
void SetPos(short x, short y)
{
COORD pos = { x, y };
HANDLE hOutput = NULL;//獲取標準輸出的句柄(?來標識不同設(shè)備的數(shù)值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//設(shè)置標準輸出上光標的位置為
pos SetConsoleCursorPosition(hOutput, pos);
}
void WelcomeToGame()
{
SetPos(40, 15);
printf("歡迎來到貪吃蛇?游戲");
SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點
system("pause");
system("cls");
SetPos(25, 12);
printf("? ↑ . ↓ . ← . → 控制蛇的移動, F3為加速,F(xiàn)4為減速\n");
SetPos(25, 13);
printf("加速將能得到更?的分數(shù)。\n");
SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點
system("pause");
system("cls"); } void CreateMap()
{
int i = 0;
//上(0,0)-(56, 0)
SetPos(0, 0);
for (i = 0; i < 58; i += 2)
{
wprintf(L"%c", WALL);
}
//
下(0,26)-(56, 26)
SetPos(0, 26);
for (i = 0; i < 58; i += 2)
{
wprintf(L"%c", WALL);
}
//左
//x0,y從1開始增?
for (i = 1; i < 26; i++)
{
SetPos(0, i);
wprintf(L"%c", WALL);
}
//56,從開始增?
for (i = 1; i < 26; i++)
{
SetPos(56, i);
wprintf(L"%c", WALL);
}
}
void InitSnake(pSnake ps)
{
pSnakeNode cur = NULL;
int i = 0;
//創(chuàng)建蛇?節(jié)點,并初始化坐標
//頭插法
for (i = 0; i < 5; i++)
{
//創(chuàng)建蛇?的節(jié)點
cur = (pSnakeNode)malloc(sizeof(SnakeNode));
if (cur == NULL)
{
perror("InitSnake()::malloc()");
return;
}
//設(shè)置坐標
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"%c", BODY);
cur = cur->next;
}
//初始化貪吃蛇數(shù)據(jù)
ps->_SleepTime = 200;
ps->_Socre = 0;
ps->_Status = OK;
ps->_Dir = RIGHT;
ps->_Add = 10;
}
void CreateFood(pSnake ps)
{
int x = 0;
int y = 0;
again:
//產(chǎn)?的x坐標應(yīng)該是2的倍數(shù),這樣才可能和蛇頭坐標對?。
do
{
x = rand() % 53 + 2;
y = rand() % 25 + 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)); //
創(chuàng)建?物
if (pFood == NULL)
{
perror("CreateFood::malloc()");
return;
}
else
{
pFood->x = x;
pFood->y = y;
SetPos(pFood->x, pFood->y);
wprintf(L"%c", FOOD);
ps->_pFood = pFood;
}
}
void PrintHelpInfo()
{
}
void pause()//暫停
{打印提?信息
SetPos(64, 15);
printf("不能穿墻,不能咬到??\n");
SetPos(64, 16);
printf("?↑.↓.←.→分別控制蛇的移動.");
SetPos(64, 17);
printf("F1 為加速,F(xiàn)2 為減速\n");
SetPos(64, 18);
printf("ESC :退出游戲.space:暫停游戲.");
SetPos(64, 20);
while (1)
{
Sleep(300);
if (KEY_PRESS(VK_SPACE))
{
break;
}
}
}
//pSnakeNode psn 是下?個節(jié)點的地址
//pSnake ps 維護蛇的指針
int NextIsFood(pSnakeNode psn, pSnake ps)
{
return (psn->x == ps->_pFood->x) && (psn->y == ps->_pFood->y);
}
//pSnakeNode psn 是下?個節(jié)點的地址
//pSnake ps 維護蛇的指針
void EatFood(pSnakeNode psn, pSnake ps)
{
//頭插法
psn->next = ps->_pSnake;
ps->_pSnake = psn;
pSnakeNode cur = ps->_pSnake;
//打印蛇
while (cur)
{
SetPos(cur->x, cur->y);
wprintf(L"%c", BODY);
cur = cur->next;
}
ps->_Socre += ps->_Add;
free(ps->_pFood);
CreateFood(ps);
}
//pSnakeNode psn
是下?個節(jié)點的地址
//pSnake ps
維護蛇的指針
void NoFood(pSnakeNode psn, pSnake ps)
{
//頭插法
psn->next = ps->_pSnake;
ps->_pSnake = psn;
pSnakeNode cur = ps->_pSnake; //打印蛇
while (cur->next->next)
{
SetPos(cur->x, cur->y);
wprintf(L"%c", BODY);
cur = cur->next;
}
//最后?個位置打印空格,然后釋放節(jié)點
SetPos(cur->next->x, cur->next->y);
printf(" ");
free(cur->next);
cur->next = NULL;
}
//pSnake ps
維護蛇的指針
int 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;
return 1;
}
return 0;
}
//pSnake ps
維護蛇的指針
int KillBySelf(pSnake ps)
{
pSnakeNode cur = ps->_pSnake->next;
while (cur)
{
if ((ps->_pSnake->x == cur->x)
&& (ps->_pSnake->y == cur->y))
{
ps->_Status = KILL_BY_SELF;
return 1;
}
cur = cur->next;
}
return 0;
}
void SnakeMove(pSnake ps)
{
//創(chuàng)建下?個節(jié)點
pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));
if (pNextNode == NULL)
{
perror("SnakeMove()::malloc()");
return;
}
//
確定下?個節(jié)點的坐標,下?個節(jié)點的坐標根據(jù),蛇頭的坐標和?向確定
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 GameStart(pSnake ps)
{
//設(shè)置控制臺窗?的??,30?,100
//mode 為DOS命令
system("mode con cols=100 lines=30");
//設(shè)置cmd窗?名稱
system("title 貪吃蛇");
//獲取標準輸出的句柄(來標識不同設(shè)備的數(shù)值)
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //影藏光標操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//獲取控制臺光標信息
CursorInfo.bVisible = false; //隱藏控制臺光標
SetConsoleCursorInfo(hOutput, &CursorInfo);//設(shè)置控制臺光標狀態(tài) //打印歡迎界?
WelcomeToGame(); //打印地圖
CreateMap(); //初始化蛇
InitSnake(ps); /創(chuàng)造第?個?物
CreateFood(ps);
}
void GameRun(pSnake ps)
{ //打印右側(cè)幫助信息
PrintHelpInfo();
do
{
SetPos(64, 10);
printf("得分:%d ", ps->_Socre); printf("每個?物得分:%d分", ps->_Add);
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_NOMAL;
break;
}
else if (KEY_PRESS(VK_F3))
{
if (ps->_SleepTime >= 50)
{
ps->_SleepTime -= 30;
ps->_Add += 2;
}
}
else if (KEY_PRESS(VK_F4))
{
if (ps->_SleepTime < 350)
{
ps->_SleepTime += 30;
ps->_Add -= 2;
if (ps->_SleepTime == 350)
{
ps->_Add = 1;
}
}
}
//蛇每次?定之間要休眠的時間,時間短,蛇移動速度就快
Sleep(ps->_SleepTime);
SnakeMove(ps);
} while (ps->_Status == OK);
}
void GameEnd(pSnake ps)
{
pSnakeNode cur = ps->_pSnake;
SetPos(24, 12);
switch (ps->_Status)
{
case END_NOMAL: printf("您主動退出游戲\n");
break;
case KILL_BY_SELF:
printf("您撞上??了 ,游戲結(jié)束!\n"); break;
case KILL_BY_WALL:
printf("您撞墻了,游戲結(jié)束!\n");
break;
}
//釋放蛇?的節(jié)點
while (cur)
{
pSnakeNode del = cur;
cur = cur->next;
free(del);
}
}
總結(jié)
貪吃蛇小游戲是一個有趣的小游戲,也讓我學(xué)到了很多,希望大家多多支持!!!
柚子快報邀請碼778899分享:c語言 開發(fā)語言 C--貪吃蛇
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。