天天看點

C語言課程設計 貪吃蛇代碼

#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=50000;/*遊戲速度自己調整*/

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

繼續閱讀