【CCFCSP】201609-3 炉石传说

试题编号: 201609-3
试题名称: 炉石传说
时间限制: 1.0s
内存限制: 256.0MB

场上的两名玩家轮流进行游戏,每个玩家场上最多有7个随从,而场上的随从总是从左到右排列,即在场上不会有空位。
玩家拥有两种操作:召唤(summon)和攻击(attack)。由题意可知,随从的召唤位置在当前场上所有随从最左边和最右边(1到m+1,m代表场上随从数量)之间,即召唤不会使得新的随从和原有随从之间产生空位。如果召唤随从的目标位置已经存在随从,那么改随从和它右边的随从都会向右移动一位(题目规定当场上存在7个随从时一定不会发生召唤)。当一个随从进行攻击时,攻击方和被攻击方的生命值都会减去对方的攻击力,当随从生命值小于等于零就会死亡,此时这个随从右边的所有随从都会向左移动一位,使得随从之间没有空位。
我们可以看到随从总是向左填补空位,只有有新的随从加入时,才会有随从向右移动。因此,可以想到用数组模拟随从的行为,随从的移动就转化为了数组元素的调整。为了使得代码更加清晰,下文中的代码用结构体表示随从和玩家,玩家的结构体中的随从数组用来表示该玩家场上的随从,为了方便起见,下标为0的随从用来记录玩家自己的信息,(因为题目中attack目标值为0时随从攻击对方玩家),同时,在结构体重加入了表示玩家行为(召唤和攻击)的函数。模拟每轮游戏的进行情况,每一回合结束后判断是否有随从死亡,如果有,就对玩家结构体内随从的队列进行调整,但是如果是玩家(下标为0的随从)死亡,就不需要进行调整了,否则会影响战果的判断。
输出结果时,只需要输出结构体中相应元素的值。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
//记录随从的信息
struct Servent {
    int atk, health;
    void attack(Servent &defender) {
        this->health -= defender.atk;
        defender.health -= this->atk;
    }
};
//记录玩家的信息
struct Player {
    int serventNum;
    Servent servent[8];
    Player() {
        serventNum = 0;
        servent[0].health = 30;
    }
    //召唤随从
    void summon(int pos,int at,int heal) {
        //随从移位
        for (int i = serventNum; i >= pos; i--) {
            servent[i + 1] = servent[i];
        }
        servent[pos].health = heal;
        servent[pos].atk = at;
        serventNum++;
    }
    //随从攻击
    void serventAttack(int a, int b,Player &another) {
        servent[a].attack(another.servent[b]);
        //如果随从死亡,调整队列
        if (a != 0 && servent[a].health <= 0) {
            for (int i = a; i<serventNum; i++)
                servent[i] = servent[i + 1];
            serventNum--;
        }
        if (b != 0 && another.servent[b].health <= 0) {
            for (int i = b; i<another.serventNum; i++)
                another.servent[i] = another.servent[i + 1];
            another.serventNum--;
        }
    }
    //输出场上情况
    void printStage() {
        cout << servent[0].health << endl;
        cout << serventNum;
        for (int i = 1; i <= serventNum; i++) {
            cout << ' ' << servent[i].health;
        }
        cout << endl;
    }
}player[2];
int main() {
    int n, round = 0, a, b, c;
    string s;
    cin >> n;
    while (n--) {
        cin >> s;
        if (s[0] == 'e') {
            round = 1 - round;
        }
        else if (s[0] == 's') {
            //召唤随从
            cin >> a >> b >> c;
            player[round].summon(a, b, c);
        }
        else {
            //随从攻击
            cin >> a >> b;
            player[round].serventAttack(a, b,player[1-round]);
        }
    }
    if (player[0].servent[0].health <= 0) cout << -1 << endl;
    else if (player[1].servent[0].health <= 0) cout << 1 << endl;
    else cout << 0 << endl;
    player[0].printStage();
    player[1].printStage();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值