csp-201609-3炉石传说

思路
题目思路很直接,需要注意一下细节:
1.生成新的随从,生成操作有三个参数:位置、攻击力,血量。当该随从的位置有随从时,将原来该位置处的随从和右侧的随从都右移一位。
2.当随从的血量为0或负时,进行删除,右侧随从左移一位
3.命令随从进行攻击,攻击操作有两个参数:主动攻击己方随从的位置,被攻击的敌方随从或玩家的位置(0表示玩家,1-7表示随从)
a.如果攻击的目标是玩家,玩家减掉攻击者的血量;
b.如果攻击的目标是随从,被攻击随从减掉攻击者的血量,攻击者减掉被攻击者的血量。
c.如果攻击造成玩家血量少于0,则本次程序的胜负结果决定,如果被攻击随从的血量少于0,则该随从消失,进行删除
4.结束回合操作,交换主动方(用参数flag标记哪方即可)。

代码

#include<iostream>
#include<cstring>
using namespace std;
string str;int vv1=0;int vv2=0;
struct att
{
	int pos;
	int attack;
	int hea;
};
att attacker[10],defender[10];bool flag=0;
int v1=30,v2=30;
void print(int kk)
{	cout<<kk<<endl;cout<<v1<<endl;
		cout<<vv1<<" ";
		for(int j=1;j<=vv1;j++)
		cout<<attacker[j].hea<<" ";
		cout<<endl;
		cout<<v2<<endl;
	    cout<<vv2<<" ";
		for(int j=1;j<=vv2;j++)
		cout<<defender[j].hea<<" ";
		cout<<endl;	 
}
void solve(int a,int p)
{
	if(attacker[a].hea<=0)
	 {
		for(int j=a;j<vv1;j++)
		{
	    attacker[j].pos=attacker[j+1].pos;
		attacker[j].attack=attacker[j+1].attack;
		attacker[j].hea=attacker[j+1].hea;
		}	vv1--;
	}
	if(defender[p].hea<=0)
	{
	for(int j=p;j<vv2;j++)
	{
	defender[j].pos=defender[j+1].pos;
	defender[j].attack=defender[j+1].attack;
	defender[j].hea=defender[j+1].hea;
	}	vv2--;
	}	  
}
int main()
{
	int n;cin>>n;int count=0;
	for(int i=1;i<=n;i++)
	{
		cin>>str;
		if(str[0]=='e')
		{
			flag=1-flag;continue;
		}
		if(flag==0)
		{
				if(str[0]=='s')
		    {
		    	int p,a,h;cin>>p>>a>>h;
		    	for(int j=vv1+1;j>p;j--)
		     	{
				   attacker[j].pos=attacker[j-1].pos;
				   attacker[j].attack=attacker[j-1].attack;
				   attacker[j].hea=attacker[j-1].hea;
		    	}attacker[p].pos=p;attacker[p].attack=a;
		    	attacker[p].hea=h;
			   vv1++;
	     	}
	     	if(str[0]=='a')
	     	{
	     		int a,p;cin>>a>>p;
	     		if(p==0)//英雄
				 {
				 	v2=v2-attacker[a].attack;
				 	if(v2<=0)
				 	count=1; 
					 }
				else
				{
									  //攻击随从
				  attacker[a].hea-=defender[p].attack;
				  defender[p].hea-=attacker[a].attack;
			     solve(a,p);
				}
	
	    	}
		}
		if(flag==1)
	    {
	    	if(str[0]=='s')
		    {
		    	int p,a,h;cin>>p>>a>>h;
		    	for(int j=vv2+1;j>p;j--)
		     	{
				   defender[j].pos=defender[j-1].pos;
				   defender[j].attack=defender[j-1].attack;
				   defender[j].hea=defender[j-1].hea;
		    	}defender[p].pos=p;defender[p].attack=a;
		    	defender[p].hea=h;
			   vv2++;
	     	}
	     	if(str[0]=='a')
	     	{
	     		int a,p;cin>>a>>p;
	     		if(p==0)//英雄
				 {
				 	v1=v1-defender[a].attack;
				 	if(v1<=0)
				 	count=-1;	 	 
					 }
					else
					{
										  //攻击随从
				  attacker[p].hea-=defender[a].attack;
				  defender[a].hea-=attacker[p].attack;
				 solve(p,a);
					}
		
			 }
		}		
	}
print(count); return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值