控制台打怪升级游戏。。。

转载自:https://blog.csdn.net/ojzha/article/details/75182329

#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<time.h>       //suiji      
#include <afx.h>
#include<cstring>
#include<windows.h>          //SLEEP函数
struct Player //玩家结构体,并初始化player
{
    char name[21];
    int attack;
    int defense;
    int health;
    long int max_health;
    int level;
    int exp;
    int range_exp;
    long int max_exp;
}player = { "勇者",50,40,100,100,1,0,0,100 };
struct Enemy  //怪的结构体,并初始化各种怪
{
    char name[20];
    char wupin[12];
    int attack;
    int defense;
    int health;
    int money;
    long int exp;
    int wupin_sign;
    int wupinpro;
    int double_attack;
    int miss;
}strongman = { "森林巨人","黄金圣衣",40,50,350,200,100,1,2,1,0 },
witch = { "森林女巫","银甲",25,15,100,50,50,2,2,1,1 },
xiyi = { "森林蜥蜴","铁甲",18,10,50,30,35,3,3,2,2 },
big_strongman = { "森林巨人王","巨人之臂",40 * 5,50 * 5,350 * 5,200 * 5,100 * 5,4,4,2,0 },
lion = { "草原雄狮","绝世好剑",60,30,280,200,100,5,2,1,0 },
horse = { "草原野马","碧血剑",28,12,90,50,50,6,2,1,1 },
bee = { "草原黄蜂","长剑",17,11,60,30,35,7,3,2,2 },
shitu = { "使徒","",60 * 8,30 * 8,280 * 8,200 * 8,100 * 8,9,1,1,0 },
guai = { "","",0,0,0,0,0,0,0,0,0 };
struct Place
{
    int bar, hotel, forest1, forest2, forest3, grass1, grass2, grass3;
}place = { 1,2,3,4,5,6,7,8 };
int max_exp = 0;
int choose_number = 0, s = 0, strongman_arm = 0, battle = 0, money = 500, place_sign = 9;
int cao = 3, jijiubao = 2, baiyao = 2, superbaiyao = 1, boom = 3, dubiao = 2, atom_boom = 1;
int fang = 0, fang1 = 10, fang1n = 0, fang2 = 20, fang2n = 0, fang3 = 40, fang3n = 0, fang4 = 100, fang4n = 0;
int gong = 0, gong1 = 8, gong1n = 0, gong2 = 15, gong2n = 0, gong3 = 25, gong3n = 0, gong4 = 60, gong4n = 0;
char gongname[20] = "", fangname[20] = "";
char proof;
void AddWupin(int);
int AttackResult();
void BattleAct();
void ChooseWupin();
void DisplayState();
void OrdinaryAct();
int SuiJi();
int SuiJi100();
void WhetherLevelUp();
void SlowDisplay(CString p);
int main()
{
    using namespace std;
    int i = 0, j = 0, k = 0;
    char player_name[21];
    SlowDisplay("这是一个勇者的世界!  gdfzoj的逸宁公主被陌生人绑架了!

 伟大的勇者啊~拿起你们的武器,营救逸宁公主!


输入你的名字:   (20个字符)


");
    //    sndPlaySound("res\F005.wav",SND_LOOP);
    cin >> player_name;
    system("cls");
    //SlowDisplay("你叫fzj


");
    system("pause");
    system("cls");
    strncpy_s(player.name, player_name, 20);
    if (strcmp(player.name, "fzj") == 0) {
        SlowDisplay("封号多年的 fzj 啊!你终于可以重见天日了!


 fzj 重新启动...      随即...     暴走!!!


attack=999
defence=999
health=9999
healthmax=9999");
        player.attack = 500;
        player.defense = 400;
        player.health = 1000;
        player.max_health = 1000;
    }
    getchar();
    OrdinaryAct();
    return 0;
}
int SuiJi()
{
    srand((unsigned)time(NULL));
    return rand() % 10;
}
int SuiJi100()
{
    srand((unsigned)time(NULL));
    return rand() % 100;
}
void ChooseWupin()                         //选择物品 并使用
{
    printf("物品: 1,止血草%d个 2,急救包%d个 3,云南白药%d个 4,超级云南白药%d个 5,手雷%d个 6,毒标%d个 7,手抛式原子弹%d个 0,返回


", cao, jijiubao, baiyao, superbaiyao, boom, dubiao, atom_boom);
    switch (scanf_s("%d", &choose_number), choose_number)
    {
    case 1:
        if (cao > 0)
        {
            SlowDisplay("使用止血草,HP增加60


");
            cao--;
            if (player.health + 60 > player.max_health)player.health = player.max_health;
            else player.health += 60;
        }
        else SlowDisplay("没有止血草了


");
        break;
    case 2:
        if (jijiubao > 0)
        {
            SlowDisplay("使用急救包,HP增加80


");
            jijiubao--;
            if (player.health + 80 > player.max_health)player.health = player.max_health;
            else player.health += 80;
        }
        else SlowDisplay("没有急救包了


");
        break;
    case 3:
        if (baiyao > 0)
        {
            SlowDisplay("使用云南白药,HP增加120


");
            baiyao--;
            if (player.health + 120 > player.max_health)player.health = player.max_health;
            else player.health += 120;
        }
        else SlowDisplay("没有云南白药了


");
        break;
    case 4:
        if (superbaiyao > 0)
        {
            SlowDisplay("使用超级云南白药,HP增加200


");
            superbaiyao--;
            if (player.health + 200 > player.max_health)player.health = player.max_health;
            else player.health += 200;
        }
        else SlowDisplay("没有超级云南白药了


");
        break;
    case 5:
        if (battle)                   //在战斗中(battle=1),否则(battle=0)不能使用攻击性物品
        {
            if (boom > 0)
            {
                SlowDisplay("使用手雷,敌人HP减少100


");
                boom--;
                guai.health -= 100;
                AttackResult();
            }
        }
        else SlowDisplay("非战斗状态,不能使用手雷!


");
        break;
    case 6:
        if (battle)                   //在战斗中(battle=1),否则(battle=0)不能使用攻击性物品
        {
            if (dubiao > 0)
            {
                SlowDisplay("使用毒标,敌人HP减少200


");
                dubiao--;
                guai.health -= 200;
                AttackResult();
            }
        }
        else SlowDisplay("非战斗状态,不能使用毒标!


");
        break;
    case 7:
        if (battle)                   //在战斗中(battle=1),否则(battle=0)不能使用攻击性物品
        {
            if (atom_boom > 0)
            {
                SlowDisplay("使用手抛式原子弹,敌人HP减少500


");
                atom_boom--;
                guai.health -= 500;
                AttackResult();
            }
        }
        else SlowDisplay("非战斗状态,不能使用手抛式原子弹!


");
        break;
    case 0:break;
    default:printf("ChooseWupin error!


");
    }
}
int AttackResult()                      //攻击结果:判断是否获胜 是否获得物品 和 是否升级
{
    if (guai.health <= 0)
    {
        battle = 0;
        printf("战斗胜利!获得金币%d,经验%d


", guai.money, guai.exp);
        player.exp += guai.exp;
        player.range_exp += guai.exp;
        money += guai.money;
        s = SuiJi();
        if (s < guai.wupinpro)
        {
            SlowDisplay("从敌人尸骸中发现");
            printf("%s


", guai.wupin);
            AddWupin(guai.wupin_sign);
        }
        WhetherLevelUp();
        if (strcmp(guai.name, "使徒") == 0)
        {
            puts("战斗胜利,救出逸宁公主!!!");
            getchar();
            getchar();
            exit(0);
        }
        return 1;                 //攻击有结果了返回1,否则返回0,用于判断是否继续做战斗行为
    }
    else 
    {
         int s = SuiJi();
         if ((guai.attack + s - player.defense / 3) < 0)
         {
             player.health -= 1;
             printf("%s反击,你的HP减少了 1

",guai.name);
         }
         else
         {
             player.health -= guai.attack + s - player.defense / 3;
             printf("%s反击,你的HP减少了%d

",guai.name,guai.attack + s - player.defense / 3);
         }
         if (player.health < 0)
         {
             battle = 0;
             printf("%s战死!金币掉落%d


",player.name,player.level * 500);
             money -= player.level * 500;
             player.health = player.max_health / 5;
             OrdinaryAct();//////////
             return 1;
         }
    }
    return 0;
}
void AddWupin(int wupin_sign)
{
    switch (wupin_sign)
    {
    case 1:fang4n++;        break;
    case 2:fang3n++;        break;
    case 3:fang2n++;        break;
    case 4:strongman_arm = 1; break;
    case 5:gong4n++;        break;
    case 6:gong3n++;        break;
    case 7:gong2n++;        break;
    default:printf("AddWupin error


");
    }
}
void WhetherLevelUp()
{
    int i = 0, j = 0;
    int l1 = player.range_exp / 100;
    int l2 = player.range_exp / 300;
    int l3 = player.range_exp / 600;
    if (player.level <= 15 && l1 > 0)                     //15级以下,经验足够 都满足则升级
    {
        if (l1 == 1)
        {
            printf("%s", player.name);
            SlowDisplay("   升级!


攻击力+3, 防御力+2, HP上限+20


");
            player.exp = player.exp + guai.exp - (player.exp + guai.exp) % 100;
            player.attack += 3;
            player.defense += 2;
            player.max_health += 20;
            player.health = player.max_health;
            player.level++;
            player.range_exp = 0;
            player.exp = player.max_exp;
            player.max_exp += 100;
        }
        else
        {
            printf("好厉害!连升%d级!", l1);
            printf("攻击力+%d, 防御力+%d, HP上限+%d


", 3 * l1, 2 * l1, 20 * l1);
            player.exp = player.exp + guai.exp - (player.exp + guai.exp) % 100;
            player.attack += 3 * l1;
            player.defense += 2 * l1;
            player.max_health += 20 * l1;
            player.health = player.max_health;
            player.level += l1;
            player.range_exp = 0;
            player.exp = player.max_exp;
            player.max_exp += 100 * l1;
        }
    }
    else if (player.level <= 40 && l2 > 0)
    {
        if (l2 == 1)
        {
            printf("%s", player.name);
            SlowDisplay("   升级!


攻击力+3, 防御力+2, HP上限+20


");
            player.exp = player.exp + guai.exp - (player.exp + guai.exp) % 100;
            player.attack += 3;
            player.defense += 2;
            player.max_health += 20;
            player.health = player.max_health;
            player.level++;
            player.range_exp = 0;
            player.exp = player.max_exp;
            player.max_exp += 300;
        }
        else
        {
            printf("好厉害!连升%d级!", l1);
            printf("攻击力+%d, 防御力+%d, HP上限+%d


", 3 * l2, 2 * l2, 20 * l2);
            player.exp = player.exp + guai.exp - (player.exp + guai.exp) % 100;
            player.attack += 3 * l2;
            player.defense += 2 * l2;
            player.max_health += 20 * l2;
            player.health = player.max_health;
            player.level += l2;
            player.range_exp = 0;
            player.exp = player.max_exp;
            player.max_exp += 300 * l2;
        }
    }
    else if (l3 > 0)
    {
        if (l3 == 1)
        {
            printf("%s", player.name);
            SlowDisplay("   升级!


攻击力+3, 防御力+2, HP上限+20


");
            player.exp = player.exp + guai.exp - (player.exp + guai.exp) % 100;
            player.attack += 3;
            player.defense += 2;
            player.max_health += 20;
            player.health = player.max_health;
            player.level++;
            player.range_exp = 0;
            player.exp = player.max_exp;
            player.max_exp += 600;
        }
        else
        {
            printf("好厉害!连升%d级!", l1);
            printf("攻击力+%d, 防御力+%d, HP上限+%d


", 3 * l3, 2 * l3, 20 * l3);
            player.exp = player.exp + guai.exp - (player.exp + guai.exp) % 100;
            player.attack += 3 * l3;
            player.defense += 2 * l3;
            player.max_health += 20 * l3;
            player.health = player.max_health;
            player.level += l3;
            player.range_exp = 0;
            player.exp = player.max_exp;
            player.max_exp += 600 * l3;
        }
    }
}
void OrdinaryAct()                    //正常行为菜单(移动,物品,对话,查看状态,装备,退出游戏)
{

    while (1)
    {
        //            (1000);
        //            system("cls");
        puts("=============================================================================");
        printf("要做什么?


   1,移动  2,道具  3,对话  4,查看状态  5,装备  0,退出游戏


");
        puts("=============================================================================");
        switch (scanf_s("%d", &choose_number), choose_number)
        {
        case 1:                                    //显示移动菜单
            SlowDisplay("要去哪里?


");
            printf("1,酒吧 2,旅馆 3,森林一层 4,森林二层 5,森林三层 6,草原一层 7,草原二层 8,草原三层


");
            switch (scanf_s("%d", &choose_number), choose_number)
            {
            case 1:place_sign = place.bar;                        //记录目前位置-酒吧
        //           OrdinaryAct();
                break;
            case 2:place_sign = place.hotel;                      //进入旅店
                SlowDisplay("要住店吗? 200个金币 1,是  0,否


");
                choose_number = 1;
                switch (scanf_s("%d", &choose_number), choose_number)
                {
                case 1:if (money - 200 < 0)                       //判断钱是否够
                {
                    SlowDisplay("Sorry,你的钱不够~


");
                }
                       else 
                       {
                            SlowDisplay("好好休息
	HP满
		第二天了

");
                            money -= 200;                         //花费200住店费
                            player.health = player.max_health;    //体力满
                       }
                       break;
                case 0:SlowDisplay("下次再来!


"); break;
                default:printf("hotel talk error!


");
                }
                place_sign = 0;
                break;
            case 3:
                place_sign = place.forest1;
                s = SuiJi();
                if (s < 7)
                {
                    battle = 1;
                    guai = xiyi;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else if (s < 9)
                {
                    battle = 1;
                    guai = witch;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else
                {
                    SlowDisplay("这里安全


");
                    //不用调用OAct函数,会自动执行OAct函数;
                }
                break;
            case 4:
                place_sign = place.forest2;
                s = SuiJi();
                if (s < 7)
                {
                    battle = 1;
                    guai = witch;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else if (s < 9)
                {
                    battle = 1;
                    guai = strongman;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else
                {
                    SlowDisplay("这里安全


");
                }
                break;
            case 5:
                place_sign = place.forest3;
                s = SuiJi();

                battle = 1;
                guai = big_strongman;
                printf("%s扑了过来!


", guai.name);
                BattleAct();

                break;
            case 6:
                place_sign = place.grass1;
                s = SuiJi();
                if (s < 7)
                {
                    battle = 1;
                    guai = bee;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else if (s < 9)
                {
                    battle = 1;
                    guai = horse;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else
                {
                    SlowDisplay("这里安全


");
                }
                break;
            case 7:
                place_sign = place.grass2;
                s = SuiJi();
                if (s < 7)
                {
                    battle = 1;
                    guai = horse;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else if (s < 9)
                {
                    battle = 1;
                    guai = lion;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else
                {
                    SlowDisplay("这里安全


");
                }
                break;
            case 8:
                place_sign = place.grass3;
                s = SuiJi();
                if (s < 7)
                {
                    battle = 1;
                    guai = lion;
                    printf("%s扑了过来!


", guai.name);
                    BattleAct();
                }
                else if (s < 9)
                {
                    battle = 1;
                    if (strongman_arm)
                    {
                        SlowDisplay("神秘老人:


    哈哈,年轻人,做的不错,不过...嘿嘿,你上当啦!巨人之臂我要了,逸宁公主你也别想带走!


");
                        guai = shitu;
                        printf("%s扑了过来!


", guai.name);
                        BattleAct();
                    }
                    else SlowDisplay("神秘老人:


    年轻人,你好啊.如果你有巨人之臂,我可以告诉你逸宁的下落哦~


");
                }
                else
                {
                    SlowDisplay("这里安全


");
                }
                break;
            default:printf("choose map error!


");
            }
            break;
        case 2:   ChooseWupin(); break;              //显示道具,并可以使用.
        case 3:                                               //对话选项
            if (place_sign == place.bar)
            {
                SlowDisplay("要和谁说话?


1,红发女郎 2,赏金猎人 3,酒吧老板


");     //显示对话人物
                switch (scanf_s("%d", &choose_number), choose_number)
                {
                case 1:
                    SlowDisplay("红发女郎:


    我们一起xxx吧!(~脸红~)


听说你经常外出打猎,外面的路你应该很熟悉的!


");
                    break;
                case 2:
                    if (fang1n < 1 && gong1n < 1)
                    {
                        SlowDisplay("赏金猎人:


    你要救逸宁啊!好胆量!


    不过外面的丛林和草原很险恶,而且越深越危险,这是匕首和布衣,对你会有些帮助的,拿去吧!


");
                        printf("%s心想:(哇,这位大叔人真好啊!


)", player.name);
                        gong1n++;
                        fang1n++;
                    }
                    else SlowDisplay("赏金猎人:


    加油吧,年轻人!


    不要被外面丛林和草原所吓倒!


");
                    break;
                case 3:
                    printf("要喝点什么?(逸宁水)


    1,二锅头25金币 HP+20  2,XO酒80金币 HP+50  3,人头马面150金币 HP+100  0,返回


");
                    choose_number = 1;
                    while (choose_number)
                    {
                        switch (scanf_s("%d", &choose_number), choose_number)
                        {
                        case 1:if (money < 25)
                        {
                            SlowDisplay("钱不够!");
                        }
                               else
                        {
                            if (player.health + 20 <= player.max_health)
                            {
                                SlowDisplay("HP+20.");
                                money -= 25;
                                player.health += 20;
                            }
                            else
                            {
                                SlowDisplay("HP满了");
                                player.health = player.max_health;
                            }
                        }
                               break;
                        case 2:if (money < 80)
                        {
                            SlowDisplay("钱不够!");
                        }
                               else
                        {
                            if (player.health + 50 <= player.max_health)
                            {
                                SlowDisplay("HP+50.");
                                money -= 80;
                                player.health += 50;
                            }
                            else
                            {
                                SlowDisplay("HP满了");
                                player.health = player.max_health;
                            }
                        }
                               break;
                        case 3:if (money < 150)
                        {
                            SlowDisplay("钱不够!");
                        }
                               else
                        {
                            if (player.health + 100 <= player.max_health)
                            {
                                SlowDisplay("HP+100.");
                                money -= 150;
                                player.health += 100;
                            }
                            else
                            {
                                SlowDisplay("HP满了");
                                player.health = player.max_health;
                            }
                        }
                               break;
                        case 0:SlowDisplay("下次在来!
"); break;
                        default:SlowDisplay("输入错误


");
                        }
                    }
                }
            }
            else if (place_sign == place.hotel)
                SlowDisplay("“老板娘!我...”


“我忙着呢,没空理你~”


");
            else SlowDisplay("这里好像没人可以聊天


");
            break;
        case 4:   DisplayState(); break;             //显示状态
        case 5:                                 //装备
            printf("攻装: 1,匕首:%d个 2,长剑:%d个 3,碧血剑:%d个 4,绝世好剑:%d个


", gong1n, gong2n, gong3n, gong4n);
            printf("防装: 5,布衣:%d个 6,铁甲:%d个 7,银甲:%d个   8,黄金圣衣:%d个		0,返回


", fang1n, fang2n, fang3n, fang4n);
            SlowDisplay("选择要装备的武器或防具:


");
            switch (scanf_s("%d", &choose_number), choose_number)
            {
            case 1:if (gong1n >= 1)
            {
                SlowDisplay("拿起了匕首


");
                gong = gong1;
                strcpy_s(gongname, "匕首");
            }
                   else SlowDisplay("你没有匕首可以装备


");
                break;
            case 2:if (gong2n >= 1)
            {
                SlowDisplay("拿起了长剑


");
                gong = gong2;
                strcpy_s(gongname, "长剑");
            }
                   else SlowDisplay("你没有长剑可以装备


");
                break;
            case 3:if (gong3n >= 1)
            {
                SlowDisplay("拿起了碧血剑


");
                gong = gong3;
                strcpy_s(gongname, "碧血剑");
            }
                   else SlowDisplay("你没有碧血剑可以装备


");
                break;
            case 4:if (gong4n >= 1)
            {
                SlowDisplay("拿起了绝世好剑


");
                gong = gong4;
                strcpy_s(gongname, "绝世好剑");
            }
                   else SlowDisplay("你没有绝世好剑可以装备


");
                break;
            case 5:if (fang1n >= 1)
            {
                SlowDisplay("穿上了布衣


");
                fang = fang1;
                strcpy_s(fangname, "布衣");
            }
                   else SlowDisplay("你没有布衣可以装备


");
                break;
            case 6:if (fang2 >= 1)
            {
                SlowDisplay("穿上了铁甲


");
                fang = fang2;
                strcpy_s(fangname, "铁甲");
            }
                   else SlowDisplay("你没有铁甲可以装备


");
                break;
            case 7:if (fang3n >= 1)
            {
                SlowDisplay("穿上了银甲


");
                fang = fang3;
                strcpy_s(fangname, "银甲");
            }
                   else SlowDisplay("你没有银甲可以装备


");
                break;
            case 8:if (fang4n >= 1)
            {
                SlowDisplay("穿上了黄金圣衣


");
                fang = fang4;
                strcpy_s(fangname, "黄金圣衣");
            }
                   else SlowDisplay("你没有黄金圣衣可以装备


");
                break;
            case 0:SlowDisplay("未更换装备


"); break;
            default:printf("change error!");
            }
            break;
        case 0:
            SlowDisplay("确定退出游戏?(Y/N)


");
            getchar();
            proof = getchar();
            if (proof == 'y' || proof == 'Y')
            {
                SlowDisplay("数据存储中...");
                //向文件中更新数据;
                getchar();
                SlowDisplay("按回车退出");
                getchar();
                return;
            }
            else if (proof == 'n' || proof == 'N')printf("继续游戏!


");
            else SlowDisplay("继续!


");
            break;
        default:SlowDisplay("输入错误!


");
        }
    }
}
void DisplayState()
{
    printf("%s 攻击力:%d+%d=%d  防御力:%d+%d=%d  HP:%d/%d 


", player.name, player.attack, gong, player.attack + gong, player.defense, fang, player.defense + fang, player.health, player.max_health);
    printf("武器: %s 防具: %s 


", gongname, fangname);
    printf("等级:%d  经验:%d/%d 还需要%d经验升级 金币:%d 


", player.level, player.exp, player.max_exp, player.max_exp - player.exp, money);
}
void BattleAct()
{
    while (1)
    {
        puts("=============================================================================");
        printf("要怎么办?


    1,攻击 2,物品 3,查看状态 4,逃跑


");
        switch (scanf_s("%d", &choose_number), choose_number)
        {
        case 1:
            s = SuiJi();
            printf("%s攻击! %sHP减少%d


", player.name, guai.name, player.attack + s + gong - guai.defense / 3);
            guai.health -= player.attack + s + gong - guai.defense / 3;
            if (AttackResult())return;    //如果攻击有结果(敌人或玩家战死)退出函数
            else continue;
        case 2: ChooseWupin(); break;    //选择物品,可以使用,战斗中允许使用攻击性物品
        case 3:DisplayState(); break;     //显示状态
        case 4:
            s = SuiJi();
            if (s < 4)    //40%的概率可以逃跑
            {
                printf("%s逃跑了~


", player.name);
                battle = 0;
                return;
            }
            else printf("%s逃跑失败!


", player.name);
            break;
        default:SlowDisplay("输入错误,重新输入!


");
        }
    }
}
void SlowDisplay(CString p)
{
    std::cout << p;
}
原文地址:https://www.cnblogs.com/feicaixian/p/12129365.html