三、消灭终极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 <iostream>
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<<N;
}
else//未战胜BOSS
{
cout<<-1;
}
return 0;
}