一、题目描述
二、思路概述
- 使用一个struct类型character来表示人物,character里面包括生命值、攻击值和标记是否已经有人物了。对每个玩家都有一个数组来存储英雄和随从的信息,0号表示英雄,1-7号表示随从。
- 召唤随从时,要看召唤的位置是否已经有了随从,如果有了的,要把从这个位置往后,都后移一位,如果没有,只要直接放入相应的位置即可。(flag可以用来判断此位置是否有了随从)
- 攻击时,改变对应位置的生命值就可。但是如果英雄被杀死,就直接结束这次攻击,如果某个随从死了,要改变它后面的随从的位置,都提前一位。
- end操作时,改变当前处理的玩家即可,可以用一个bool类型的变量now,来控制。
三、细节
- 第一次是70分,查了一下,感觉大家70分,都是英雄死亡的情况,我看了一下我自己的,把两个英雄死亡时,输出0,1,-1那个地方,搞混了,就出现了错误。真的是,改bug很快,找bug真爽。
四、完整代码
#include<iostream>
using namespace std;
bool now=false ;//用来标记一个当前是哪一个玩家
struct character{//人物
int health;//生命值 当生命值小于等于 0 时,该角色死亡
int attack;//攻击值
int flag;//标记一下当前位置是否已经有人物了
int size;
character(){
health=attack=size=0;
flag=-1;
}
character& operator =(character& c){
health=c.health;
attack=c.attack;
flag=c.flag;
size=c.size;
return *this;
}
};
character cha1[8];character cha2[8];//先手和后手
void summon(character* cha){
//当前玩家在位置<position>召唤一个生命值为<health>、攻击力为<attack>的随从
int position,health,attack;
cin>>position>>attack>>health;
if(cha[position].flag ==-1){//position这个位置没有随从
cha[position].health =health;
cha[position].attack =attack;
cha[position].flag =1;
}
else {
for(int i=cha[0].size+1;i>position ;i--){
cha[i]=cha[i-1];
}
cha[position].health =health;
cha[position].attack =attack;
cha[position].flag =1;
}
cha[0].size++;
}
void attack(character* c1,character* c2){
//当前玩家c1的角色<attacker>攻击对方c2的角色 <defender>
int attacker,defender;
cin>>attacker>>defender;
c1[attacker].health =c1[attacker].health-c2[defender].attack ;
c2[defender].health =c2[defender].health-c1[attacker].attack ;
if(c2[0].health <=0)return;
if(c1[attacker].health<=0){
for(int i=attacker;i<c1[0].size;i++){
c1[i]=c1[i+1];
}
c1[c1[0].size].flag =-1;
//c1[c1[0].size].attack =c1[c1[0].size].health =0;
c1[0].size --;
}
if(c2[defender].health<=0){
for(int i=defender;i<c2[0].size ;i++){
c2[i]=c2[i+1];
}
c2[c2[0].size].flag =-1;
//c2[c2[0].size].attack =c2[c2[0].size].health =0;
c2[0].size --;
}
}
int main(){
cha1[0].health=cha2[0].health=30;//英雄的生命值和攻击力
cha1[0].attack = cha2[0].attack=0;
int n;cin>>n;//指令个数
for(int i=0;i<n;i++){
string command;cin>>command;
if(now==false){
//cout<<"先手"<<endl;
if(command=="summon")summon(cha1);
else if(command=="attack")attack(cha1,cha2);
else if(command=="end")now=true;//??略
}
else{
//cout<<"后手"<<endl;
if(command=="summon")summon(cha2);
else if(command=="attack")attack(cha2,cha1);
else if(command=="end")now=false;
}
}
//指令结束,判断胜负
if(cha1[0].health <=0)cout<<-1<<endl;
else if(cha2[0].health <=0)cout<<1<<endl;
else cout<<0<<endl;
cout<<cha1[0].health <<endl;
cout<<cha1[0].size<<" ";
for(int i=1;i<=cha1[0].size;i++) {
cout<<cha1[i].health <<" ";
}
cout<<endl;
cout<<cha2[0].health <<endl;
cout<<cha2[0].size<<" ";
for(int i=1;i<=cha2[0].size;i++) {
cout<<cha2[i].health <<" ";
}
cout<<endl;
}