欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

csp 20160903 炉石传说

程序员文章站 2022-07-12 20:53:02
...

csp 20160903 炉石传说csp 20160903 炉石传说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<<" ";
	}
}
相关标签: csp c++