您的位置:首页 > 其它

贪吃蛇源码

2006-05-08 23:52 302 查看
去年五一写的一个贪吃蛇游戏,在TC3下运行成功,过几天加点注释~~   大家先凑和看吧...HOHO....

 

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <conio.h>
#include <graphics.h>
#define VK_ESC 0x11b
#define VK_UP 0x4800
#define VK_DOWN 0x5000
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define TIMER 0x1c
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif

int TimerCounter=0;
typedef struct  {
   int x,y,di,length,isdrawed;
   }snakenode,*snakelink;
typedef struct {
   int x,y;
   }beandef,*beanlink;

void initsnake(snakelink,beanlink);
void showsnake(snakelink,beanlink);
void randbean(beanlink);
void snakedeath(int);
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt newhandler(__CPPARGS)
{
TimerCounter++;
oldhandler();
}
void SetTimer(void interrupt (*IntProc)(__CPPARGS))
{
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
void KillTimer()
{
disable();
setvect(TIMER,oldhandler);
enable();
}

void main(void)
{
    int key,time=0;
    int gdriver = VGA, gmode=VGAHI, errorcode;
    char *bgifile="";                                                            //注意:图形文件的路径要改
    snakenode snode[61];
    beandef bean={0,0};
    SetTimer(newhandler);
    initgraph(&gdriver, &gmode, bgifile);
    errorcode = graphresult();
    if (errorcode != grOk)
    {
       printf("Graphics error: %sn", grapherrormsg(errorcode));
       printf("Press any key to halt:");
       getch();
       exit(1);
    }

    setbkcolor(1);
    // outtextxy(1,1,"You canceled!!  Thanks for playing!!");
    outtextxy(230,200,"Press key to Start Snake!");
    getchar();
    setcolor(1);
    outtextxy(230,200,"Press key to Start Snake!");
    initsnake(snode,&bean);
    setcolor(5);
    showsnake(snode,&bean);
    while(1)
    {
 if (bioskey(1))
 {
  key=bioskey(0);
  switch(key)
  {
     case VK_ESC:
        snakedeath(0);
     case VK_LEFT:
        if(3!=snode[0].di)
        snode[0].di=1;
        break;
     case VK_UP:
        if(4!=snode[0].di)
        snode[0].di=2;
        break;
     case VK_RIGHT:
        if(1!=snode[0].di)
        snode[0].di=3;
        break;
     case VK_DOWN:
        if(2!=snode[0].di)
        snode[0].di=4;
        break;
  }

 }
 if (TimerCounter>2)
 {
     TimerCounter=0;
     showsnake(snode,&bean);
 }
    }
KillTimer();
closegraph();
}

void initsnake(snakelink snode,beanlink bean)
{
   int i;
   for(i=0;i<4;i++)
   {
      snode[i].x=320+i*10;
      snode[i].y=240;
      snode[i].di=1;
      snode[i].length=4;
      snode[i].isdrawed=0;
   }
   randbean(bean);
   for(i=0;i<15;i++)
   {
       setcolor(i);
       rectangle(0+i,0+i,640-i,480-i);
       line(480-i,15,480-i,465);
   }
   setcolor(12);
   outtextxy(510,45,"SNAKE v1.0");
   setcolor(11);
   rectangle(508,43,590,53);
   setcolor(6);
   outtextxy(485,85,"Design by Gabriel");
   outtextxy(540,100,"BNU");
   outtextxy(490,180,"Snake Length:");

}

void showsnake(snakelink snode,beanlink bean)
{
   int i,lx,ly;
   static int len=3;
   static char num[3]=" 4";
   lx=snode[snode[0].length-1].x;ly=snode[snode[0].length-1].y;
   if(len!=snode[0].length)
   {
      setcolor(1);
      outtextxy(600,180,num);
      len++;
      sprintf(num,"%2d",snode[0].length);
      setcolor(2);
      outtextxy(600,180,num);
      if(snode[0].length==60) snakedeath(3);
   }
   for(i=snode[0].length-1;i>0;i--)
   {
      snode[i].x=snode[i-1].x;
      snode[i].y=snode[i-1].y;
   }
   switch(snode[0].di)
   {
       case 1:
   snode[0].x-=10;
   break;
       case 2:
   snode[0].y-=10;
   break;
       case 3:
   snode[0].x+=10;
   break;
       case 4:
   snode[0].y+=10;
   break;
   }
    if(snode[0].x<=15||snode[0].x>=465||snode[0].y<=15||snode[0].y>=465) snakedeath(1);

   for(i=0;i<snode[0].length;i++)
   {
      if(i==0) setcolor(3);//bar(snode[i].x-4,snode[i].y-4,snode[i].x+4,snode[i].y+4);
  else setcolor(5);
      rectangle(snode[i].x-4,snode[i].y-4,snode[i].x+4,snode[i].y+4);
      if(i==1) snode[i].di=snode[0].di;
   }
   if(bean->x*10==snode[0].x&&bean->y*10==snode[0].y)
      {
  setcolor(1);
  circle(bean->x*10,bean->y*10,3);
  randbean(bean);
  snode[snode[0].length].x=lx;
  snode[snode[0].length].y=ly;
  snode[snode[0].length].di=snode[snode[0].length-1].di;
  snode[0].length++;
      }
   else
   {
      setcolor(1);
      rectangle(lx-4,ly-4,lx+4,ly+4);
   }
   for(i=1;i<snode[0].length-1;i++)
      if(snode[0].x==snode[i].x&&snode[0].y==snode[i].y) snakedeath(2);
   //setcolor(1);
   //bar(snode[1].x-4,snode[1].y-4,snode[1].x+4,snode[1].y+4);
   //if(snode[0].x<=15||snode[0].x>=465||snode[0].y<=15||snode[0].y>=465) snakedeath(1);
   setcolor(14);
   circle(bean->x*10,bean->y*10,3);
   //gotoxy(1,1);printf("<%d,%d><%d,%d>",bean->x,bean->y,snode[0].x,snode[0].y);
   setcolor(5);
}

void randbean(beanlink bean)
{
   srand((unsigned)time(NULL));
   bean->x=rand()%44+2;bean->y=rand()%44+2;
}

void snakedeath(int death)
{
  setcolor(9);
  switch(death)
  {
     case 0:
       outtextxy(500,420,"You canceled!!");
       outtextxy(490,430,  "Thx for playing!!");
       break;
     case 1:
       outtextxy(480,420,"You meet the wall!");
       break;
     case 2:
       outtextxy(480,420,"You kill yourself!");
       break;
     case 3:
       outtextxy(520,420,"You Win!!");
       break;
  }
  KillTimer();
  getchar();
  closegraph();
  exit(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bean timer struct kill 图形 up