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
还没有评论,来说两句吧...