貪喫蛇 第二個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();  }

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