CSP-炉石传说 一、题目描述

二、思路与算法

本题不需要高级算法,主要利用数组的插入删除操作,直接对游戏方法进行模拟。

操作主要分为三个:召唤、攻击、end结束。

在召唤时,一个问题是若要在位置i插入新随从,那么原本位置i及其之后位置的元素都要后移,所以直接利用函数,在指定位置插入,后移的操作都有包含。

攻击时,只需要注意双方的生命值都会发生变化,同时,修改完双方生命值后,一定要检查炉石传说,是否有死亡出现。如果随从死亡,就把这个随从从中erase掉,后面位置随从的前移已经包含在erase中。(因为这些后移和前移的操作,比用普通数组方便很多)但如果是英雄死亡,游戏直接结束。

end时,直接更换目前玩家即可。

三、代码实现

#include
#include
#include
using namespace std;
int n=0;
char cur_player='A';   //当前玩家 (玩家A为先手玩家) 
string cur;    //当前命令 
struct sol{
	int hp;   //生命值
	int ak;   //攻击力 
};  
vector<sol> A_sol(0);   //A的随从
vector<sol> B_sol(0);   //B的随从
void Asummon(){   //A召唤 
	int position;
	sol tmp;
	cin>>position>>tmp.ak>>tmp.hp;
	vector<sol>::iterator i=A_sol.begin();
	i=i+position;   //i指向要插入的位置
	A_sol.insert(i,tmp); 
} 
void Bsummon(){   //B召唤 
	int position;
	sol tmp;
	cin>>position>>tmp.ak>>tmp.hp;
	vector<sol>::iterator i=B_sol.begin();
	i=i+position;   //i指向要插入的位置
	B_sol.insert(i,tmp); 
}
void AclearDeath(int position){
	vector<sol>::iterator i=A_sol.begin();
	i=i+position;
	A_sol.erase(i);
}
void BclearDeath(int position){
	vector<sol>::iterator i=B_sol.begin();
	i=i+position;
	B_sol.erase(i);
}
bool Aattack(){   //A攻击 
	int attacker,defender;
	cin>>attacker>>defender;
	A_sol[attacker].hp -=B_sol[defender].ak;
	B_sol[defender].hp -=A_sol[attacker].ak;   //修改双方生命值
	//检查死亡情况
	if(A_sol[attacker].hp<=0){
		AclearDeath(attacker);
	} 
	if(B_sol[defender].hp<=0){
		if(defender==0){return true;	}   //游戏结束 
		BclearDeath(defender); 
	}
	return false;
}
bool Battack(){   //B攻击 
	int attacker,defender;
	cin>>attacker>>defender;
	B_sol[attacker].hp -=A_sol[defender].ak;
	A_sol[defender].hp -=B_sol[attacker].ak;   //修改双方生命值
	//检查死亡情况
	if(B_sol[attacker].hp<=0){
		BclearDeath(attacker);
	} 
	if(A_sol[defender].hp<=0){
		if(defender==0){return true;	}   //游戏结束 
		AclearDeath(defender); 
	}
	return false;
}
void Aoutput(){   //A输出 
	cout<<A_sol[0].hp<<"\n";
	cout<<A_sol.size()-1;
	for(int i=1;i<A_sol.size();i++){
		cout<<" "<<A_sol[i].hp;
	} 
	cout<<"\n";
}
void Boutput(){   //B输出 
	cout<<B_sol[0].hp<<"\n";
	cout<<B_sol.size()-1;
	for(int i=1;i<B_sol.size();i++){
		cout<<" "<<B_sol[i].hp;
	} 
	cout<<"\n";
}
int main(){
	cin>>n;
	sol hero;
	hero.ak=0;		hero.hp=30;
	A_sol.push_back(hero);
	B_sol.push_back(hero);
	for(int i=0;i<n;i++){
		cin>>cur;
		if(cur=="summon"){   //召唤 
			if(cur_player=='A'){  Asummon(); }
			else{   Bsummon();} 
		}
		else{
			if(cur=="attack"){   //攻击 
				bool ans;
				if(cur_player=='A'){	ans=Aattack();}
				else{  ans=Battack();}
				if(ans==true){break;	}    //游戏结束 
			}
			else{   //换手 
				if(cur_player=='A'){cur_player='B';	}
				else{ cur_player='A';	}
			}
		}
	}
	//开始输出 
	if(A_sol[0].hp<=0){cout<<"-1\n";	}   //B win
	else{
		if(B_sol[0].hp<=0){cout<<"1\n";	}   //A win
		else{
			cout<<"0\n";
		}
	}
	Aoutput();
	Boutput();
	return 0;
}

四、经验与总结 本题主要让我了解到容器有关插入和删除的一些用法:

(1)插入

.(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

.(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

.(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

(2)删除

.clear(); //移除容器的所有数据

.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

.erase(pos); //删除pos位置的数据,返回下一个数据的位置。

(内容来自于C++之容器初学(二)——插入和删除)

未经允许不得转载! 作者:admin,转载或复制请以超链接形式并注明出处天心神途传奇手游发布网

原文地址:《CSP-炉石传说》发布于:2023-12-21

发表评论

表情:
验证码
评论列表 (暂无评论,38人围观)

还没有评论,来说两句吧...