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