你说得对,但是原神是一款二次元开放世界冒险游戏。
张博坤已经在提瓦特大陆上坚持使用胡桃进行了练习时长两年半的……打火史莱姆(?),终于,他不再满足于此了,他决定去挑战无数原神玩家们闻风丧胆、谈之色变的Boss,蒙德城的四风守护之一——北风王狼!然而由于太过激动,他居然忘记给胡桃装备上圣遗物就上战场了!不过不用担心,作为曾经的大哥,张博坤已经在脑海中将原神即时变幻的战斗机制转变为了简朴单一的回合制,并且为自己的胡桃构思出了一套理想化的出招顺序表(所谓理想化,也就是可以做到E技能之后还可以接E技能,Q技能之后也能接Q技能),在战斗中张博坤会严格的遵循这一套出招表。
但是,张博坤制定的出招表并不一定是完美的,可能并不能让他取得最终的胜利,但是张博坤已经决定开摆了。现在,为了帮助张博坤,请你设计出一个程序来模拟他的战斗过程,给出战斗最终的结果。这样的话,如果张博坤能够提前知道战斗的结果,就可以提前选择改变战术或者去圣遗物本里面继续坐牢了。
张博坤将回合制原神的战斗规则制订如下:
(1)胡桃与Boss双方各自拥有生命值上限Hhp和Ghp;
(2)每一回合都是胡桃先手攻击Boss,然后Boss再攻击胡桃,胡桃的每一次攻击伤害都是Hatk,Boss的每一次攻击伤害都是Gatk;
(3)若某一方的生命值小于等于0,则判断该方被另一方击败了。
(4)若Boss攻击前被胡桃击败,那么胡桃胜出;若胡桃攻击Boss后被Boss击败,那么Boss胜;
胡桃有以下三种攻击方式:
攻击方式0:平a一下,造成伤害值为Hatk
攻击方式1:使用E技能重击一下,会先损失自身当前血量的1/3,之后产生伤害(胡桃当前血量低于50%生命值上限时,伤害为200%Hatk+Hhp*0.1;胡桃当前血量大于等于50%生命值上限时,伤害为150%Hatk+Hhp*0.1)。
攻击方式2:使用Q技能横扫一下,会先产生伤害(胡桃当前血量低于50%生命值上限时,伤害为350%Hatk+Hhp*0.1;胡桃当前血量大于等于50%生命值上限时,伤害为250%Hatk+Hhp*0.1),之后回复自身生命值上限的10%。
注:
(1)胡桃使用E技能损耗血量时,不会让自身生命值等于或小于0。
(2)胡桃使用Q技能时全程处于免伤状态,此时Boss的下一次攻击不对胡桃造成伤害。
(3)胡桃回复自身生命值时,当前的生命值不可能会大于生命值上限。
输入格式:
第一行依次输入Ghp(boss的生命值上限),Hhp(胡桃的生命值上限),Gatk(Boss的攻击力),Hatk(胡桃的平a造成的伤害值)
第二行输入一个N(胡桃N个回合的攻击方式)
第三行依次输入N次胡桃每回合的攻击方式op
输出格式:
如果直到回合结束,Boss和胡桃都尚未分出胜负(双方生命值都大于0),就在第一行中输出Boss的当前血量
如果胡桃胜出,第一行中输出”I am the first fire.”
(引号不输出)
如果Boss胜出,第一行中输出”I want the relic.”
(引号不输出)
第二行输出”Played x rounds”
(x为胡桃战斗的回合总数)
题目保证所有数据都在int范围内(包括数据的计算和输出)。
输入样例:
20000 30000 800 1000
5
0 1 0 2 1
输出样例:
3000
Played 5 rounds
题解代码:
#include<iostream>
using namespace std;
int ghp,hhp,gatk,hatk,now_hhp,rounds;
int N,op;
int main()
{
cin>>ghp>>hhp>>gatk>>hatk;
cin>>N;
now_hhp=hhp;
while(N--){
rounds++;
cin>>op;
switch(op)
{
case 0:{
//平a一下伤害为Hatk
ghp-=hatk;
}break;
case 1:{
// 开小技能重击一下(胡桃当前血量低于50%最大血量时伤害为200%Hatk+Hhp*0.1,
// 胡桃当前血量大于等于50%最大血量时伤害为150%Hatk+Hhp*0.1)。
now_hhp=now_hhp*2/3; //胡桃扣除血量
if(now_hhp<=0) now_hhp=1;
if(now_hhp>=hhp/2) ghp-=1.5*hatk+0.1*hhp;
else ghp-=2*hatk+0.1*hhp;
}break;
case 2:{
// 开大(胡桃当前血量低于50%最大血量时伤害为350%Hatk+Hhp*0.1,
// 胡桃当前血量大于等于50%最大血量时伤害为250%Hatk+Hhp*0.1)。
if(now_hhp>=hhp/2) ghp-=2.5*hatk+0.1*hhp;
else ghp-=3.5*hatk+0.1*hhp;
now_hhp+=0.1*hhp; //胡桃开大回血
if(now_hhp>=hhp) now_hhp=hhp;//若开大回血后的血量大于最大血量,那么当前的血量就是最大血量。
}break;
}
if(ghp<=0) break;
if(op!=2) now_hhp-=gatk;
if(now_hhp<=0) break;
}
if(ghp>=1&&now_hhp>=1) cout<<ghp;
else if(ghp>=1) cout<<"I want the relic.";
else cout<<"I am the first fire.";
cout<<"\nPlayed "<<rounds<<" rounds";
return 0;
}