[大模拟]猫睡觉问题
题意
《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下:
- 玩家会控制一些角色,每个角色有自己的生命值和攻击力。当生命值小于等于 0 时,该角色死亡。角色分为英雄和随从。
* 玩家各控制一个英雄,游戏开始时,英雄的生命值为 30,攻击力为 0。当英雄死亡时,游戏结束,英雄未死亡的一方获胜。
* 玩家可在游戏过程中召唤随从。棋盘上每方都有 7 个可用于放置随从的空位,从左到右一字排开,被称为战场。当随从死亡时,它将被从战场上移除。
* 游戏开始后,两位玩家轮流进行操作,每个玩家的连续一组操作称为一个回合。
* 每个回合中,当前玩家可进行零个或者多个以下操作:
1) 召唤随从:玩家召唤一个随从进入战场,随从具有指定的生命值和攻击力。
2) 随从攻击:玩家控制自己的某个随从攻击对手的英雄或者某个随从。
3) 结束回合:玩家声明自己的当前回合结束,游戏将进入对手的回合。该操作一定是一个回合的最后一个操作。
* 当随从攻击时,攻击方和被攻击方会同时对彼此造成等同于自己攻击力的伤害。受到伤害的角色的生命值将会减少,数值等同于受到的伤害。例如,随从 X 的生命值为 HX、攻击力为 AX,随从 Y 的生命值为 HY、攻击力为 AY,如果随从 X 攻击随从 Y,则攻击发生后随从 X 的生命值变为 HX - AY,随从 Y 的生命值变为 HY - AX。攻击发生后,角色的生命值可以为负数。
本题将给出一个游戏的过程,要求编写程序模拟该游戏过程并输出最后的局面。
思路
1.用一个结构体player
模拟两名玩家
属性有HP vector类型的smd(表示当前召唤的随从) cur(记录当前随从的数量)
结构体Summoned
模拟随从
属性有HP dmg
2.操作的模拟
①.“Summon” 召唤
调用对应玩家的vector的insert函数即可
②.“attack” 攻击
需要特判 攻击对象是否是玩家 如果是则攻击者不会掉血
否则 相当于攻击者与被攻击者互相攻击一次
攻击完后 要判断是否死亡 死亡则从vector中删除
总结
相对来说比较简单的大模拟题(可能是因为太了解规则了叭 (逃
代码
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<vector>
using namespace std;
struct Summoned
{
int hp;
int dmg;
Summoned(int hp,int dmg) {this->hp=hp;this->dmg=dmg;}
};
struct player
{
int HP;
vector<Summoned> smd;
int cur;//当前随从最靠右的位置 也是当前随从的数量
player(int hp) {this->HP=hp;cur=0;}
public:
void fight(int pos,int getattacked)//传入位置和收到的伤害
{
smd[pos-1].hp-=getattacked;
if(smd[pos-1].hp>0) return;//没有死亡
//死亡
auto it=smd.begin();pos-=1;
while(pos--) it++;
smd.erase(it);
return;
}
};
int n;
int main()
{
player p1(30),p2(30);
cin>>n;
int order=0;//order=0代表是p1 否则是p2
while(n--)
{
string s;cin>>s;
if(s=="summon")//召唤
{
int pos,attack,health;
cin>>pos>>attack>>health;
Summoned tmp(health,attack);
if(order==0) p1.smd.insert(p1.smd.begin()+pos-1,tmp);
else p2.smd.insert(p2.smd.begin()+pos-1,tmp);
}else if(s=="attack")
{
int attacker,defender;
cin>>attacker>>defender;
if(order==0)//p1打p2
{
if(defender==0) p2.HP-=p1.smd[attacker-1].dmg;
else
p1.fight(attacker,p2.smd[defender-1].dmg),
p2.fight(defender,p1.smd[attacker-1].dmg);
}else
{
if(defender==0) p1.HP-=p2.smd[attacker-1].dmg;
else
p2.fight(attacker,p1.smd[defender-1].dmg),
p1.fight(defender,p2.smd[attacker-1].dmg);
}
}else if(s=="end") order = ~order;
//cout<<"p1.size:"<<p1.smd.size()<<" p2.size:"<<p2.smd.size()<<endl;
}
if(p1.HP>0&&p2.HP>0) cout<<"0"<<endl;
else if(p1.HP>0) cout<<"1"<<endl;
else if(p2.HP>0) cout<<"-1"<<endl;
cout<<p1.HP<<endl;
cout<<p1.smd.size()<<" ";
for(auto &entry:p1.smd) cout<<entry.hp<<" ";
cout<<endl;
cout<<p2.HP<<endl;
cout<<p2.smd.size()<<" ";
for(auto &entry:p2.smd) cout<<entry.hp<<" ";
system("pause");
return 0;
}