贪吃蛇 第二个C游戏

TC下运行



#include <graphics.h>  

#include <stdlib.h>  #include <stdio.h>  #include<math.h>  #include<dos.h>  #include<alloc.h> 

#define K 10     /* 边框一格的长度 */ #define up 0x4800    /* 下面是定义各个键盘扫描码的宏 用bioskey捕获按键值实现 */ #define down 0x5000  #define left 0x4b00  #define right 0x4d00  #define esc 0x011b  #define Y 0x1579  #define n 0x316e  #define speed 0x1f73  /* 这个是为了调式方便设的调速度用的,即s键的键盘扫描码的*/   typedef struct node  /* 转弯点 */  {      int d;   /* 方向 */      int x;   /* 座标 */      int y;      struct node *next; /* 下一个转弯点 */  }QueueNode;  typedef struct queue  /* 转向队列 */ {      QueueNode *front;  /* 尾方向节点 */     QueueNode *rear;   /* 头方向节点*/ }LinkQueue;  struct snake  /* 蛇链 */ {      int x1;  /* 蛇头座标 */      int y1;      int x2;  /* 蛇尾座标 */      int y2;      int node; /* 蛇长 节点数*/      LinkQueue direction;/* 节点方向 */      int life; /* 生命 是否死亡 */  }snake;  typedef QueueNode  *link;    int x0,y0,k,s,t,max_score;/* x0,y0 随机食物座标,k控制产生食物,s控制速度,t防止吃到食物没产生新食物之前被打断,max_score保存最高记录 */     /* 点阵字体 是用工具生成,可以略过……*/  char tan48H[]={  0x00,0xE0,0x00,0x00,0x00,0x00,  0x01,0xF0,0x00,0x00,0x00,0x00,  0x03,0x98,0x00,0x00,0x00,0x00,  0x07,0x0C,0x00,0x00,0x00,0x00,  0x0E,0x67,0x00,0x00,0x00,0x00,  0x7C,0x63,0xE0,0x00,0x00,0x00,  0x77,0xFC,0xE0,0x00,0x00,0x00,  0x07,0xFC,0x00,0x00,0x00,0x00,    0x00,0x18,0x00,0x00,0x00,0x00,  0x0F,0xFF,0x00,0x00,0x00,0x00,  0x0F,0xFF,0x00,0x00,0x00,0x00,  0x0C,0x03,0x00,0x00,0x00,0x00,    0x0C,0x63,0x00,0x00,0x00,0x00,  0x0C,0xE3,0x00,0x00,0x00,0x00,  0x0D,0xDB,0x00,0x00,0x00,0x00,  0x03,0x9E,0x00,0x00,0x00,0x00,    0x1F,0x0F,0x80,0x00,0x00,0x00,  0x1E,0x03,0x80,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00  };  char chi48H[]={  0x00,0x18,0x00,0x00,0x00,0x00,  0x00,0x18,0x00,0x00,0x00,0x00,  0x3F,0x18,0x00,0x00,0x00,0x00,  0x3F,0x3F,0xE0,0x00,0x00,0x00,    0x33,0x3F,0xE0,0x00,0x00,0x00,  0x33,0x60,0x00,0x00,0x00,0x00,  0x33,0xC0,0x00,0x00,0x00,0x00,  0x33,0xBF,0x80,0x00,0x00,0x00,    0x33,0x3F,0x80,0x00,0x00,0x00,  0x33,0x06,0x00,0x00,0x00,0x00,  0x33,0x0C,0x00,0x00,0x00,0x00,  0x3F,0x18,0x00,0x00,0x00,0x00,    0x3F,0x30,0x00,0x00,0x00,0x00,  0x33,0x60,0x00,0x00,0x00,0x00,  0x33,0x60,0x60,0x00,0x00,0x00,  0x30,0x60,0x60,0x00,0x00,0x00,    0x00,0x3F,0xE0,0x00,0x00,0x00,  0x00,0x1F,0xC0,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00  };  char she48H[]={  0x0C,0x0C,0x00,0x00,0x00,0x00,  0x0C,0x0E,0x00,0x00,0x00,0x00,  0x0C,0x06,0x00,0x00,0x00,0x00,  0x0C,0x7F,0xE0,0x00,0x00,0x00,    0x7F,0xFF,0xE0,0x00,0x00,0x00,  0x7F,0xE0,0x60,0x00,0x00,0x00,  0x6D,0xE0,0x60,0x00,0x00,0x00,  0x6D,0x8C,0x00,0x00,0x00,0x00,    0x6D,0x8C,0x00,0x00,0x00,0x00,  0x7F,0x8C,0xC0,0x00,0x00,0x00,  0x7F,0x8F,0xC0,0x00,0x00,0x00,  0x6D,0x8F,0x00,0x00,0x00,0x00,    0x6C,0x0C,0x00,0x00,0x00,0x00,  0x0D,0x8C,0x00,0x00,0x00,0x00,  0x0F,0xCC,0x60,0x00,0x00,0x00,  0x7F,0xCC,0x60,0x00,0x00,0x00,    0x78,0xCF,0xE0,0x00,0x00,0x00,  0x00,0x07,0xC0,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00  };    char zuo16H[]={    0x18,0xC0,0x18,0xC0,0x19,0x80,0x31,0xFE,    0x33,0xFE,0x76,0xC0,0xF0,0xFC,0xB0,0xFC,    0x30,0xC0,0x30,0xC0,0x30,0xFE,0x30,0xFE,    0x30,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,  };  char zhe16H[]={    0x03,0x00,0x03,0x0C,0x1F,0xCC,0x1F,0xD8,    0x03,0x30,0xFF,0xFE,0xFF,0xFE,0x03,0x00,    0x0F,0xF8,0x3F,0xF8,0xEC,0x18,0xCF,0xF8,    0x0C,0x18,0x0F,0xF8,0x0F,0xF8,0x00,0x00,  };  char mh16H[]={  0x00,0x00,  0x00,0x00,  0x00,0x00,  0x00,0x00,    0x00,0x00,  0x00,0x00,  0x00,0x00,  0x00,0x00,    0x30,0x00,  0x30,0x00,  0x00,0x00,  0x00,0x00,    0x30,0x00,  0x30,0x00,  0x00,0x00,  0x00,0x00  };    char zhao16H[]={  0x0C,0x00,  0x0C,0x0C,  0x7F,0x8C,  0x7F,0xCC,    0x0C,0x6C,  0x0C,0x38,  0xFF,0x98,  0xFF,0xB8,    0x0C,0x38,  0x6F,0x6C,  0x6F,0xCC,  0x7C,0x84,    0x7C,0x00,  0xCF,0xFE,  0x87,0xFE,  0x00,0x00  };  char peng16H[]={  0x00,0x30,  0x77,0x7C,  0x77,0x7C,  0x55,0x64,    0x55,0x7C,  0x77,0x64,  0x55,0x6C,  0x55,0x60,    0x77,0x7E,  0x77,0x7E,  0x55,0x06,  0x55,0x76,    0x55,0x06,  0xD5,0x1E,  0xAB,0x0C,  0x00,0x00  };    /* 链队操作 */  void Initial(LinkQueue *Q)  {         Q->front=Q->rear=NULL;  }   int IsEmpty(LinkQueue *Q)  {      return Q->front==NULL&&Q->rear==NULL;  }  void Push(LinkQueue *Q,int direction,int x1,int y1)  {      QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode));/*申请新结点*/      p->d=direction;      p->x=x1;      p->y=y1;      p->next=NULL;      if(IsEmpty(Q))          Q->front=Q->rear=p;   /*将x插入空队列*/      else       {                           /*x插入非空队列的尾*/          Q->rear->next=p;      /*p链到原队尾结点后*/          Q->rear=p;               /*队尾指针指向新的尾*/      }  }  void Pop(LinkQueue *Q)  {      QueueNode *p;      if(IsEmpty(Q))      {          printf("队列为空");/*下溢*/          exit(1);      }      p=Q->front;          /*指向对头结点*/      Q->front=p->next;    /*将对头结点从链上摘下*/      if(Q->rear==p)       /*原队中只有一个结点,删去后队列变空,此时队头指针已为空*/          Q->rear=NULL;      free(p);             /*释放被删队头结点*/  }    /* 图形与数据初始化 */  void init(void)  {      int gdriver = DETECT, gmode, errorcode;       initgraph(&gdriver, &gmode,"" );     errorcode = graphresult();      if (errorcode != grOk)      {          printf("Graphics error: %s",grapherrormsg(errorcode));          printf("\nPress any key to halt:");    getch();    exit(1);      }   s=5,k=0,t=0,max_score=2;     snake.x1=25*K;      snake.y1=25*K;      snake.x2=23*K;      snake.y2=25*K;      snake.node=2;      snake.life=1;      Initial(&snake.direction);      Push(&snake.direction,0,snake.x1,snake.y1);  }  /* 点阵字体输出算法 */  void draw_mat(char *mat,int matsize,int x,int y,int color) /*显示点阵字体 */  {       int i,j,k,m;       m=(matsize-1)/8+1;       for(j=0;j<matsize;j++)            for(i=0;i<m;i++)                 for(k=0;k<8;k++)                      if(mat[j*m+i]&(0x80>>k))                           putpixel(x+i*8+k,y+j,color);  }  /* 画边框 */  void draw_frame()  {      int i;      setcolor(3);      rectangle(K,4*K,63*K,46*K);  /* 先画两个大框框 */     rectangle(2*K,5*K,62*K,45*K);      for(i=2;i<=62;i++)     /* 在两框中画线 */     {          line(i*K,4*K,i*K,5*K);          line(i*K,45*K,i*K,46*K);          if(i<45)          {              line(K,(i+2)*K,2*K,(i+2)*K);              line(62*K,(i+2)*K,63*K,(i+2)*K);          }      }      }  /* 调用汉字点阵输出程序,显示标题和作者信息 */  void show_word(void)  {       draw_mat(tan48H,48,229,5,7);       draw_mat(chi48H,48,309,5,7);       draw_mat(she48H,48,389,5,7);         draw_mat(tan48H,48,230,4,4);       draw_mat(chi48H,48,310,4,4);       draw_mat(she48H,48,390,4,4);         draw_mat(zuo16H,16,500,465,15);       draw_mat(zhe16H,16,518,465,15);       draw_mat(mh16H,16,536,465,15);              draw_mat(zhao16H,16,550,465,15);       draw_mat(peng16H,16,572,465,15);  }  /* 显示分数 */  void show_score(void)  {       char str[10];       sprintf(str,"score:%d",snake.node);      /* 显示分数 */   bar(10,5,180,35);       setcolor(14);       settextstyle(0,0,2);          outtextxy(20,12,str);   setcolor(15); }  /* 画蛇节 */  void _rectangle(int x,int y)  {      rectangle(x-4,y-4,x+4,y+4);  }  /* 记录最高分 */  void record()  {      FILE *fp;         char str[20];      if((fp=fopen("RECORD.FIL","r"))==NULL)  /* 如果是第一次打开,就执行里面的建立保存最高记录文件 */     {                    if((fp=fopen("RECORD.FIL","w"))!=NULL)              fprintf(fp,"%3d",max_score);  /* 读默认的最大值2  */         fclose(fp);           }      else      {                 fscanf(fp,"%3d",&max_score);          fclose(fp);          if(max_score<snake.node)  /* 读出保存的最高记录和现在结束时的记录 进行比较 更大的话,就重新覆盖写入文件 */         {              if((fp=fopen("RECORD.FIL","w"))!=NULL)                  fprintf(fp,"%3d",snake.node);                 fclose(fp);          }             }  sprintf(str,"record:%d",max_score);      setfillstyle(1,3);  /* 下面是用来游戏开始时显示最高记录用的 */     bar(getmaxx()-170,5,getmaxx()-10,35);      setcolor(4);      settextstyle(0,0,2);      outtextxy(getmaxx()-170,12,str);  setcolor(15);          /* 提示信息 */     settextstyle(0,0,0);      outtextxy(10,470,"UP     LEFT     RIGHT     DOWN     ESC     S(Speed:1~7)");  } /* 遍历查找是否有相同座标元素 */  int search(int x,int y)  /* 这里x,y为产生食物座标,或蛇头座标,即都是x,y不能在蛇身上 */ {      int i,j;      link p,q;      p=snake.direction.front;      q=snake.direction.rear;  /* 下面的两个if是为了遍历蛇头到第一个节点所有蛇身上的座标元素 */  switch(p->d) /* 先把现在尾座标最后一个方向座标,因为,最后个尾座标是移动的,最后一个结点方向应该总是跟尾座标一至,从倒数第二个开始算起 */  {   case 0:p->x=snake.x2+K;p->y=snake.y2;break;   case 1:p->x=snake.x2-K;p->y=snake.y2;break;   case 2:p->x=snake.x2;p->y=snake.y2-K;break;   case 3:p->x=snake.x2;p->y=snake.y2+K;break;  }          if(snake.x1==q->x)  /* 如果蛇头x座标写第一个方向结点x座标相同,说明蛇是上下移动的,只要变更y座标就可以……*/     {          i=snake.y1<q->y?snake.y1:q->y;  /* 把头和第一个方向节点中更小值赋给i */         j=snake.y1>q->y?snake.y1:q->y;  /* 把更大的赋给j ……*/         for(;i<j;i+=K)              if(x==q->x&&y==i+1)                  return 1;       }      if(snake.y1==q->y)      {          i=snake.x1<q->x?snake.x1:q->x;          j=snake.x1>q->x?snake.x1:q->x;          for(;i<j;i+=K)               if(x==i+1&&y==q->y)                   return 1;      }      for(;p!=NULL;p=p->next)/* 是为了遍历第一个节点到尾结点的所有蛇上座标元素 */     {                 if(p->x==p->next->x)          {              i=p->y<p->next->y?p->y:p->next->y;              j=p->y>p->next->y?p->y:p->next->y;              for(;i<=j;i+=K)                  if(x==p->x&&y==i)                                         return 1;                            }          if(p->y==p->next->y)          {                         i=p->x<p->next->x?p->x:p->next->x;              j=p->x>p->next->x?p->x:p->next->x;              for(;i<=j;i+=K)                                 if(x==i&&y==p->y)                      return 1;           }      }      return 0;  }    /* 判断蛇是否死亡 游戏是否结束 */  void game_over_(void)  {      int i;        if(snake.x1>61*K||snake.x1<3*K||snake.y1>44*K||snake.y1<6*K)  /* 判断是否超出边界 */         snake.life=0;      i=search(snake.x1,snake.y1);  /* 看蛇头是否移移到蛇身上去了,到了的话,说明咬到自己了,结束*/     if(i==1)          snake.life=0;  }  /* 蛇移动 随机生成食物 */  int move(int *x,int r)  {      int i=0,j=0;      if(r==0||r==2)  /* 如何移动 ,这里的r表示方向,0,1是用来控制蛇头,2,3是用来控制蛇尾 */          *x+=K;      if(r==1||r==3)          *x-=K;        if(k==0)  /* k为0说明食物被吃了,或没有食物,产生食物 */      {          i=1;    /* 控制蛇尾暂停用的 */         k=1;    /* 控制产生食物,产生食物没吃到前是1,吃到后置0*/   t=0;  /* 蛇完成一步移动,即允许方向键控制*/         randomize();          while(1)  /* 随机产生食物 */         {                                 x0=(random(58)+3)*K;              y0=(random(38)+6)*K;              j=search(x0,y0);  /* 产生食物不能在蛇上 */             if(j==0)                  break;          }                 _rectangle(x0,y0);          show_score();      /* 产生了食物,说明已经吃到了食物,得加分,更新分数 */     }             if(snake.x1==x0&&snake.y1==y0)/* 吃到食物增加长度 即尾部暂停移动一步,根据方向来操作首尾的x,y的值 */      {          k=0;   /* 吃到食物k置0*/         snake.node+=1;                _rectangle(snake.x1,snake.y1);            if(snake.direction.front->d==0)              snake.x2-=K;         if(snake.direction.front->d==1)              snake.x2+=K;         if(snake.direction.front->d==2)              snake.y2+=K;         if(snake.direction.front->d==3)              snake.y2-=K;     }      if(r==0||r==1)  /* 0,1是表示蛇头,下面即是蛇头向前移动一格,画出,再判断是否结束了 具体看结束函数 */     {          t=1; /* 蛇未完成一步移动,即不允许方向键控制*/   game_over_();   _rectangle(snake.x1,snake.y1);      }      if((r==2||r==3)&&i==0)  /* 如果i==0,说明吃到食物,暂停一下 */     {    t=0; /* 蛇完成一步移动,即允许方向键控制*/   /* 蛇的最后个节点的x,y如果与蛇尾的下一个转弯点的x,y座标相同的,且蛇不是只有一个转弯点时(即蛇不是一条直线时),就销毁最后个个转弯节点*/         if(snake.direction.front->next->x==snake.x2&&snake.direction.front->next->y==snake.y2&&snake.direction.front!=snake.direction.rear)             Pop(&snake.direction);          /* 蛇尾转向 销毁队列头元素 */          _rectangle(snake.x2,snake.y2);          for(j=1;j<=s;j++)              delay(5000);    /* 延时用的,能过改s的值可以控制速度 */     }      return 0;        }  /* 是否退出 */ void exit_(int x) {  int key;  while(1)  {    key=bioskey(0);    if(key==Y||key==n)   break;  }    if(x==key)  {   record();   exit(1);  } } /* 游戏操作 */  void game_play()  {      int key,q=0,i;  /* key用来保存捕获键值,q用来控制是否结束程序,0为不结束,i用来保证你按方向键之前,蛇有移动过,不然这个点上可能有好几个方向值了,但我们要的是一个点最多只能保存一个方向值*/     setcolor(15);             _rectangle(snake.x2+K,snake.y2);  /* 画出开始的头两节蛇节 */     _rectangle(snake.x2+2*K,snake.y2);      while(1)      {          i=1; /* 每次按方向键后,最少移动一次后才能允许方向键控制 */          while(!(kbhit()&&t!=1||snake.life!=1))  /* 检查是否按键,没按一直循环,按了的话就跳出循环 且蛇未完成一步移动,不允许按键控制*/         {        if(snake.direction.rear->d==0)move(&snake.x1,0); /* 头右移 */              if(snake.direction.rear->d==1)move(&snake.x1,1); /* 头左移 */              if(snake.direction.rear->d==2)move(&snake.y1,1); /* 头上移 */              if(snake.direction.rear->d==3)move(&snake.y1,0); /* 头下移 */             if(snake.direction.front->d==0){i=move(&snake.x2,2);continue;} /* 尾右移 ,返回i(0)说明移动过,才可以执行转向操作,下同*/              if(snake.direction.front->d==1){i=move(&snake.x2,3);continue;} /* 尾左移 */               if(snake.direction.front->d==2){i=move(&snake.y2,3);continue;} /* 尾上移 */               if(snake.direction.front->d==3){i=move(&snake.y2,2);continue;} /* 尾下移 */                    }                 if(snake.life==1) /* 蛇没死 */          {              key=bioskey(0);              switch(key) /* 键盘控制蛇移动 */     {      case right:       if(snake.direction.rear->d!=1&&snake.direction.rear->d!=0&&i==0)/* 不能反向或按原方向移动,i控制每一次按方向键 之前必须至少移动一次 */        Push(&snake.direction,0,snake.x1,snake.y1);    /* 按方向键则将按方向键时的头节点推入方向队列中 下同 */      break;      case left:       if(snake.direction.rear->d!=1&&snake.direction.rear->d!=0&&i==0)        Push(&snake.direction,1,snake.x1,snake.y1);       break;      case up:       if(snake.direction.rear->d!=2&&snake.direction.rear->d!=3&&i==0)        Push(&snake.direction,2,snake.x1,snake.y1);       break;      case down:       if(snake.direction.rear->d!=2&&snake.direction.rear->d!=3&&i==0)        Push(&snake.direction,3,snake.x1,snake.y1);       break;      case speed:  /* 调速用的,按s就可以蛇会停下来,进入调速模式,可调1-5的值*/      while(1)       {         int ss=0;       switch(getch())       {        case '1':s=7;ss=1;break;        case '2':s=6;ss=1; break;        case '3':s=5;ss=1; break;        case '4':s=4;ss=1; break;        case '5':s=3;ss=1; break;        case '6':s=2;ss=1; break;        case '7':s=1;ss=1; break;       }       if(ss==1)        break;      }       sleep(1);       break;      case esc:       q=1;  /* 控制是否退出用的 */      break;     }         }         if(snake.life==0) /* 游戏结束,是否继续? */          {              setcolor(4);              settextstyle(0,0,2);              settextjustify(1,1);              outtextxy(getmaxx()/2,getmaxy()/2,"GAME OVER!");              setcolor(15);              settextstyle(0,0,0);              outtextxy(getmaxx()/2-5,getmaxy()/2+35,"CONTINUE ?(Y/N)");                        exit_(n);  /* 按n退出 */    record();             break;          }         if(q==1)   /* 退出否 并显示提示信息 */          {              setcolor(15);    settextstyle(0,0,0);             settextjustify(1,1);              outtextxy(getmaxx()/2,getmaxy()/2+35,"QUIT ?(Y/N)");              exit_(Y);    /* 按y退出 */    q=0;     /* 不退出重新初始化 */             setcolor(0);    settextstyle(0,0,0);             outtextxy(getmaxx()/2,getmaxy()/2+35,"QUIT ?(Y/N)");              setcolor(15);                     }                             }     }    void main(void)  {      int errorcode;  errorcode=registerbgidriver(EGAVGA_driver);      if(errorcode<0)     {         printf("Graphics error: %s", grapherrormsg(errorcode));         printf("Press any key to halt:");         getch();         exit(1);     }  while(1)      {          init();               draw_frame();    /* 画边框 */         show_word();    /* 显示中文信息 */         record();     /* 显示最高记录 */         setwritemode(1);   /* 设置成异或画图模式,即一个图形,你画一次显示,再在同一位置,再画一次就异或掉,就很从没画过一样 */         game_play();        /* 进行游戏 */   cleardevice();  /* 清除屏幕显示 */     }      closegraph();  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章