[大模拟]Csp201609-3炉石传说

[大模拟]猫睡觉问题

题意

《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下:
在这里插入图片描述

  • 玩家会控制一些角色,每个角色有自己的生命值和攻击力。当生命值小于等于 0 时,该角色死亡。角色分为英雄和随从。
      * 玩家各控制一个英雄,游戏开始时,英雄的生命值为 30,攻击力为 0。当英雄死亡时,游戏结束,英雄未死亡的一方获胜。
      * 玩家可在游戏过程中召唤随从。棋盘上每方都有 7 个可用于放置随从的空位,从左到右一字排开,被称为战场。当随从死亡时,它将被从战场上移除。
      
      * 游戏开始后,两位玩家轮流进行操作,每个玩家的连续一组操作称为一个回合。
      * 每个回合中,当前玩家可进行零个或者多个以下操作:
      1) 召唤随从:玩家召唤一个随从进入战场,随从具有指定的生命值和攻击力。
      2) 随从攻击:玩家控制自己的某个随从攻击对手的英雄或者某个随从。
      3) 结束回合:玩家声明自己的当前回合结束,游戏将进入对手的回合。该操作一定是一个回合的最后一个操作。
      
      * 当随从攻击时,攻击方和被攻击方会同时对彼此造成等同于自己攻击力的伤害。受到伤害的角色的生命值将会减少,数值等同于受到的伤害。例如,随从 X 的生命值为 HX、攻击力为 AX,随从 Y 的生命值为 HY、攻击力为 AY,如果随从 X 攻击随从 Y,则攻击发生后随从 X 的生命值变为 HX - AY,随从 Y 的生命值变为 HY - AX。攻击发生后,角色的生命值可以为负数。
      本题将给出一个游戏的过程,要求编写程序模拟该游戏过程并输出最后的局面。
      在这里插入图片描述
      在这里插入图片描述

思路

1.用一个结构体player模拟两名玩家
属性有HP vector类型的smd(表示当前召唤的随从) cur(记录当前随从的数量)
结构体Summoned 模拟随从
属性有HP dmg

2.操作的模拟
①.“Summon” 召唤
调用对应玩家的vector的insert函数即可

②.“attack” 攻击
需要特判 攻击对象是否是玩家 如果是则攻击者不会掉血
否则 相当于攻击者与被攻击者互相攻击一次
攻击完后 要判断是否死亡 死亡则从vector中删除


总结

相对来说比较简单的大模拟题(可能是因为太了解规则了叭 (逃


代码

#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<vector>
using namespace std;
struct Summoned
{
    int hp;
    int dmg;
    Summoned(int hp,int dmg) {this->hp=hp;this->dmg=dmg;}
};
struct player
{
    int HP;
    vector<Summoned> smd;
    int cur;//当前随从最靠右的位置 也是当前随从的数量
    player(int hp) {this->HP=hp;cur=0;}
    public:
        void fight(int pos,int getattacked)//传入位置和收到的伤害
        {
            smd[pos-1].hp-=getattacked;
            if(smd[pos-1].hp>0) return;//没有死亡
            //死亡
            auto it=smd.begin();pos-=1;
            while(pos--)    it++;
            smd.erase(it);
            return;
        }
};

int n;
int main()
{
    player p1(30),p2(30);
    cin>>n;
    int order=0;//order=0代表是p1 否则是p2 
    while(n--)
    {
        string s;cin>>s;
        if(s=="summon")//召唤
        {
            int pos,attack,health;
            cin>>pos>>attack>>health;
            Summoned tmp(health,attack);
            if(order==0)    p1.smd.insert(p1.smd.begin()+pos-1,tmp);
                else p2.smd.insert(p2.smd.begin()+pos-1,tmp);
        }else if(s=="attack")
        {
            int attacker,defender;
            cin>>attacker>>defender;
            if(order==0)//p1打p2
            {
                if(defender==0) p2.HP-=p1.smd[attacker-1].dmg;
                else
                p1.fight(attacker,p2.smd[defender-1].dmg),
                p2.fight(defender,p1.smd[attacker-1].dmg);
            }else
            {
                if(defender==0) p1.HP-=p2.smd[attacker-1].dmg;
                else
                p2.fight(attacker,p1.smd[defender-1].dmg),
                p1.fight(defender,p2.smd[attacker-1].dmg);
            }
        }else   if(s=="end")    order = ~order;

        //cout<<"p1.size:"<<p1.smd.size()<<" p2.size:"<<p2.smd.size()<<endl;
    }

    if(p1.HP>0&&p2.HP>0)    cout<<"0"<<endl;
    else if(p1.HP>0) cout<<"1"<<endl;
    else if(p2.HP>0) cout<<"-1"<<endl;   

    cout<<p1.HP<<endl;
    cout<<p1.smd.size()<<" ";
    for(auto &entry:p1.smd) cout<<entry.hp<<" ";
    cout<<endl;

    cout<<p2.HP<<endl;
    cout<<p2.smd.size()<<" ";
    for(auto &entry:p2.smd) cout<<entry.hp<<" ";
    system("pause");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值