c语言大作业贪吃蛇源代码,C语言实现贪吃蛇源码(示例代码)

先放效果

9b03c7fe1eb24ad69868c4b21c69d250.jpg

eb88768c4455492da461407ab8d48ee3.jpg

源代码

//2016-2-12

//zhaoyu

//Gmail:[email protected]

//Language: C

//Platform:Code::Blocks

#include

#include

#include

#include

typedef struct snake

{

int x;

int y;

struct snake *next;

}Snake;

int X, Y;

enum STATUS{Up = 1, Down, Left, Right};

Snake *pHead, *pBody;//the head of the snake

enum STATUS Direction;

int score=0, scorePerFood=10;

int gameStatus = 0;

int timeInterval = 200;

void gameEnd(void);

void setPosition(int x, int y)

{

COORD pos;

HANDLE hOutput;

pos.X = x;

pos.Y = y;

hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorPosition(hOutput, pos);

}

void hideCursor()

{

CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

}

void creatInterface(void)

{

int i;

for(i=0;i<58;i+=2)

{

setPosition(i,0);

printf("¡ö");//a ¡ö occupy two character space

setPosition(i,26);

printf("¡ö");

}

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

{

setPosition(0,i);

printf("¡ö");

setPosition(56,i);

printf("¡ö");

}

setPosition(65, 10);

printf("Introduction");

setPosition(63,12);

printf("¡ü\tMove up.");

setPosition(63,14);

printf("¡ý\tMove Down.");

setPosition(63,16);

printf("¡û\tMove left.");

setPosition(63,18);

printf("¡ú\tMove right.");

setPosition(63,20);

printf("F1\tSpeed up.");

setPosition(63, 22);

printf("F2\tSlow down.");

setPosition(63, 24);

printf("Space\tGame pause.");

setPosition(63,26);

printf("ESC\tQuit the game.");

setPosition(63, 4);

printf("Score:");

setPosition(63, 6);

printf("Score Per Food:");

}

void initializeSnake(void)

{

Snake *pTail;

int i;

pTail = (Snake *)malloc(sizeof(Snake));

pTail->x = 24;

pTail->y = 5;

pTail->next = NULL;

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

{

pHead = (Snake *)malloc(sizeof(Snake));

pHead->next = pTail;

pHead->x = 24 + 2*i;

pHead->y = 5;

pTail = pHead;//Important

}

while (pTail != NULL)

{

setPosition(pTail->x, pTail->y);

printf("¡ö");

pTail = pTail->next;

}

}

int biteSelf(void)

{

Snake *pSelf = pHead->next;

while (pSelf != NULL)

{

if (pHead->x==pSelf->x && pHead->y==pSelf->y)

{

return 1;

}

pSelf = pSelf->next;

}

return 0;

}

void creatFood(void)

{

int flag = 0;

X = Y = 4;

srand((unsigned)time(NULL));

do{

X = rand()%52 + 2;

Y = rand()%24 + 1;

if (X%2 != 0)

{

flag = 1;

}

else

{

flag = 0;

}//Important

pBody = pHead;

while (pBody->next != NULL)

{

if(pBody->x==X && pBody->y==Y)

{

flag = 1;

}

pBody = pBody->next;

}

}while(flag==1);

setPosition(X, Y);

printf("¡ö");

}

void hitWall(void)

{

if (pHead->x==0 || pHead->x>=56 || pHead->y==0 || pHead->y>=26)

{

gameStatus = 1;

gameEnd();

}

}

void snakeMove(void)

{

Snake *pNextHead;

hitWall();

pNextHead = (Snake *)malloc(sizeof(Snake));

pNextHead->next = pHead;

switch(Direction)

{

case Up:

pNextHead->x = pHead->x;

pNextHead->y = pHead->y - 1;

break;

case Down:

pNextHead->x = pHead->x;

pNextHead->y = pHead->y + 1;

break;

case Right:

pNextHead->x = pHead->x + 2;

pNextHead->y = pHead->y;

break;

case Left:

pNextHead->x = pHead->x - 2;

pNextHead->y = pHead->y;

break;

default:

break;

}

pHead = pNextHead;

pBody = pHead;

if (pNextHead->x == X && pNextHead->y == Y)

{

while (pBody != NULL)

{

setPosition(pBody->x, pBody->y);

printf("¡ö");

pBody = pBody->next;

}

score += scorePerFood;

creatFood();

}

else

{

setPosition(pBody->x, pBody->y);

printf("¡ö");

while (pBody->next->next != NULL)

{

pBody = pBody->next;

}

setPosition(pBody->next->x, pBody->next->y);

printf(" ");

free(pBody->next);

pBody->next = NULL;

}

if (biteSelf() == 1)

{

gameStatus = 2;

gameEnd();

}

}

void pause(void)

{

while(1)

{

Sleep(300);

if(GetAsyncKeyState(VK_SPACE))

{

break;

}

}

}

void gameCircle(void)

{

Direction = Right;

while (1)

{

setPosition(72, 4);

printf("%d", score);

setPosition(80, 6);

printf("%d ", scorePerFood);//Attention space is needed

if (GetAsyncKeyState(VK_UP) && Direction!=Down)

{

Direction = Up;

}

else if (GetAsyncKeyState(VK_DOWN) && Direction!=Up)

{

Direction = Down;

}

else if (GetAsyncKeyState(VK_LEFT) && Direction!=Right)

{

Direction = Left;

}

else if (GetAsyncKeyState(VK_RIGHT) && Direction!=Left)

{

Direction = Right;

}

else if (GetAsyncKeyState(VK_SPACE))

{

pause();

}

else if (GetAsyncKeyState(VK_ESCAPE))

{

gameStatus = 3;

break;

}

else if (GetAsyncKeyState(VK_F1))

{

if(timeInterval >= 70)

{

timeInterval -= 60;

}

}

else if (GetAsyncKeyState(VK_F2))

{

if (timeInterval <= 400)

{

timeInterval += 60;

}

}

switch (timeInterval)

{

case 20: scorePerFood = 20;break;

case 80: scorePerFood = 15;break;

case 140: scorePerFood = 12;break;

case 200: scorePerFood = 10;break;

case 260: scorePerFood = 8;break;

case 320: scorePerFood = 6;break;

case 380: scorePerFood = 4;break;

case 440: scorePerFood = 2;break;

default: scorePerFood = 0;break;

}

Sleep(timeInterval);

snakeMove();

}

}

void welcomePage(void)

{

setPosition(35,2);

printf("Welcome to Snake");

setPosition(15, 5);

printf("Rules:");

setPosition(15, 7);

printf("1. Use ¡ü.¡ý.¡û.¡ú to control the movement of the Snake.");

setPosition(15, 9);

printf("2. Biting the snake itself is forbidden.");

setPosition(15, 11);

printf("3. Hit the wall is forbidden.");

setPosition(15, 13);

printf("Developeder: zhaoyu.");

setPosition(15, 15);

printf("Blog: http://blog.csdn.net/sinat_30046339");

setPosition(28, 23);

printf("Press any key to continue...");

setPosition(0, 28);

getchar();

system("cls");

}

void gameEnd(void)

{

system("cls");

setPosition(32, 10);

switch(gameStatus)

{

case 1:

printf("You hit the wall!");

break;

case 2:

printf("You bit yourself!");

break;

case 3:

printf("You chose to end the game.");

break;

default:

break;

}

setPosition(32, 14);

printf("Your final score is %d", score);

getchar();

setPosition(0, 25);

exit(0);

}

void gameStart(void)

{

system("mode con cols=100 lines=30");//no space around equal sign

welcomePage();

creatInterface();

initializeSnake();

creatFood();

}

//Main Function

int main(void)

{

hideCursor();

gameStart();

gameCircle();

gameEnd();

return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值