csp 20160903 炉石传说

在这里插入图片描述在这里插入图片描述在这里插入图片描述
第九周作业A题做了后,我有意识地用面向对象的思想去做这一题,感觉思路确实清晰了很多,写起来很顺畅。
我把召唤随从、攻击的函数全都写到玩家类PLAYER里了。
具体的细节和解释都在代码里了。

#include<iostream>
using namespace std;
struct ATTENDANT{
	int health;//生命值 
	int attack;//攻击力 
};
struct PLAYER{
	int health;//生命值
	int number;//随从个数
	ATTENDANT attendant[8];//0号位置不用,因为0代表着英雄 
	PLAYER()
	{
		health=30;
		number=0;
		for(int i=0;i<8;i++)//初始化 
		{
			attendant[i].attack=0;
			attendant[i].health=0;
		}
	}
	void insert(int pos,int attack,int health)
	{
		if(attendant[pos].health!=0)//该位置已经有随从了
		{
			for(int i=number;i>=pos;i--)//全部后移一位 
			{
				attendant[i+1]=attendant[i];
			}
		} 
		attendant[pos].attack=attack;
		attendant[pos].health=health;
		number++;//随从数+1 
	}
	bool remove(PLAYER &play,int pos1,int pos2)
	{
		if(pos2==0)//被攻击的是英雄
		{
			play.health-=attendant[pos1].attack;
			if(play.health<=0)//游戏结束
			{
				return true;
			}
			return false;
		} 
		else
		{
			//两个随从分别按照对方的攻击力减去生命值 
			play.attendant[pos2].health-=attendant[pos1].attack; 
			attendant[pos1].health-=play.attendant[pos2].attack;
			if(play.attendant[pos2].health<=0) 
			{
				for(int i=pos2+1;i<=play.number;i++)//随从死亡,其余随从的位置全部前移一位 
				{
					play.attendant[i-1]=play.attendant[i];
				}
				play.attendant[play.number].health=0;
				play.attendant[play.number].attack=0;
				play.number--;
			}
			if(attendant[pos1].health<=0)
			{
				for(int i=pos1+1;i<=number;i++)//随从死亡,其余随从的位置全部前移一位 
				{
					attendant[i-1]=attendant[i];
				}
				attendant[number].health=0;
				attendant[number].attack=0;
				number--;
			}
			return false;
		}
	}
}; 
int n;
string command;
int arg1,arg2,arg3;
PLAYER player[2];
int main()
{
	int cnt=0;//用于判断当下是先手玩家的回合还是后手玩家的回合 
	cin>>n;
	for(int k=0;k<n;k++)
	{
		cin>>command;
		if(command[0]=='s')//召唤随从
		{
			cin>>arg1>>arg2>>arg3;
			if(cnt%2==0)//先手玩家
			{
				player[0].insert(arg1,arg2,arg3);
			}
			else//后手玩家 
			{
				player[1].insert(arg1,arg2,arg3);
			}
		} 
		else if(command[0]=='a')//攻击
		{
			cin>>arg1>>arg2;
			bool flag=false;
			if(cnt%2==0)//先手玩家
			{
				flag=player[0].remove(player[1],arg1,arg2);
			} 
			else
			{
				flag=player[1].remove(player[0],arg1,arg2);
			}
			if(flag)//判断是否有英雄死亡 
			{
				break;
			}
		} 
		else//end操作 
		{
			cnt++;//表示回合结束 
		}
	}
	if(player[0].health>0&&player[1].health>0)//游戏未结束
	{
		cout<<0<<endl;
	} 
	else if(player[0].health<=0)
	{
		cout<<-1<<endl;
	}
	else
	{
		cout<<1<<endl;
	}
	cout<<player[0].health<<endl;
	cout<<player[0].number<<" ";
	for(int i=1;i<=player[0].number;i++)
	{
		cout<<player[0].attendant[i].health<<" ";
	}
	cout<<endl;
	cout<<player[1].health<<endl;
	cout<<player[1].number<<" ";
	for(int i=1;i<=player[1].number;i++)
	{
		cout<<player[1].attendant[i].health<<" ";
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值