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

📄 treasure.c

📁 西工大程序设计大赛作品 拿出来与大家分享 含完整工作日记 历史备分 源代码及注释 RPG(role-playing game,角色扮演类游戏) 战斗用菜单操作:一级菜单有两项
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -