正文

TC2.0环境下的贪食蛇!!2004-12-24 17:15:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/book/34.html

分享到:

#include<graphics.h>
#include<conio.h>
#include<dos.h>
#include<malloc.h>
#include<math.h>
/**********/
#define PATH "D:\\学习\\turboc2" /*你的TC安装目录*/
#define BK 7
#define DC 8
#define LC 15
#define P1 1
#define P2 4
#define X  41
#define Y  41
#define M  22
#define SX 490
#define SY1 50
#define SY2 107
#define HJ 32
#define TX 410
#define TY 160
/************/
int newmap[M][M] ={
                     {1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1},

                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},

                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},

                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},

                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},

                     {1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1},
                                                                       };
        /*****************************************************************/

int overmap[M][M] ={
                     {1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},

                     {1, 0,1,1,0,0,0,1,1,0,0,1,0,0,0,1,0,1,1,1,1, 1},
                     {1, 1,0,0,1,0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0, 1},
                     {1, 1,0,0,0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0, 1},
                     {1, 1,0,1,1,0,1,1,1,1,0,1,0,1,0,1,0,1,1,1,0, 1},
                     {1, 1,0,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0, 1},
                     {1, 1,0,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0, 1},
                     {1, 0,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,1,1, 1},

                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},

                     {1, 0,1,1,0,0,1,0,0,0,1,0,1,1,1,1,0,1,1,1,0, 1},
                     {1, 1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1, 1},
                     {1, 1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1, 1},
                     {1, 1,0,0,1,0,1,0,0,0,1,0,1,1,1,0,0,1,1,1,0, 1},
                     {1, 1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0, 1},
                     {1, 1,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0, 1},
                     {1, 0,1,1,0,0,0,0,1,0,0,0,1,1,1,1,0,1,0,0,1, 1},

                     {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1},
                     {1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1},
                                                                       };

int bmp[20][20]={{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
                 {0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,0},
                 {1,1,1,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,1,1},
                 {1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1},
                 {1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1},
                 {1,0,0,0,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,1},
                 {1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1},
                 {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
                 {1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1},
                 {1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1},

                 {1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1},
                 {1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1},
                 {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
                 {1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1},
                 {1,0,0,0,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,1},
                 {1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1},
                 {1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1},
                 {1,1,1,0,0,0,1,1,0,0,0,0,1,1,0,0,0,1,1,1},
                 {0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,0},
                 {0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}};

int map[2][M][M];
int nextx,nexty;
int score=3,level=0,dirx=0,diry=1;
int bady[400][2];

char * bit[3],*sim;
/************/
int getkey();
void edge(int l,int t,int r,int b,int c1,int c2);
void init();
void draw(int x,int y,int c);
void show();
void close();
void go();
void over();
void add();
void showscore();
/**************/
int getkey()
{
char ch=0;
if(kbhit())
   ch=getch();
return(ch);
}

/************/
void init()
{
  int gdriver=DETECT,gmode;
  int size,i,j;
  registerbgidriver(EGAVGA_driver);
  initgraph(&gdriver,&gmode,PATH);
  setbkcolor(BK);
  setfillstyle(11,8);
  edge(X-9,Y-9,X+568,Y+408,DC,DC);
  floodfill(1,1,DC);
  edge(X-9,Y-9,X+568,Y+408,LC,DC);

  edge(X-1,Y-1,X+400,Y+400,DC,LC);

  size=imagesize(X+1,Y+1,X+20,Y+20);
  bit[0]=(char *)malloc(size);

  if(bit[0]==NULL){printf("\n\nERROR!!");getch();exit(1);}

  getimage(X+1,Y+1,X+20,Y+20,bit[0]);

  for(i=0;i<20;i++)
     for(j=0;j<20;j++)
        if(bmp[i][j]==1)
            putpixel(X+1+j,Y+1+i,P1);
  bit[1]=(char*)malloc(size);

  if(bit[1]==0){printf("\n\nERROR!!");getch();exit(1);}

  getimage(X+1,Y+1,X+20,Y+20,bit[1]);

  for(i=0;i<20;i++)
     for(j=0;j<20;j++)
        if(bmp[i][j]==1)
            putpixel(X+1+j,Y+1+i,P2);
  bit[2]=(char*)malloc(size);
  if(bit[2]==0){printf("\n\nERROR!!");getch();exit(1);}

getimage(X+1,Y+1,X+20,Y+20,bit[2]);

size=imagesize(X+240,Y+107,X+290,Y+122);
sim=(char *)malloc(size);
if(sim==0){printf("\n\nERROR!!");getch();exit(1);}
getimage(X+440,Y+107,X+490,Y+122,sim);

if(bit[0]==0||bit[1]==0||bit[2]==0||sim==0)
{
   close();
   exit(1);
}
  putimage(X+1,Y+1,bit[0],0);

edge(X+TX-3,Y+TY+19,X+TX+150,Y+TY+210,DC,LC);
setcolor(LC);
outtextxy(X+TX,Y+TY+5,     "Control Options:");

outtextxy(X+TX,Y+TY+HJ*1," [P]--Start/Pause");
outtextxy(X+TX,Y+TY+HJ*2," [W]--Up");
outtextxy(X+TX,Y+TY+HJ*3," [S]--Down");
outtextxy(X+TX,Y+TY+HJ*4," [A]--Left");
outtextxy(X+TX,Y+TY+HJ*5," [D]--Right");
outtextxy(X+TX,Y+TY+HJ*6," [ESC]--Quit");


setcolor(DC);
outtextxy(X+TX-1,Y+TY+4,"Control Options:");
outtextxy(X+TX-1,Y+TY+HJ*1-1," [P]--Start/Pause");
outtextxy(X+TX-1,Y+TY+HJ*2-1," [W]--Up");
outtextxy(X+TX-1,Y+TY+HJ*3-1," [S]--Down");
outtextxy(X+TX-1,Y+TY+HJ*4-1," [A]--Left");
outtextxy(X+TX-1,Y+TY+HJ*5-1," [D]--Right");
outtextxy(X+TX-1,Y+TY+HJ*6-1," [ESC]--Quit");
outtextxy(X+TX-2,Y+TY+HJ*7,"  [11#522] Jackin");
showscore();

}
/*************/
void edge(int l,int t,int r,int b,int c1,int c2)
{
  int cl=getcolor();
  setcolor(c1);
  line(l,t,r-1,t);
  line(l,t,l,b-1);
  setcolor(c2);
  line(r,t,r,b);
  line(l,b,r,b);
  setcolor(cl);
}
/*************/
void draw(int x,int y,int c)
{
  putimage(X+20*(y-1),Y+(x-1)*20,bit[c],0);
}
/************/
void show()
{
  int i,j;


  for(i=1;i<M-1;i++)
     for(j=1;j<M-1;j++)
    if(map[1][i][j]!=map[0][i][j])
        {
           map[0][i][j]=map[1][i][j];
           draw(i,j,map[1][i][j]);
        }

}
/******************/
void close()
{
  int i;
  for(i=0;i<3;i++)
    if(bit[i]!=0)
     free(bit[i]);
  closegraph();
}
/**************/
void new()
{
  int i,j;

  for(i=0;i<M;i++)
     for(j=0;j<M;j++)
     {
        map[1][i][j]=newmap[i][j];
    map[0][i][j]=3;
     }
  score=3;
  dirx=0;diry=1;
  bady[0][0]=20;bady[0][1]=3;
  bady[1][0]=20;bady[1][1]=2;
  bady[2][0]=20;bady[2][1]=1;

  for(i=0;i<score;i++)
     map[1][bady[i][0]][bady[i][1]]=1;

  nextx=rand()%(M-2);
  nexty=rand()%(M-2);
  map[1][nextx+1][nexty+1]=2;
}
/**********/
void newk()
{
  for(;map[1][nextx+1][nexty+1]!=0;)
  {
     nextx=rand()%(M-2);
     nexty=rand()%(M-2);
  }
  map[1][nextx+1][nexty+1]=2;
  show();
}
/*************/
void go()
{
  int i;
  map[1][bady[score-1][0]][bady[score-1][1]]=0;
  for(i=score-1;i>0;i--)
  {
     bady[i][0]=bady[i-1][0];
     bady[i][1]=bady[i-1][1];
  }
  bady[0][0]+=dirx;
  bady[0][1]+=diry;
  map[1][bady[0][0]][bady[0][1]]=1;
}
/**************/
void over()
{
  int i,j;
  for(i=1;i<M-1;i++)
  {
     for(j=1;j<M-1;j++)
    map[1][i][j]=overmap[i][j];
     delay(5000);
     show();
  }
}
/*****************/
void add()
{
  int i;
  map[1][bady[0][0]+dirx][bady[0][1]+diry]=1;
  for(i=score;i>0;i--)
  {
     bady[i][0]=bady[i-1][0];
     bady[i][1]=bady[i-1][1];
  }
  bady[0][0]+=dirx;
  bady[0][1]+=diry;
  score++;
  level=(score-3)/5;
}
/********************/
void showscore()
{

  char s[20],l[20];
  itoa(score-3,s,10);
  itoa(level,l,10);
  setcolor(4);
  outtextxy(X+SX-55,Y+SY1+4,"SCORE");
  edge(X+SX-1,Y+SY1-1,X+SX+51,Y+SY1+16,DC,LC);
  outtextxy(X+SX-55,Y+SY2+4,"LEVEL");
  edge(X+SX-1,Y+SY2-1,X+SX+51,Y+SY2+16,DC,LC);
  putimage(X+SX,Y+SY1,sim,0);
  putimage(X+SX,Y+SY2,sim,0);
  outtextxy(X+SX+1,Y+SY1+4,s);
  outtextxy(X+SX+1,Y+SY2+4,l);
}

/*******************/

main()
{
  int i,j;
  char cc,c;
  init();

start:
  cc=getkey();
  for(;cc!='p'&&cc!='P';)
  {
     rand();
     if(cc==27)goto end;
     cc=getkey();
  }

  new();
  show();
  showscore();
  for(;;)
  {
    for(i=0,cc=0;i<1500-level*50;i++)
    {
      c=getkey();
      if(c!=0)
    cc=c;
      delay(10);
    }
    switch(cc)
    {
      case 27:  over();
        goto end;
                break;
      case 'w':
      case 'W':
                if(dirx!=1)
                {
                   dirx=-1;
           diry=0;
        }

                break;
      case 'a':
      case 'A':
        if(diry!=1)
                {
                   diry=-1;
           dirx=0;
        }

                break;
      case 's':
      case 'S':
        if(dirx!=-1)
                {
                   dirx=1;
           diry=0;
        }

                break;
      case 'd':
      case 'D':

        if(diry!=-1)
                {
                   diry=1;
           dirx=0;
        }

                break;
      case ' ':

        break;
      case 'p':
      case 'P':
        cc=getkey();
                for(;cc!='p'&&cc!='P';)
                {
                   if(cc==27)goto end;
                   cc=getkey();
                }
        break;
      default:break;
     }/*end switch*/

     switch(map[1][bady[0][0]+dirx][bady[0][1]+diry])
     {
      case 1:
             over();
             goto start;
      case 2:
         add();
         showscore();
         newk();
             break;
      case 0:
        go();
            break;
      default:break;
     }
     show();
   }
end:
  close();
}

阅读(3329) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册