📄 snake3.c
字号:
/*作者:user*/
#include "stdio.h"
#include "conio.h"
#include "graphics.h"
#include "stdlib.h"
#include "math.h"
#include "dos.h"
#include "bios.h"
#define XPI sin((2*i+1)*(6.283185/16))*10
#define YPI cos((2*i+1)*(6.283185/16))*10
#define MAXLEN 50
#define START_SPEED 30000
/* MAXLEN为最大长度,STAR_SPEED为初始速度,值越小速度越快 */
int tgx,tgy; /*目标的坐标变量*/
int snklen,dd; /*蛇的长度,方向变量*/
int level=1,score,speed; /*关数,速度变量*/
int snake[MAXLEN][2];
int len_bak[10]={120,20,100,20,80,20,60,20,40,20};
void initgr() /* BGI初始化函数 */
{int gd=DETECT,gm=0;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
}
void dp(int px,int py,int cl) /*画出或擦去一节蛇身函数,px,py为中点坐标,cl为1时则画,为0时则擦*/
{int i;
setcolor(14*cl);circle(px,py,9);
setcolor(10*cl);circle(px,py,5);
setcolor(14);
return;
}
void initsnk(int ss) /* 初始化界面,过关或开始游戏时调用,参数ss为1时为过关,为0时重新开始*/
{int i;
score=score*ss;
bar(0,0,640,480);
setcolor(11);rectangle(0,0,620,420);
setcolor(13);rectangle(5,5,615,415);
setcolor(11);rectangle(0,425,620,470); /* 画边框*/
setcolor(14);
settextstyle(0,0,2);moveto(210,435);outtext("X - S N A K E");
settextstyle(0,0,1);
moveto(10,460);outtext("Press 'SPACE' to start / 'ESCAPE' to exit");
setcolor(14);
for(i=0;i<5;i++){snake[i][0]=len_bak[i*2];snake[i][1]=len_bak[i*2+1];} /*将坐标赋予原始值*/
snklen=4;dd=1;level=level*ss+1;
speed=ss==0?START_SPEED:speed-(speed/5);
gotoxy(35,1);printf("LEVEL: %-d ",level);
gotoxy(60,1);printf("SCORE: %d ",score);
for(i=0;i<snklen;i++) dp(snake[i][0],snake[i][1],1); /*画蛇身的初始位置*/
while(bioskey(0)!=0x3920) ;
return;
}
void puttarget() /*新建目标函数*/
{int i,touch;
touch=1;
while(touch){
tgx=random(30)*20+20;tgy=random(20)*20+20;
touch=0;
for(i=0;i<snklen;i++) if(tgx==snake[i][0]&&tgy==snake[i][1]){touch=1;break;}
}
circle(tgx,tgy,5);
return;
}
int istouch() /*该函数检测是否触到物体(目标、自身或边界),返回0,1和2*/
{int i;
if(snake[0][0]==tgx&&snake[0][1]==tgy) return 1;
for(i=2;i<snklen;i++) if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]) return 2;
if(snake[0][0]<20||snake[0][0]>600||snake[0][1]<20||snake[0][1]>400) return 2;
return 0;
}
void main()
{int i,key;
int dir[8]={0,-20,20,0,0,20,-20,0}; /*各个方向的X,Y坐标的变化参数*/
initgr();
setfillstyle(0,0);
randomize();
initsnk(0);
puttarget();
while(1){
dp(snake[snklen-1][0],snake[snklen-1][1],0); /*擦去蛇尾*/
for(i=snklen;i>0;i--){
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
}
snake[0][0]=snake[0][0]+dir[dd*2];
snake[0][1]=snake[0][1]+dir[dd*2+1];
dp(snake[0][0],snake[0][1],1); /*画蛇头*/
switch(istouch()){
case 1: /*吃到目标*/
snklen++;score++;
gotoxy(35,1);printf("LEVEL: %-d ",level);
gotoxy(60,1);printf("SCORE: %d ",score);
if(snklen==MAXLEN){
for(i=1;i<5;i++){sound(300+i*100);delay(10000);nosound();}
moveto(230,220);outtext("L E V E L U P !!");
while(bioskey(0)!=0x3920) ;
initsnk(1);
}
puttarget();break;
case 2: /*撞到障碍*/
for(i=5;i>0;i--){sound(300+i*100);delay(10000);nosound();}
moveto(240,200);outtext("G A M E O V E R");
while((key=bioskey(0))!=0x3920) if(key==0x011b) goto OVER;
level=1;
initsnk(0);
puttarget();
break;
default:
gotoxy(35,1);printf("LEVEL: %-d ",level);
gotoxy(60,1);printf("SCORE: %d ",score);
}
delay(speed); /* 延时,注意:延时参数在TC3中为毫秒(1/1000秒),可根据实际情况调整START_SPEED的值*/
if (bioskey(1)){
while(bioskey(1)) key=bioskey(0); /*清除键盘缓冲至最近一次按键*/
if (key==0x011b) break;
if (key==0x4800) dd=dd==2?dd:0;
if (key==0x5000) dd=dd==0?dd:2;
if (key==0x4b00) dd=dd==1?dd:3;
if (key==0x4d00) dd=dd==3?dd:1; /*根据按键改变方向*/
}
}
moveto(230,220);outtext("The game is over !!");
for(i=1;i<5;i++){sound(300+i*100);delay(10000);nosound();}
while(bioskey(1)) key=bioskey(0);key=bioskey(0);
OVER:
closegraph();
}
/*结束*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -