CSP 201609-3 炉石传说(C++)

  • Post author:
  • Post category:其他




题目描述

在这里插入图片描述



基本思路

本题是一道模拟题,主要在如何进行模拟。

  1. 回合: 可以使用一个整数p,0代表先手回合,1代表后手回合。
  2. 英雄或随从: 使用一个结构体Sorder,其中包含hp和att,分别表示生命值和攻击力。
  3. 战场: 使用

    vector<Sorder> v[2]

    来表示,其中v[0]表示先手阵营,v[1]表示后手阵营,v[0][0]和v[1][0]分别表示先手英雄和后手英雄,v[1]和v[0]中的其余元素表示响应的随从。
  4. 创建随从和随从死亡事件: 利用

    vector



    insert



    erase

    方法即可实现。
  5. 攻击事件: 双方的体力分别减去对方的攻击力,当有一方体力为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 版权协议,转载请附上原文出处链接和本声明。