欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:c語(yǔ)言 開(kāi)發(fā)語(yǔ)言 C--貪吃蛇

柚子快報(bào)邀請(qǐng)碼778899分享:c語(yǔ)言 開(kāi)發(fā)語(yǔ)言 C--貪吃蛇

http://yzkb.51969.com/

目錄

前言

簡(jiǎn)單的準(zhǔn)備工作

蛇的節(jié)點(diǎn)

開(kāi)始前?void GameStart(pSnake ps)

void WelcomeToGame()

void CreateMap()

? void InitSnake(pSnake ps)

?void CreateFood(pSnake ps)

游戲進(jìn)行 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é)

前言

貪吃蛇游戲是一個(gè)耳熟能詳?shù)男∮螒?本次我們講解他的簡(jiǎn)單的實(shí)現(xiàn),需要掌握基本的API知識(shí)(http://t.csdnimg.cn/uHH6y),簡(jiǎn)單的C語(yǔ)言知識(shí)和基本的數(shù)據(jù)結(jié)構(gòu)鏈表

簡(jiǎn)單的準(zhǔn)備工作

效果展示

屏幕錄制 2024-05-16 092902

蛇的節(jié)點(diǎn)

在游戲運(yùn)?的過(guò)程中,蛇每次吃?個(gè)?物,蛇的?體就會(huì)變??節(jié),如果我們使?鏈表存儲(chǔ)蛇的信 息,那么蛇的每?節(jié)其實(shí)就是鏈表的每個(gè)節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)只要記錄好蛇?節(jié)點(diǎn)在地圖上的坐標(biāo)就?, 所以蛇節(jié)點(diǎn)結(jié)構(gòu)如下:

typedef struct SnakeNode

{

int x;

int y;

struct SnakeNode* next;

}SnakeNode, * pSnakeNode;

但是這樣不好維護(hù)這一條蛇,要管理整條貪吃蛇,我們?cè)俜庋b?個(gè)Snake的結(jié)構(gòu)來(lái)維護(hù)整條貪吃蛇

typedef struct Snake

{

pSnakeNode _pSnake;維護(hù)整條蛇的指針

pSnakeNode _pFood;維護(hù)?物的指針

enum DIRECTION _Dir;頭的?向默認(rèn)是向右

enum GAME_STATUS _Status;游戲狀態(tài)

int _Socre;當(dāng)前獲得分?jǐn)?shù)

int _Add;默認(rèn)每個(gè)?物10分

int _SleepTime;每??步休眠時(shí)間

}Snake, * pSnake;

開(kāi)始前?void GameStart(pSnake ps)

游戲開(kāi)始,先打印蛇的身體和地圖,以及一些幫助的提示語(yǔ)句,先完成一些準(zhǔn)備工作

void GameStart(pSnake ps)

{

設(shè)置控制臺(tái)窗?的??,30?,100列

//mode 為DOS命令

system("mode con cols=100 lines=30");

//設(shè)置cmd窗?名稱

system("title 貪吃蛇");

//獲取標(biāo)準(zhǔn)輸出的句柄(?來(lái)標(biāo)識(shí)不同設(shè)備的數(shù)值)

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //影藏光標(biāo)操作

CONSOLE_CURSOR_INFO CursorInfo; //打印歡迎界?

WelcomeToGame(); //打印地圖

CreateMap(); //初始化蛇

GetConsoleCursorInfo(hOutput, &CursorInfo);//獲取控制臺(tái)光標(biāo)信息

CursorInfo.bVisible = false; //隱藏控制臺(tái)光標(biāo)

SetConsoleCursorInfo(hOutput, &CursorInfo);//設(shè)置控制臺(tái)光標(biāo)狀態(tài)

InitSnake(ps);

//創(chuàng)造第?個(gè)?物

CreateFood(ps);

}

void WelcomeToGame()

在游戲正式開(kāi)始之前,做?些功能提醒,來(lái)讓玩家了解游戲方法與規(guī)則,其中SetPos是一個(gè)已經(jīng)封裝后的函數(shù),可以把這個(gè)字體打在這個(gè)坐標(biāo)

void WelcomeToGame()

{

SetPos(40, 15);

printf("歡迎來(lái)到貪吃蛇?游戲");

SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點(diǎn)

system("pause");

system("cls");

SetPos(25, 12);

printf("? ↑ . ↓ . ← . → 分別控制蛇的移動(dòng), F3為加速,F(xiàn)4為減速\n");

SetPos(25, 13);

printf("加速將能得到更?的分?jǐn)?shù)。\n");

SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點(diǎn)

system("pause");

system("cls");

}

void CreateMap()

創(chuàng)建地圖就是將強(qiáng)打印出來(lái),因?yàn)槭菍捵址蛴。惺?wprintf函數(shù),打印格式串前使?L 打印地圖的關(guān)鍵是要算好坐標(biāo),才能在想要的位置打印墻體。

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開(kāi)始增?

for (i = 1; i < 26; i++)

{

SetPos(0, i);

wprintf(L"%c", WALL);} //是56y從1開(kāi)始增?

for (i = 1; i < 26; i++)

{

SetPos(56, i);

wprintf(L"%c", WALL);

}

}

? void InitSnake(pSnake ps)

蛇最開(kāi)始?度為5節(jié),每節(jié)對(duì)應(yīng)鏈表的?個(gè)節(jié)點(diǎn),蛇?的每?個(gè)節(jié)點(diǎn)都有??的坐標(biāo)。 創(chuàng)建5個(gè)節(jié)點(diǎn),然后將每個(gè)節(jié)點(diǎn)存放在鏈表中進(jìn)?管理。創(chuàng)建完蛇?后,將蛇的每?節(jié)打印在屏幕上。?再設(shè)置當(dāng)前游戲的狀態(tài),蛇移動(dòng)的速度,默認(rèn)的?向,初始成績(jī),蛇的狀態(tài),每個(gè)?物的分?jǐn)?shù)。

void InitSnake(pSnake ps)

{

pSnakeNode cur = NULL;

int i = 0;

//創(chuàng)建蛇?節(jié)點(diǎn),并初始化坐標(biāo)

//頭插法

for (i = 0; i < 5; i++)

{

//創(chuàng)建蛇?的節(jié)點(diǎn)

cur = (pSnakeNode)malloc(sizeof(SnakeNode));

if (cur == NULL)

{

perror("InitSnake()::malloc()");

return;

}

//設(shè)置坐標(biāo)

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)

先隨機(jī)?成?物的坐標(biāo) ?

x坐標(biāo)必須是2的倍數(shù) ??物的坐標(biāo)不能和蛇?每個(gè)節(jié)點(diǎn)的坐標(biāo)重復(fù)?創(chuàng)建?物節(jié)點(diǎn),打印?物

void CreateFood(pSnake ps)

{

int x = 0;

int y = 0;

again:

//產(chǎn)?的x坐標(biāo)應(yīng)該是2倍數(shù),這樣才可能和蛇頭坐標(biāo)對(duì)?。

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;

}

}

游戲進(jìn)行 void GameRun(pSnake ps)

游戲運(yùn)?期間,右側(cè)打印幫助信息,提?玩家 根據(jù)游戲狀態(tài)檢查游戲是否繼續(xù),如果是狀態(tài)是OK,游戲繼續(xù),否則游戲結(jié)束。 如果游戲繼續(xù),就是檢測(cè)按鍵情況,確定蛇下?步的?向,或者是否加速減速,是否暫?;蛘咄顺鲇?戲。 確定了蛇的?向和速度,蛇就可以移動(dòng)了。

void GameRun(pSnake ps)

{

//打印右側(cè)幫助信息

PrintHelpInfo();

do

{

SetPos(64, 10); printf("得分:%d ", ps->_Socre);

printf("每個(gè)?物得分:%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;

}

}

}

//蛇每次?定之間要休眠的時(shí)間,時(shí)間短,蛇移動(dòng)速度就快

Sleep(ps->_SleepTime);

SnakeMove(ps);

} while (ps->_Status == OK);

}

? int NextIsFood(pSnakeNode psn, pSnake ps)

是一個(gè)判斷下一個(gè)位置是食物的函數(shù),會(huì)在下面SnakeMove起到作用,是食物的話將吃掉,不是的話將繼續(xù)按按鍵運(yùn)動(dòng)

int NextIsFood(pSnakeNode psn, pSnake ps)

{

return (psn->x == ps->_pFood->x) && (psn->y == ps->_pFood->y);

}

?void NoFood(pSnakeNode psn, pSnake ps)

將下?個(gè)節(jié)點(diǎn)頭插?蛇的?體,并將之前蛇?最后?個(gè)節(jié)點(diǎn)打印為空格,放棄掉蛇?的最后?個(gè)節(jié)點(diǎn),在時(shí)間是毫米的瞬間完成,造成移動(dòng)的效果

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);

}

//最后?個(gè)位置打印空格,然后釋放節(jié)點(diǎn)

SetPos(cur->next->x, cur->next->y);

printf(" ");

free(cur->next);

cur->next = NULL;

}

void SnakeMove(pSnake ps)

蛇?移動(dòng)先創(chuàng)建下?個(gè)節(jié)點(diǎn),根據(jù)移動(dòng)?向和蛇頭的坐標(biāo),蛇移動(dòng)到下?個(gè)位置的坐標(biāo)。 確定了下?個(gè)位置后,看下?個(gè)位置是否是?物(NextIsFood),是?物就做吃?物處理 (EatFood),如果不是?物則做前進(jìn)?步的處理(NoFood)。 蛇?移動(dòng)后,判斷此次移動(dòng)是否會(huì)造成撞墻(KillByWall)或者撞上??蛇?(KillBySelf),從?影 響游戲的狀態(tài)

void SnakeMove(pSnake ps)

{

//創(chuàng)建下?個(gè)節(jié)點(diǎn)

pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));

if (pNextNode == NULL)

{

perror("SnakeMove()::malloc()");

return;

} //確定下?個(gè)節(jié)點(diǎn)的坐標(biāo),下?個(gè)節(jié)點(diǎn)的坐標(biāo)根據(jù),蛇頭的坐標(biāo)和?向確定

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;

}

//如果下?個(gè)位置就是?物

if (NextIsFood(pNextNode, ps))

{

EatFood(pNextNode, ps);

}

else//如果沒(méi)有?物

{

NoFood(pNextNode, ps);

}

KillByWall(ps);

KillBySelf(ps);

}

游戲結(jié)束 void GameEnd(pSnake ps)

游戲結(jié)束 游戲狀態(tài)不再是OK(游戲繼續(xù))的時(shí)候,要告知游戲技術(shù)的原因,并且釋放蛇?節(jié)點(diǎn)。

void GameEnd(pSnake ps)

{

pSnakeNode cur = ps->_pSnake;

SetPos(24, 12);

switch (ps->_Status)

{

case END_NOMAL:

printf("您主動(dòng)退出游戲\n");

break;

case KILL_BY_SELF: printf("您撞上??了 ,游戲結(jié)束!\n");

break;

case KILL_BY_WALL:

printf("您撞墻了,游戲結(jié)束!\n"); } //釋放蛇?的節(jié)點(diǎn)

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("再來(lái)?局嗎?(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,//正常運(yùn)?

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é)點(diǎn)

typedef struct SnakeNode

{

int x;

int y;

struct SnakeNode* next;

}SnakeNode, * pSnakeNode;

typedef struct Snake

{

pSnakeNode _pSnake;//整條蛇的指針

pSnakeNode _pFood;//維護(hù)?物的指針

enum DIRECTION _Dir;//蛇頭的?向默認(rèn)是向右

enum GAME_STATUS _Status;//游戲狀態(tài)

int _Socre;//當(dāng)前獲得分?jǐn)?shù)

int _Add;//默認(rèn)每個(gè)?物

int _SleepTime;//每??步休眠時(shí)間

}Snake, * pSnake;

//游戲開(kāi)始前的初始化

void GameStart(pSnake ps); //游戲運(yùn)?過(guò)程

void GameRun(pSnake ps); //結(jié)束

void GameEnd(pSnake ps); //設(shè)置光標(biāo)的坐標(biāo)

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(); //下?個(gè)節(jié)點(diǎn)是?物

int NextIsFood(pSnakeNode psn, pSnake ps); //吃?物

void EatFood(pSnakeNode psn, pSnake ps); //不吃?物

void NoFood(pSnakeNode psn, pSnake ps); //撞墻檢測(cè)

int KillByWall(pSnake ps); //撞??檢測(cè)

int KillBySelf(pSnake ps); //蛇的移動(dòng)

void SnakeMove(pSnake ps); //游戲初始化

void GameStart(pSnake ps); //游戲運(yùn)?

void GameRun(pSnake ps); //游戲結(jié)束

void GameEnd(pSnake ps);

snake.cpp

#include "Snake.h"

//設(shè)置光標(biāo)的坐標(biāo)

void SetPos(short x, short y)

{

COORD pos = { x, y };

HANDLE hOutput = NULL;//獲取標(biāo)準(zhǔn)輸出的句柄(?來(lái)標(biāo)識(shí)不同設(shè)備的數(shù)值)

hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//設(shè)置標(biāo)準(zhǔn)輸出上光標(biāo)的位置為

pos SetConsoleCursorPosition(hOutput, pos);

}

void WelcomeToGame()

{

SetPos(40, 15);

printf("歡迎來(lái)到貪吃蛇?游戲");

SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點(diǎn)

system("pause");

system("cls");

SetPos(25, 12);

printf("? ↑ . ↓ . ← . → 控制蛇的移動(dòng), F3為加速,F(xiàn)4為減速\n");

SetPos(25, 13);

printf("加速將能得到更?的分?jǐn)?shù)。\n");

SetPos(40, 25);//讓按任意鍵繼續(xù)的出現(xiàn)的位置好看點(diǎ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開(kāi)始增?

for (i = 1; i < 26; i++)

{

SetPos(0, i);

wprintf(L"%c", WALL);

}

//56,從開(kāi)始增?

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é)點(diǎn),并初始化坐標(biāo)

//頭插法

for (i = 0; i < 5; i++)

{

//創(chuàng)建蛇?的節(jié)點(diǎn)

cur = (pSnakeNode)malloc(sizeof(SnakeNode));

if (cur == NULL)

{

perror("InitSnake()::malloc()");

return;

}

//設(shè)置坐標(biāo)

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坐標(biāo)應(yīng)該是2的倍數(shù),這樣才可能和蛇頭坐標(biāo)對(duì)?。

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("?↑.↓.←.→分別控制蛇的移動(dòng).");

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 是下?個(gè)節(jié)點(diǎn)的地址

//pSnake ps 維護(hù)蛇的指針

int NextIsFood(pSnakeNode psn, pSnake ps)

{

return (psn->x == ps->_pFood->x) && (psn->y == ps->_pFood->y);

}

//pSnakeNode psn 是下?個(gè)節(jié)點(diǎn)的地址

//pSnake ps 維護(hù)蛇的指針

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

是下?個(gè)節(jié)點(diǎn)的地址

//pSnake ps

維護(hù)蛇的指針

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;

}

//最后?個(gè)位置打印空格,然后釋放節(jié)點(diǎn)

SetPos(cur->next->x, cur->next->y);

printf(" ");

free(cur->next);

cur->next = NULL;

}

//pSnake ps

維護(hù)蛇的指針

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

維護(hù)蛇的指針

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)建下?個(gè)節(jié)點(diǎn)

pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));

if (pNextNode == NULL)

{

perror("SnakeMove()::malloc()");

return;

}

//

確定下?個(gè)節(jié)點(diǎn)的坐標(biāo),下?個(gè)節(jié)點(diǎn)的坐標(biāo)根據(jù),蛇頭的坐標(biāo)和?向確定

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;

}

//如果下?個(gè)位置就是?物

if (NextIsFood(pNextNode, ps))

{

EatFood(pNextNode, ps);

}

else//如果沒(méi)有?物

{

NoFood(pNextNode, ps);

}

KillByWall(ps);

KillBySelf(ps);

}

void GameStart(pSnake ps)

{

//設(shè)置控制臺(tái)窗?的??,30?,100

//mode 為DOS命令

system("mode con cols=100 lines=30");

//設(shè)置cmd窗?名稱

system("title 貪吃蛇");

//獲取標(biāo)準(zhǔn)輸出的句柄(來(lái)標(biāo)識(shí)不同設(shè)備的數(shù)值)

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //影藏光標(biāo)操作

CONSOLE_CURSOR_INFO CursorInfo;

GetConsoleCursorInfo(hOutput, &CursorInfo);//獲取控制臺(tái)光標(biāo)信息

CursorInfo.bVisible = false; //隱藏控制臺(tái)光標(biāo)

SetConsoleCursorInfo(hOutput, &CursorInfo);//設(shè)置控制臺(tái)光標(biāo)狀態(tài) //打印歡迎界?

WelcomeToGame(); //打印地圖

CreateMap(); //初始化蛇

InitSnake(ps); /創(chuàng)造第?個(gè)?物

CreateFood(ps);

}

void GameRun(pSnake ps)

{ //打印右側(cè)幫助信息

PrintHelpInfo();

do

{

SetPos(64, 10);

printf("得分:%d ", ps->_Socre); printf("每個(gè)?物得分:%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;

}

}

}

//蛇每次?定之間要休眠的時(shí)間,時(shí)間短,蛇移動(dòng)速度就快

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("您主動(dòng)退出游戲\n");

break;

case KILL_BY_SELF:

printf("您撞上??了 ,游戲結(jié)束!\n"); break;

case KILL_BY_WALL:

printf("您撞墻了,游戲結(jié)束!\n");

break;

}

//釋放蛇?的節(jié)點(diǎn)

while (cur)

{

pSnakeNode del = cur;

cur = cur->next;

free(del);

}

}

總結(jié)

貪吃蛇小游戲是一個(gè)有趣的小游戲,也讓我學(xué)到了很多,希望大家多多支持!!!

柚子快報(bào)邀請(qǐng)碼778899分享:c語(yǔ)言 開(kāi)發(fā)語(yǔ)言 C--貪吃蛇

http://yzkb.51969.com/

精彩文章

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/18919839.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄