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(); }