贪吃蛇

来源:互联网 发布:win7虚拟光驱软件下载 编辑:程序博客网 时间:2024/04/25 07:07

#include "graphics.h"
#include "stdio.h"

#define MAX 200
#define MAXX 30
#define MAXY 30

#define UP    18432
#define DOWN  20480
#define LEFT  19200
#define RIGHT 19712
#define ESC   283
#define ENTER 7181
#define PAGEUP   18688
#define PAGEDOWN 20736
#define KEY_U    5749
#define KEY_K    9579
#define CTRL_P   6512
#define TRUE  1
#define FALSE 0
#define GAMEINIT  1
#define GAMESTART  2
#define GAMEHAPPY 3
#define GAMEOVER  4

struct SPlace
{
int x;
int y;
int st;
} place[MAX];
int speed;
int count;
int score;
int control;
int head;
int tear;
int x,y;
int babyx,babyy;
int class;
int eat;
int game;
int gamedelay[]={5000,4000,3000,2000,1000,500,250,100};
int gamedelay2[]={1000,1};
static int hitme=TRUE,hit = TRUE;
void init(void);
void nextstatus(void);
void draw(void);

void init(void)
{
int i;
for(i=0;i<MAX;i++)
{
   place[i].x  = 0;
   place[i].y  = 0;
   place[i].st = FALSE;
}
   place[0].st = TRUE;
   place[1].st = TRUE;
   place[1].x  = 1;
   speed = 9;
   count = 0;
   score = 0;
   control = 4;
   head = 1;
   tear = 0;
   x = 1;
   y = 0;
   babyx = rand()%MAXX;
   babyy = rand()%MAXY;
   eat = FALSE;
   game = GAMESTART;
}
void nextstatus(void)
{
int i;
int exit;
int xx,yy;
xx = x;
yy = y;
   switch(control)
   {
   case 1: y--; yy = y-1; break;
   case 2: y++; yy = y+1; break;
   case 3: x--; xx = x-1; break;
   case 4: x++; xx = x+1; break;
   }
   hit = TRUE;
   if ( ((control == 1) || (control ==2 )) && ( (y < 1) ||(y >= MAXY-1)) ||
 (((control == 3) || (control == 4)) && ((x < 1) ||(x >= MAXX-1) ) ) )
      {
      hit = FALSE;
      }

      if ( (y < 0) ||(y >= MAXY) ||
 (x < 0) ||(x >= MAXX) )
      {
      game = GAMEOVER;
      control = 0;
      return;
      }
   for (i = 0; i < MAX; i++)
   {
     if ((place[i].st) &&
        (x == place[i].x) &&
        (y == place[i].y) )
 {
        game = GAMEOVER;
        control = 0;
 return;
 }
     if ((place[i].st) &&
 (xx == place[i].x) &&
 (yy == place[i].y) )
 {
 hit = FALSE;
 goto OUT;
 }

   }
OUT:
   if ( (x == babyx) && (y == babyy) )
   {
      eat = TRUE;
      count ++;
      score += (1+class) * 10;
   }

   head ++;
   if (head >= MAX) head = 0;
   place[head].x = x;
   place[head].y = y;
   place[head].st= TRUE;
   if (eat == FALSE)
   {
      place[tear].st = FALSE;
      tear ++;
      if (tear >= MAX) tear = 0;
   }
   else
   {
      eat = FALSE;
      exit = TRUE;
      while(exit)
      {
      babyx = rand()%MAXX;
      babyy = rand()%MAXY;
      exit = FALSE;
      for( i = 0; i< MAX; i++ )
  if( (place[i].st)&&( place[i].x == babyx) && (place[i].y == babyy))
     exit ++;
      }

   }
   if (head == tear) game = GAMEHAPPY;

}
void draw(void)
{
   char temp[50];
   int i,j;
   for (i = 0; i < MAX; i++ )
   {
      setfillstyle(1,9);
      if (place[i].st)
  bar(place[i].x*15+1,place[i].y*10+1,place[i].x*15+14,place[i].y*10+9);
   }
   setfillstyle(1,4);
   bar(babyx*15+1,babyy*10+1,babyx*15+14,babyy*10+9);
   setcolor(8);
   setfillstyle(1,8);
   bar(place[head].x*15+1,place[head].y*10+1,place[head].x*15+14,place[head].y*10+9);
/*   for( i = 0; i <= MAXX; i++ )
      line( i*15,0, i*15, 10*MAXY);
   for( j = 0; j <= MAXY; j++ )
      line( 0, j*10, 15*MAXX, j*10);
*/
   rectangle(0,0,15*MAXX,10*MAXY);
   sprintf(temp,"Count: %d",count);
   settextstyle(1,0,2);
   setcolor(8);
   outtextxy(512,142,temp);
   setcolor(11);
   outtextxy(510,140,temp);
   sprintf(temp,"1P: %d",score);
   settextstyle(1,0,2);
   setcolor(8);
   outtextxy(512,102,temp);
   setcolor(12);
   outtextxy(510,100,temp);
   sprintf(temp,"Class: %d",class);
   setcolor(8);
   outtextxy(512,182,temp);
   setcolor(11);
   outtextxy(510,180,temp);
}
main()
{
int pause = 0;
char temp[50];
int d,m;
int key;
int p;
static int keydown = FALSE;
int exit = FALSE;
int stchange = 0;
d = VGA;
m = VGAMED;
initgraph( &d, &m, "" );
setbkcolor(3);
class = 3;
init();
p = 1;
while(!exit)
{
if (kbhit())
{
   key = bioskey(0);
   switch(key)
   {
   case UP: if( (control != 2)&& !keydown)
  control = 1;
  keydown = TRUE;
  break;
   case DOWN: if( (control != 1)&& !keydown)
  control = 2;
  keydown = TRUE;
  break;
   case LEFT: if( (control != 4)&& !keydown)
  control = 3;
  keydown = TRUE;
  break;
   case RIGHT: if( (control != 3)&& !keydown)
  control = 4;
  keydown = TRUE;
  break;
   case ESC: exit = TRUE;break;
   case ENTER: init();break;
   case PAGEUP: class --; if (class<0) class = 0; break;
   case PAGEDOWN: class ++;if (class>7) class = 7; break;
   case KEY_U: if( ( (control ==1) ||(control ==2))&& !keydown)
     control = 3;
        else if(( (control == 3) || (control == 4))&& !keydown)
     control = 1;
        keydown = TRUE;
        break;
   case KEY_K: if( ( (control ==1) ||(control ==2))&& !keydown)
     control = 4;
        else if(( (control == 3) || (control == 4))&& !keydown)
     control = 2;
        keydown = TRUE;
        break;
   case CTRL_P:pause = 1 - pause; break;
   }
}
stchange ++ ;
putpixel(0,0,0);
if (stchange > gamedelay[class] + gamedelay2[hit])
   {
   stchange = 0;
   keydown = FALSE;
   p = 1 - p;
   setactivepage(p);
   cleardevice();
   if (!pause)
      nextstatus();
   else
   {
      settextstyle(1,0,4);
      setcolor(12);
      outtextxy(250,100,"PAUSE");
   }
   draw();

   if(game==GAMEOVER)
   {
   settextstyle(0,0,6);
   setcolor(8);
   outtextxy(101,101,"GAME OVER");
   setcolor(15);
   outtextxy(99,99,"GAME OVER");
   setcolor(12);
   outtextxy(100,100,"GAME OVER");
   sprintf(temp,"Last Count: %d",count);
   settextstyle(0,0,2);
   outtextxy(200,200,temp);
   }

   if(game==GAMEHAPPY)
   {
   settextstyle(0,0,6);
   setcolor(12);
   outtextxy(100,300,"YOU WIN");
   sprintf(temp,"Last Count: %d",count);
   settextstyle(0,0,2);
   outtextxy(200,200,temp);
   }
   setvisualpage(p);
   }
}
closegraph();
}


 

原创粉丝点击