csp 20160903 炉石传说
程序员文章站
2022-07-12 20:53:02
...
第九周作业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<<" ";
}
}
上一篇: VScode常用插件
下一篇: Linux下nginx反向代理服务器配置