题目描述
基本思路
本题是一道模拟题,主要在如何进行模拟。
- 回合: 可以使用一个整数p,0代表先手回合,1代表后手回合。
- 英雄或随从: 使用一个结构体Sorder,其中包含hp和att,分别表示生命值和攻击力。
-
战场: 使用
vector<Sorder> v[2]
来表示,其中v[0]表示先手阵营,v[1]表示后手阵营,v[0][0]和v[1][0]分别表示先手英雄和后手英雄,v[1]和v[0]中的其余元素表示响应的随从。 -
创建随从和随从死亡事件: 利用
vector
的
insert
和
erase
方法即可实现。 - 攻击事件: 双方的体力分别减去对方的攻击力,当有一方体力为0时,触发相应的死亡事件。
完整代码
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int n, a, b, c;
string cmd;
struct Sorder{
int hp;
int att;
Sorder(int a=0, int h=30)
{
att = a;
hp = h;
}
};
vector<Sorder> v[2];
int p; //指向当前回合玩家
int winner;
void summon(int pos, int atk, int heth)
{
v[p].insert(v[p].begin()+pos, Sorder(atk, heth));
}
void attack(int atk, int ded)
{
v[p][atk].hp -= v[1-p][ded].att;
v[1-p][ded].hp -= v[p][atk].att;
if(v[p][atk].hp<=0) v[p].erase(v[p].begin()+atk);
if(v[1-p][ded].hp<=0)
{
if(ded == 0)
{
if(p) winner=-1;
else winner=1;
}
else v[1-p].erase(v[1-p].begin()+ded);
}
}
void _end()
{
p = 1-p;
}
void summary()
{
cout<<winner<<endl;
for(int j=0;j<2;j++)
{
cout<<v[j][0].hp<<endl;
cout<<v[j].size()-1;
for(int i=1;i<v[j].size();i++) cout<<" "<<v[j][i].hp;
cout<<endl;
}
}
int main ()
{
for(int i=0;i<2;i++) v[i].push_back(Sorder());
cin>>n;
for(int i=0;i<n;i++)
{
cin>>cmd;
if(cmd == "summon")
{
cin>>a>>b>>c;
summon(a, b, c);
}
else if(cmd == "attack")
{
cin>>a>>b;
attack(a, b);
}
else _end();
}
summary();
return 0;
}
版权声明:本文为pgsld2333原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。