CSP201609-3 炉石传说

题目要求

题目链接
在这里插入图片描述
在这里插入图片描述

Sample Input

8
summon 1 3 6
summon 2 4 2
end
summon 1 4 5
summon 1 2 1
attack 1 2
end
attack 1 1

Sample Output

0
30
1 2
30
1 2

思路

使用结构体retinue记录英雄或随从,其成员有攻击力、生命值。玩家的角色用二维数组表示,本别表示两位玩家和8个角色,其中retinue[i][0]表示当前玩家的英雄
声明二维数组时使用vector,以便后续的删除插入操作。
玩家的操作有三种:

  • 召唤随从:即vector的插入操作,插入到对应位置。
  • 随从攻击:攻击发生后,由于攻击方不可能使用英雄攻击,故不需要考虑英雄死亡的情况,只需考虑随从死亡的情况。若随从死亡,将随从从数组中删除。
    而被攻击方可能是英雄被攻击,故需要考虑英雄死亡的情况。若随从死亡,将随从删除。若英雄死亡,游戏结束,此时攻击方为获胜方,记录获胜方。
  • 结束回合:即转换攻击方与被攻击方。先手玩家记为0,后手玩家记为1,转换攻击方只需要将当前攻击方更改,即player=1-player

代码

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n,pstn,atck,hlth,attacker,defender;
string action;

struct retinue{
    int attack,health;
    retinue(){}
    retinue(int a,int h){attack=a;health=h;}
};
vector<retinue> ret[2];

void summon(int player){
    vector<retinue>::iterator it=ret[player].begin();
    for(int i=0;i<pstn;i++)it++;
    ret[player].insert(it, retinue(atck,hlth));
}

void attack(int player){
    ret[player][attacker].health-=ret[1-player][defender].attack;
    ret[1-player][defender].health-=ret[player][attacker].attack;
    if(ret[player][attacker].health<=0){//攻击方死亡
        vector<retinue>::iterator it=ret[player].begin();
        for(int i=0;i<attacker;i++)it++;
        ret[player].erase(it);
    }
    if(ret[1-player][defender].health<=0){//被攻击方死亡
        if(defender!=0){//随从死亡
            vector<retinue>::iterator it=ret[1-player].begin();
            for(int i=0;i<defender;i++)it++;
            ret[1-player].erase(it);
        }
    }
}

int main(){
    cin>>n;
    int player=0,winner=0;
    for(int i=0;i<2;i++)
        ret[i].push_back(retinue(0,30));
    while(n--){
        cin>>action;
        if(action=="summon"){
            cin>>pstn>>atck>>hlth;
            summon(player);
        }
        else if(action=="attack"){
            cin>>attacker>>defender;
            attack(player);
            if(winner==0&&ret[1-player][0].health<=0){//被攻击方英雄死亡
                winner=(player==0?1:-1);
            }
        }
        else{
            player=1-player;
        }
    }
    cout<<winner<<endl;
    for(int i=0;i<2;i++){
        cout<<ret[i][0].health<<endl;
        cout<<ret[i].size()-1<<" ";
        for(int j=1;j<ret[i].size();j++)
            cout<<ret[i][j].health<<" ";
        cout<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值