📄 goldenbugs.c
字号:
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 + -