📄 treasure.c
字号:
line(x2-70,y2+r2+15,x2-70,y2+r2+25);
line(400,180,600,400);
for (i=0;i<39999999;i++)
{}
setfillstyle(1,4);
pieslice(x+100,y+r+30,0,15,30); /*扇形*/
pieslice(x+100,y+r+30,345,360,30);
for (i=0;i<49999999;i++)
{}
pieslice(x+100,y+r+30,0,15,60);
pieslice(x+100,y+r+30,345,360,60);
line(400,400,600,180);
for (i=0;i<49999999;i++)
{}
pieslice(x+100,y+r+30,0,15,90);
pieslice(x+100,y+r+30,345,360,90);
for (i=0;i<49999999;i++)
{}
setfillstyle(1,1);
bar(0,120,639,479);
circle(x,y,r);
line(x,y+r,x,y+r+120); /* 左边的人物*/
line(x,y+r+120,x-100,y+r+120+60);
line(x,y+r+120,x+50,y+r+120+30);
line(x+50,y+r+120+30,x+25,y+r+120+60);
line(x,y+r+20,x+100,y+r+20);
line(x+100,y+r+15,x+100,y+r+20);
line(x,y+r+30,x+80,y+r+30);
line(x+80,y+r+25,x+80,y+r+30);
circle(x2,y2,r2); /* 右边的人*/
line(x2,y2+r2,x2,y2+r2+120);
line(x2,y2+r2+120,x2+100,y2+r2+120+60);
line(x2,y2+r2+120,x2-50,y2+r2+120+30);
line(x2-50,y2+r2+120+30,x2-25,y2+r2+120+60);
line(x2,y2+r2+20,x2-100,y2+r2+20);
line(x2-70,y2+r2+15,x2-70,y2+r2+25);
}
void magic() /*魔法函数,当在第一级菜单中选magic后会调用该函数*/
{ /**/
int item=0,*pointer; /**/
pointer=&item;
if (magic<=0)
{
goto loop3;
}
/*可能有BUG*/
menu2(pointer); /*调用第二级菜单函数*/
if (item==0) /*选择第一项,为治疗*/
{ /**/
MP-=100; /*治疗会消耗人物魔法值*/
HP+=300; /*人物生命值回复200点*/
}
if (item==1)
{
magicattack(); /*调用魔法攻击函数*/
}
loop3:;
}
menu2(int *pointer) /*第二级菜单函数,当战斗时在第一级菜单处选magic时由于魔法有两个选择,会调用第二级菜单*/
{
int select[8]={0};
setfillstyle(1,1);
bar(0,0,150,80);
select[*pointer]=1;
showmenuselect2(select);
for (;;)
{
switch (bioskey(0))
{
case UP:if (select[0]!=1) /*当按上键时,判断第一个选项是否还未被选中*/
{ /*若已选中则不作任何处理,若未被选中则*/
select[*pointer]=0; /*原来的选项对应的数组值变为0,也就是未选中*/
*pointer-=1; /*光标所在位上移*/
select[*pointer]=1; /*原来位置的上一个选项被选中*/
}
break;
case DOWN:if (select[1]!=1) /*按下键同理*/
{
select[*pointer]=0;
*pointer+=1;
select[*pointer]=1;
}
break;
case ENTER:goto loop2; /*当输入回车时,跳出,此时指针指向的变量值被改变,通过此值确定玩家选择的是哪一项*/
default:break;
}
showmenuselect2(select); /*调用显示第二级菜单函数*/
}
loop2:;
}
showmenuselect2(int select[8]) /*显示第二级菜单函数,在menu2()函数处被调用,用输入的参数显示第二级菜单,并显示哪一项被选中*/
{
int i;
setfillstyle(1,1); /*在菜单所在的区域内清屏*/
bar(0,0,150,80); /**/
for (i=0;i<2;i++) /**/
{ /**/
if (select[i]==1) /**/
{ /**/
setfillstyle(1,3); /*在所选的选项处显示白色底色*/
bar(0,i*20,150,i*20+20); /**/
}
}
outtextxy(5,8,"heal"); /*打印出两个选项*/
outtextxy(5,28,"magic attack");
}
void menu(int *pointer) /*第一级菜单函数,当战斗时会调用*/
{
int select[8]={0};
setfillstyle(1,1);
bar(0,0,150,80);
select[*pointer]=1;
showmenuselect(select);
for (;;)
{
switch (bioskey(0))
{
case UP:if (select[0]!=1)
{
select[*pointer]=0;
*pointer-=1;
select[*pointer]=1;
}
break;
case DOWN:if (select[1]!=1)
{
select[*pointer]=0;
*pointer+=1;
select[*pointer]=1;
}
break;
case ENTER:goto loop1;
default:break;
}
showmenuselect(select);
}
loop1:;
}
showmenuselect(int select[8]) /*显示第一级菜单函数*/
{
int i;
setfillstyle(1,1);
bar(0,0,150,80);
for (i=0;i<2;i++)
{
if (select[i]==1)
{
setfillstyle(1,3);
bar(0,i*20,150,i*20+20);
}
}
outtextxy(5,8,"attack");
outtextxy(5,28,"magic");
}
void win() /*胜利函数,当战斗胜利时调用*/
{
cleardevice();
outtextxy(250,240,"WIN!");
bioskey(0);
}
void lose() /*战败函数,战斗失败时调用*/
{
cleardevice();
outtextxy(250,220,"LOSE!");
outtextxy(250,240,"COME ON!");
outtextxy(250,260,"TRY AGAIN!");
bioskey(0);
}
fight(int enemyattack) /*战斗函数,move()函数中随机调用,前一参数为敌人攻击力,后一为人物是否存活,若指针所指向变量值变为1,代表人物在刚才的战斗中失败*/
{
int item=0,x=100,y=180,r=30,x2=500,y2=180,r2=30,*pointer; /*主要*/
pointer=&item; /*是一*/
Enemyhp=700; /*些初*/
/*始化*/
/*包括*/
/*战斗*/
cleardevice(); /*画面*/
/*敌人*/
circle(x,y,r); /*生命*/
line(x,y+r,x,y+r+120); /*左边的人物*/ /*值初*/
line(x,y+r+120,x-100,y+r+120+60); /*始化*/
line(x,y+r+120,x+50,y+r+120+30);
line(x+50,y+r+120+30,x+25,y+r+120+60);
line(x,y+r+20,x+100,y+r+20);
line(x+100,y+r+15,x+100,y+r+20);
line(x,y+r+30,x+80,y+r+30);
line(x+80,y+r+25,x+80,y+r+30);
circle(x2,y2,r2); /*右边的人*/
line(x2,y2+r2,x2,y2+r2+120);
line(x2,y2+r2+120,x2+100,y2+r2+120+60);
line(x2,y2+r2+120,x2-50,y2+r2+120+30);
line(x2-50,y2+r2+120+30,x2-25,y2+r2+120+60);
line(x2,y2+r2+20,x2-100,y2+r2+20);
line(x2-70,y2+r2+15,x2-70,y2+r2+25);
for(;;)
{
menu(pointer);
if (item==0) /*当选第一项时攻击*/
{
attack();
}
if (item==1) /*当选第二项时用魔法*/
{
magic();
}
if (Enemyhp<=0) /*攻击结束后,看敌人是否死掉,若是,调用win()函数*/
{
win();
break;
}
attacked(enemyattack); /*每次攻击结束后若敌人未死则会被攻击,参数为敌人的攻击力*/
if (HP<=0) /*如果人物生命值小于0,则调用失败函数*/
{
lose();
Loseornot=1;
break;
}
}
cleardevice();
showmap();
MP+=400; /*每次战斗结束后给人物补充一定的魔法值*/
}
void move(int map[][24]) /*行走函数,主函数中被调用*/
{
for (;;)
{
Lastcolumn=Column;
Lastrow=Row;
switch (bioskey(0))
{
case UP:if (map[Row-2][Column-1]!=1) /*如果人物所在行的上面一行不是砖*/
{
Row-=1; /*人物所在的行变为上一行*/
}
break;
case DOWN:if (map[Row][Column-1]!=1)
{
Row+=1;
}
break;
case LEFT:if (map[Row-1][Column-2]!=1)
{
Column-=1;
}
break;
case RIGHT:if (map[Row-1][Column]!=1)
{
Column+=1;
}
break;
case ESC:goto loop; /*按ESC会退出程序*/
default:break;
}
setfillstyle(1,1); /*将人物上一次所在的行用背景色清除*/
bar(30*(Lastcolumn-1),30*(Lastrow-1),30*(Lastcolumn-1)+28,30*(Lastrow-1)+28);
if (Currentmap[Row-1][Column-1]>=40&&Currentmap[Row-1][Column-1]<=59) /*当人物所在行对应的数组坐标元素值在40到59之间,也就是人物所在点为door*/
{
changemap(Currentmap[0][20],Currentmap[Row-1][Column-1]); /*调用changemap()函数,通过参数可以知道当前在哪张地图,及当前人所在的是哪个door*/
}
if (Currentmap[Row-1][Column-1]>=500)
{ /*当人物所在行对应的数组坐标元素值大于500,也就是人物所在点为door*/
scenario();
if (Loseornot==1||Endornot==1)
{
goto loop;
}
} /*调用剧情函数*/
if (random(100)<0) /*通过这条语句来自由调节遇敌人概率,为了测试方便,就不遇随机敌人了*/
{
fight(80);
if (Loseornot==1)
{
goto loop;
}
}
showface();
}
loop:;
}
main()
{
int i,j,gd=VGA,gm=VGAHI;
initgraph(&gd,&gm,"");
Row=2; /*人物刚开始时在第二行,第二列*/
Column=2;
Lastrow=Row;
Lastcolumn=Column;
start();
invokemap(map1); /*调用第一张地图*/
showmap(); /*显示第一张地图*/
showface(); /*显示人的位置*/
move(Currentmap); /*行走*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -