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

📄 goldenbugs.c

📁 一个C做的蛇蛇游戏阿
💻 C
📖 第 1 页 / 共 3 页
字号:
         break;
  case 3:;
  case 4:justwalk();
         Score+=(Beans[Beantype].scorechange-Beans[Beantype].scorechange*Beancounter/Beans[Beantype].beantime);
         if(Score<0)Score=0;
         break;
  case 5:;
  case 6:justwalk();
         Life+=Beans[Beantype].lifechange;
         Score+=(Beans[Beantype].scorechange-Beans[Beantype].scorechange*Beancounter/Beans[Beantype].beantime);
         if(Life<0)Life=0;
         if(Score<0)Score=0;
         break;
  case 7:if(Breakwall==FALSE)Breakwall=TRUE;
         justwalk();
         Score+=(Beans[Beantype].scorechange-Beans[Beantype].scorechange*Beancounter/Beans[Beantype].beantime);
         break;
  case 8:if(Breakwall==TRUE)Breakwall=FALSE;
         justwalk();
         Score+=(Beans[Beantype].scorechange-Beans[Beantype].scorechange*Beancounter/Beans[Beantype].beantime);
         break;
  case 9:justwalk();
         Score+=Beans[Beantype].scorechange;
         Run=GAMEWIN;
  default:;
 }
}


/*change the score screen*/
void scorechange()
{
 setfillstyle(1,LIGHTBLUE);
 bar(311,442,375,455);
 setcolor(YELLOW);
 settextstyle(0,HORIZ_DIR,1);
 settextjustify(0,2);
 showscore(311,442,Score,8,1,YELLOW);
}


/*change the life screen*/
void lifechange()
{
 setfillstyle(1,LIGHTGREEN);
 bar(172,442,188,455);
 showscore(172,442,Life,2,1,DARKGRAY);
}


/*change the speed*/
void speedchange()
{
 setcolor(DARKGRAY);
 setfillstyle(1,LIGHTGREEN);
 bar(468,442,484,450);
 showscore(468,442,Speed,2,1,DARKGRAY);
}


/*change the bean*/
void beanchange()
{
 setcolor(DARKGRAY);
 setfillstyle(1,LIGHTGREEN);
 bar(540,442,572,450);
 showscore(540,442,Max_body_len-Now_body_len-1,4,1,DARKGRAY);
}


/*snake dying*/
void snakedie()
{
 Timercounter=0;
 while(P_tail->next!=P_head)
 {
  while(Timercounter<2)showroln();
  setfillstyle(Gamefil,Gamecol);
  bar(P_tail->xx*15+28,P_tail->yy*15+25,P_tail->xx*15+42,P_tail->yy*15+39);
  P_tail=P_tail->next;
  Timercounter=0;
 }
 while(Timercounter<2)showroln();
 setfillstyle(Gamefil,Gamecol);
 bar(P_tail->xx*15+28,P_tail->yy*15+25,P_tail->xx*15+42,P_tail->yy*15+39);
 Timercounter=0;
 while(Timercounter<2)showroln();
 setfillstyle(Gamefil,Gamecol);
 bar(P_head->xx*15+28,P_head->yy*15+25,P_head->xx*15+42,P_head->yy*15+39);
 Timercounter=0;
 while(Timercounter<15)showroln();
}


/*the head of the chain is the tail of the snake*/
void walk()
{
 /*change the 'xx','yy' according to body_dir*/
 switch(Bodydir)
 {
  case UP:Tempy=P_head->yy-1;Tempx=P_head->xx;break;
  case DOWN:Tempy=P_head->yy+1;Tempx=P_head->xx;break;
  case LEFT:Tempx=P_head->xx-1;Tempy=P_head->yy;break;
  case RIGHT:Tempx=P_head->xx+1;Tempy=P_head->yy;break;
  default:;
 }

 /*if it is go,die,or eat bean*/
 switch(Map[Tempx][Tempy])
 {
  case 1:if(Breakwall==TRUE)
         {
          if(Tempx!=0&&Tempx!=38&&Tempy!=26&&Tempy!=0)
          {
           justwalk();
           Score+=800;
           scorechange();
          }
         }
         else if(Timercounter>=6)
              {
               Run=GAMELOSE;
               snakedie();
              }
         break;/*delay when dying*/
  case 4:if(Timercounter>=6)
         {
          Run=GAMELOSE;
          snakedie();
         };
         break;/*knock itself*/
  case 3:;
  case 0:justwalk();
         break;/*nothing*/
  case 2:eatbean();
         scorechange();
         lifechange();
         speedchange();
         beanchange();
         creatbean();/*eat bean!*/
  default:;
 }
}


/*change pause part when key pressed*/
void changepause(int mode)
{
 int midx=319,midy=239;
 settextstyle(0,HORIZ_DIR,1);
 settextjustify(1,1);
 switch(mode)
 {
  case 0:setcolor(YELLOW);
         outtextxy(midx,midy+20,"EXIT");
         setcolor(WHITE);
         outtextxy(midx,midy+3,"CONTINUE");
         break;
  case 1:setcolor(WHITE);
         outtextxy(midx,midy+20,"EXIT");
         setcolor(YELLOW);
         outtextxy(midx,midy+3,"CONTINUE");
  default:;
 }
}


/*to show the dialog part when paused*/
void pause()
{
 int i,inkey=UP;
 int midx=319,midy=239;
 void *w;
 Timercounter=0;
 w=malloc(imagesize(midx-75,midy-40,midx+75,midy+40));
 getimage(midx-75,midy-40,midx+75,midy+40,w);
 for(i=12;i<40;i+=6)
  {
   while(Timercounter<1)showroln();
   Timercounter=0;
   setfillstyle(1,BLACK);
   bar(midx-2*i+1,midy-i+1,midx+2*i-1,midy+i-1);
   setcolor(MAGENTA);
   rectangle(midx-2*i,midy-i,midx+2*i,midy+i);
  }
 rectangle(midx-74,midy-38,midx+74,midy+38);
 setcolor(BLACK);
 rectangle(midx-73,midy-37,midx+73,midy+37);

 setcolor(YELLOW);
 settextstyle(0,HORIZ_DIR,1);
 settextjustify(1,1);
 outtextxy(midx,midy-16,"!PAUSED!");
 outtextxy(midx,midy+3,"CONTINUE");
 outtextxy(midx,midy+20,"EXIT");

 Run=GAMERUN;
 changepause(0);
 while(inkey!=ENTER)
 {
  if(kbhit())
  {
   inkey=bioskey(0);
   switch(inkey)
   {
    case UP:changepause(0);
              Run=GAMERUN;
              break;
    case DOWN:changepause(1);
               Run=GAMEQUIT;
               break;
    default:;
   }
  }
  showroln();
 }

 putimage(midx-75,midy-40,w,COPY_PUT);
 free(w);
 Timercounter=0;
}


/*the main body of the game*/
void gamestage()
{
 int i,j,inkey,temp_dir=RIGHT;

 Timercounter=0;
 settimer(newhandler);

 /*the main 'rolling'*/
 while(Run==GAMERUN)
   {
    if(kbhit())
    {
     inkey=bioskey(0);
     switch(inkey)
     {
      case UP:if(Bodydir!=DOWN)temp_dir=UP;break;
      case DOWN:if(Bodydir!=UP)temp_dir=DOWN;break;
      case LEFT:if(Bodydir!=RIGHT)temp_dir=LEFT;break;
      case RIGHT:if(Bodydir!=LEFT)temp_dir=RIGHT;break;
      case ENTER:pause();break;
      case ESC:Run=GAMEQUIT;
      default:;
     }
    }
    if(Timercounter>=Speed)walk(Bodydir=temp_dir);
    newbean();
    showroln();
   }

 killtimer();
 Timercounter=0;
}


/*input a string in graphics mode*/
void inputstring(int x,int y,char *s,int len,int color)
{
 int i=0,j=0;
 char c,str[2];

 Timercounter=0;
 settimer(newhandler);

 settextstyle(0,HORIZ_DIR,0);
 settextjustify(0,2);

 do
 {
  if(bioskey(1))
   {
    c=getch();
    if(c==0)
     getch();
    else
     if(c=='\b')
      {
       if(i>0)
        {
         setcolor(BLACK);
         rectangle(x,y+8,x+6,y+9);
         x-=8;
         i--;
         setfillstyle(1,BLACK);
         bar(x,y,x+7,y+9);
        }
      }
     else
      if(c>=' '&&c<='~'&&i<len)
       {
        s[i++]=c;
        sprintf(str,"%c",c);
        setcolor(color);
        outtextxy(x,y,str);
        setcolor(BLACK);
        rectangle(x,y+8,x+6,y+9);
        x+=8;
       }
   }
   if(Timercounter>3)
    {
     Timercounter=0;
     j++;
     j%=2;
     if(j)
      {
       setcolor(BLACK);
       rectangle(x,y+8,x+6,y+9);
      }
     else
      {
       setcolor(color);
       rectangle(x,y+8,x+6,y+9);
      }
    }
  showroln();
 }while(c!='\r');
 setcolor(BLACK);
 rectangle(x,y+8,x+6,y+9);
 s[i]='\0';

 killtimer();
}


/*draw highscore picture*/
void showtopplayer(char name[11][16],long score[11])
{
 int i;
 setfillstyle(1,BLACK);
 bar(43,40,597,414);

 settextstyle(0,HORIZ_DIR,2);
 settextjustify(1,0);
 setcolor(LIGHTRED);
 outtextxy(319,70,"!TOP PLAYERS!");
 settextjustify(0,2);
 setcolor(YELLOW);
 for(i=0;i<10;i++)
  outtextxy(130,95+32*i,name[i]);
 for(i=0;i<10;i++)
   showscore(380,95+32*i,score[i],8,2,LIGHTCYAN);
}


/*congratulations when record broken*/
void showpass()
{
 setfillstyle(1,BLACK);
 bar(43,40,597,414);

 settextjustify(1,1);
 setcolor(LIGHTRED);
 settextstyle(0,HORIZ_DIR,3);
 outtextxy(319,100,"Congratulations");
 settextstyle(0,HORIZ_DIR,2);
 setcolor(LIGHTCYAN);
 outtextxy(319,150,"now you are one");
 outtextxy(319,200,"of the");
 outtextxy(319,250,"Ten Top Players ! ! !");

 setcolor(MAGENTA);
 rectangle(225,300,414,350);
 rectangle(223,298,416,352);

 settextjustify(0,2);
 setcolor(YELLOW);
 settextstyle(0,HORIZ_DIR,1);
 outtextxy(231,322,"PLAYER:");
}


/*show the high score*/
void highscore(int mode)
{
 int i,player=-1;
 FILE *fp;
 char name[11][16];
 long score[11];

 if((fp=fopen("user\\highscore.set","rb"))==NULL)
 {
  printf("score file open error!!!");
  exit(0);
 }

 for(i=0;i<10;i++)
 {
  fread(name[i],1,16,fp);
  fread(score+i,sizeof(long),1,fp);
 }
 fclose(fp);

 switch(mode)
 {
  case 1:if(score[9]<Score)
         {
          for(i=9;i>0;i--)
            if(score[i-1]>=Score&&score[i]<=Score)break;

          player=i;

          for(i=10;i>player;i--)
          {
           score[i]=score[i-1];
           strcpy(name[i],name[i-1]);
          }

          showpass();
          inputstring(287,322,name[player],15,YELLOW);
          score[player]=Score;

          if((fp=fopen("user\\highscore.set","wb"))==NULL)
          {
           printf("score file open error!!!");
           exit(0);
          }

          for(i=0;i<10;i++)
          {
           fwrite(name[i],1,16,fp);
           fwrite(score+i,sizeof(long),1,fp);
          }
          fclose(fp);
         }

         showtopplayer(name,score);
         settextstyle(0,HORIZ_DIR,2);
         settextjustify(0,2);
         if(player!=-1)
         {
          setcolor(WHITE);
          outtextxy(130,95+32*player,name[player]);
          showscore(380,95+32*player,score[player],8,2,WHITE);
         }
         break;
  case 0:showtopplayer(name,score);
  default:;
 }
}


void mydelay1(int time)
{
 Timercounter=0;
 settimer(newhandler);
 while(Timercounter<time)showroln();
 killtimer();
}


/*show youwin or youlose*/
void showresult()
{
 setcolor(YELLOW);
 settextstyle(0,HORIZ_DIR,3);
 settextjustify(1,1);
 switch(Run)
 {
  case GAMEWIN:outtextxy(319,239,"YOU WIN!!!");
               mydelay1(30);
               highscore(1);
               mydelay1(75);
               credits1();
               mydelay1(75);
               credits2();
               mydelay1(75);
               break;
  case GAMELOSE:outtextxy(319,239,"GAME OVER!!!");
                mydelay1(30);
                highscore(1);
                mydelay1(75);
                break;
  default :;
 }
}


/*start a new game*/
void newgame()
{
 void *bkground;
 int stage,i;
 char filename[10];

 /*load the gbp of beans*/
 for(i=0;i<10;i++)
 {
  sprintf(filename,"pic\\bean%d.gbp",i);
  Beans[i].beanpic=loadgbp(filename);
 }

 /*load the mmp of snakes*/
 for(i=0;i<4;i++)
 {
  sprintf(filename,"pic\\head%d.mmp",i+1);
  Snakebody[i]=loadmmp(filename);
 }
 for(i=0;i<4;i++)
 {
  sprintf(filename,"pic\\body%d.mmp",i+1);
  Snakebody[i+4]=loadmmp(filename);
 }

 /*create space for bkground*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -