2016华为校招上机试题3——消灭终极BOSS

三、消灭终极BOSS
描述:某游戏中,玩家的任务是杀死终极BOSS。BOSS和玩家战斗方式为回合制,玩家先发动进攻。BOSS的攻击方式为:普通攻击和暴击,每4回合普通攻击的下一回合攻击为暴击。BOSS的普通攻击力为10点HP,暴击时的攻击力为普通攻击的3倍。玩家的攻击方式为:普通攻击和魔法攻击。玩家的普通攻击为17点HP,魔法攻击为60点HP。使用魔法攻击时需要消耗10点魔法值,魔法值来源有两种:初始魔法量和回合内选择魔法恢复,魔法恢复速度为4点/回合,魔法恢复回合内无法发动攻击。每轮回合开始时,玩家可以选择:普通攻击、魔法攻击或恢复魔法三种行动方式之一。现已知玩家的HP和初始魔法量,BOSS的HP,编写程序,求玩家战胜BOSS的最小回合数。
输入:输入三个整数输入三个整数HP、MP、HP2(均为0到10000的整数),分别为玩家的HP、玩家的初始魔法量和BOSS的HP。分别为玩家的HP、玩家的初始魔法量和BOSS的HP。
输出:若玩家可以战胜BOSS输出战胜BOSS的最小回合数,否则输出-1。
样例输入:100 20 100
样例输出:2

题目分析:分析题目可知,玩家的普通攻击每回合对BOSS造成17点伤害,魔法攻击每回合对BOSS造成60点伤害。因此在魔法足够的情况下,优先使用魔法攻击。当魔法不够时,就要权衡是花费若干回合恢复魔法还是普通攻击,权衡依赖的三个因素是BOSS的剩余HP、玩家的剩余HP和接下来若干回合玩家需要承受的伤害值(考虑暴击),剩HP要支撑足够的回合数来恢复和使用魔法,且BOSS的剩余HP要足够多。因此,有如下几种情况:
1)魔法值足够且玩家HP不为0的情况下,不论BOSS的HP是多少,直接魔法攻击;
2)若剩余魔法值大于等于6,则只需要1回合就可恢复到10点魔法,此时若玩家的HP足够撑过2回合(因为释放魔法需要1回合),且BOSS的HP大于34(若小于34直接花两回合普通攻击就好了),恢复魔法然后魔法攻击;
3)若剩余魔法值大于等于2,则只需要2回合就可恢复到10点魔法,此时若玩家的HP足够撑过3回合,且BOSS血量大于51,恢复魔法然后魔法攻击;
4)第四种情况比较复杂,若魔法剩余小于2,则恢复魔法要3回合,施放魔法要1回合,这种情况还比不上普通攻击的伤害,但是如果BOSS的HP还足够高,且玩家的HP还可以支撑足够的回合,那么接下来那一次只需要2回合来恢复魔法,这样(3+1)+(2+1)=7回合内可以造成120点伤害,比普通攻击高,因此当BOSS的HP大于120,时间大于7回合时,选择恢复魔法后魔法攻击;
5)如果不满足以上四种条件,表明时间不够恢复魔法或者是BOSS的HP较低,则选择普通攻击。

程序代码:

#include 
using namespace std;
int main()
{
    int BossHP,PlayerHP,MP,N = 0;//N表示回合数,Hurt表示BOSS本回合的伤害值

    cin>>MP>>PlayerHP>>BossHP;//输入

    if(BossHP<=0)//如果Boss初始血量为0
    {
        cout<<0;
        return 0;
    }
    else if(PlayerHP<=0)//如果Boss初始血量不为0并且玩家血量为0
    {
        cout<<-1;
        return 0;
    }

    while(BossHP>0 && PlayerHP>0)
    {
        int Hurt0 = (N%5==4) ? 30:10;       //BOSS本回合的伤害
        int Hurt1 = ((N+1)%5==4) ? 30:10;   //BOSS下一回合的伤害
        int Hurt2 = ((N+2)%5==4) ? 30:10;   //BOSS再下一回合的伤害

        if( MP>=10)                         //魔法足够时——使用魔法
        {
            N++;
            MP = MP - 10;
            BossHP = BossHP - 60;
            PlayerHP = PlayerHP - Hurt0;
            continue;
        }
        else if( MP>=6 && PlayerHP-Hurt0>=0 && BossHP>=34 )//如果M>=6,并且BOSS的HP和玩家的HP都足够的情况下——恢复魔法
        {
            N++;
            PlayerHP = PlayerHP - Hurt0;
            MP = MP + 4;
            continue;
        }
        else if( MP>=2 && PlayerHP-Hurt0-Hurt1>=0 && BossHP>=51 )//如果M>=2,并且BOSS的HP和玩家的HP都足够的情况下——恢复魔法
        {
            N = N + 2;
            PlayerHP = PlayerHP - Hurt0 - Hurt1;
            MP = MP + 8;
            continue;
        }
        else if( BossHP>=120 && PlayerHP>=70)//如果M<2,并且BOSS血量大于等于120、玩家血量大于70时——恢复魔法
        {
            N = N + 3;
            PlayerHP = PlayerHP - Hurt0 - Hurt1 - Hurt2;
            MP = MP + 12;
            continue;
        }
        else//玩家魔法不够、HP也不够,或者BOSS剩余血量很少的情况下——直接普通攻击
        {
            BossHP = BossHP - 17;
            PlayerHP = PlayerHP - Hurt0;
            N++;
        }
    }

    if(BossHP<=0)//战胜BOSS
    {
        cout<else//未战胜BOSS
    {
        cout<<-1;
    }

    return 0;
}

你可能感兴趣的:(C++代码)