⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake3.c

📁 一个由c语言编程的一些小游戏
💻 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 + -