當前位置:編程學習大全網 - 編程語言 - 求,貪吃蛇 C語言代碼 及其每壹步的講解

求,貪吃蛇 C語言代碼 及其每壹步的講解

/* 貪吃蛇程序 by champking */

#define N 200

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score = 0;/*得分*/

int gamespeed = 100000;/*遊戲速度自己調整*/

struct Food

{

int x;/*食物的橫坐標*/

int y;/*食物的縱坐標*/

int yes;/*判斷是否要出現食物的變量*/

}food;/*食物的結構體*/

struct Snake

{

int x[N];

int y[N];

int node;/*蛇的節數*/

int direction;/*蛇移動方向*/

int life;/* 蛇的生命,0活著,1死亡*/

}snake;

void Init(void);/*圖形驅動*/

void Close(void);/*圖形結束*/

void DrawK(void);/*開始畫面*/

void GameOver(void);/*結束遊戲*/

void GamePlay(void);/*玩遊戲具體過程*/

void PrScore(void);/*輸出成績*/

/*主函數*/

void main(void)

{

Init();/*圖形驅動*/

DrawK();/*開始畫面*/

GamePlay();/*玩遊戲具體過程*/

Close();/*圖形結束*/

}

/*圖形驅動*/

void Init(void)

{

int gd = DETECT, gm;

initgraph(&gd, &gm, "c:\\tc");

cleardevice();

}

/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻*/

void DrawK(void)

{

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*設置線型*/

for(i = 50; i <= 600; i += 10)/*畫圍墻*/

{

rectangle(i, 40, i + 10, 49); /*上邊*/

rectangle(i, 451, i + 10, 460);/*下邊*/

}

for(i = 40; i <= 450; i += 10)

{

rectangle(50, i, 59, i + 10); /*左邊*/

rectangle(601, i, 610, i + 10);/*右邊*/

}

}

/*玩遊戲具體過程*/

void GamePlay(void)

{

randomize();/*隨機數發生器*/

food.yes = 1;/*1表示需要出現新食物,0表示已經存在食物*/

snake.life = 0;/*活著*/

snake.direction = 1;/*方向往右*/

snake.x[0] = 100; snake.y[0] = 100;/*蛇頭*/

snake.x[1] = 110; snake.y[1] = 100;

snake.node = 2;/*節數*/

PrScore();/*輸出得分*/

while(1)/*可以重復玩遊戲,壓ESC鍵結束*/

{

while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/

{

if(food.yes == 1)/*需要出現新食物*/

{

food.x = rand() % 400 + 60;

food.y = rand() % 350 + 60;

while(food.x % 10 != 0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/

food.x++;

while(food.y % 10 != 0)

food.y++;

food.yes = 0;/*畫面上有食物了*/

}

if(food.yes == 0)/*畫面上有食物了就要顯示*/

{

setcolor(GREEN);

rectangle(food.x, food.y, food.x + 10, food.y - 10);

}

for(i = snake.node - 1; i > 0; i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵算法*/

{

snake.x[i] = snake.x[i-1];

snake.y[i] = snake.y[i-1];

}

/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/

switch(snake.direction)

{

case 1: snake.x[0] += 10; break;

case 2: snake.x[0] -= 10; break;

case 3: snake.y[0] -= 10; break;

case 4: snake.y[0] += 10; break;

}

for(i = 3; i < snake.node; i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/

{

if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])

{

GameOver();/*顯示失敗*/

snake.life = 1;

break;

}

}

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到墻壁*/

{

GameOver();/*本次遊戲結束*/

snake.life=1; /*蛇死*/

}

if(snake.life == 1)/*以上兩種判斷以後,如果蛇死就跳出內循環,重新開始*/

break;

if(snake.x[0] == food.x && snake.y[0] == food.y)/*吃到食物以後*/

{

setcolor(0);/*把畫面上的食物東西去掉*/

rectangle(food.x, food.y, food.x + 10, food.y - 10);

snake.x[snake.node] =- 20; snake.y[snake.node] =- 20;

/*新的壹節先放在看不見的位置,下次循環就取前壹節的位置*/

snake.node++;/*蛇的身體長壹節*/

food.yes = 1;/*畫面上需要出現新的食物*/

score += 10;

PrScore();/*輸出新得分*/

}

setcolor(4);/*畫出蛇*/

for(i = 0; i < snake.node; i++)

rectangle(snake.x[i], snake.y[i], snake.x[i] + 10,

snake.y[i] - 10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最後壹節*/

rectangle(snake.x[snake.node-1], snake.y[snake.node-1],

snake.x[snake.node-1] + 10, snake.y[snake.node - 1] - 10);

} /*endwhile(!kbhit)*/

if(snake.life == 1)/*如果蛇死就跳出循環*/

break;

key = bioskey(0);/*接收按鍵*/

if(key == ESC)/*按ESC鍵退出*/

break;

else

if(key == UP&&snake.direction!=4)

/*判斷是否往相反的方向移動*/

snake.direction=3;

else

if(key == RIGHT &&snake.direction != 2)

snake.direction=1;

else

if(key == LEFT && snake.direction != 1)

snake.direction = 2;

else

if(key == DOWN && snake.direction != 3)

snake.direction = 4;

}/*endwhile(1)*/

}

/*遊戲結束*/

void GameOver(void)

{

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0, 0, 4);

outtextxy(200, 200, "GAME OVER");

getch();

}

/*輸出成績*/

void PrScore(void)

{

char str[10];

setfillstyle(SOLID_FILL, YELLOW);

bar(50, 15, 220, 35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str, "score:%d", score);

outtextxy(55, 20, str);

}

/*圖形結束*/

void Close(void)

{

getch();

closegraph();

}

  • 上一篇:六年級日記
  • 下一篇:有哪些獲獎音樂?
  • copyright 2024編程學習大全網