CSP-炉石传说

CSP-炉石传说

一、题目描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、思路与算法

本题不需要高级算法,主要利用vector数组的插入删除操作,直接对游戏方法进行模拟。
操作主要分为三个:summon召唤、attack攻击、end结束。
在召唤时,一个问题是若要在位置i插入新随从,那么原本位置i及其之后位置的元素都要后移,所以直接利用insert函数,在指定位置插入,后移的操作insert都有包含。
攻击时,只需要注意双方的生命值都会发生变化,同时,修改完双方生命值后,一定要检查,是否有死亡出现。如果随从死亡,就把这个随从从vector中erase掉,后面位置随从的前移已经包含在erase中。(因为这些后移和前移的操作,vector比用普通数组方便很多)但如果是英雄死亡,游戏直接结束。
end时,直接更换目前玩家即可。

三、代码实现

#include<iostream>
#include<string>
#include<vector>
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. 本题主要让我了解到vector容器有关插入和删除的一些用法:
    (1)插入
    vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
    vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
    vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
    (2)删除
    vector.clear(); //移除容器的所有数据
    vector.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
    vector.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
    (内容来自于C++之vector容器初学(二)——插入和删除
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值