SDUT4377->最终之战

#include<bits/stdc++.h>
using namespace std;
struct node                    //node为妖精循环攻击兽的结构体
{
    char name[10],wep[11];    //name为名字,wep为圣剑
    int HP,att,har,v;         //HP为血量,att为初始攻击值,har为初始防御值,v为速度,hurt为伤害
    int hurt;
} q,r;
struct nodee                //nodee为兽的结构体
{
    int v,har,att,HP; //含义同上
}p[10];
int main()
{
    queue<node>que;               //que为循环妖精的队列
    for(int i=0; i<4; i++)
    {
        cin>>q.name>>q.HP>>q.att>>q.har>>q.v>>q.wep;//依次输入信息,计算初始伤害,并让4个妖精进队列
        q.hurt=q.att;
        if(q.wep[0]=='P')
            q.hurt+=78;
        else if(q.wep[0]=='C')
            q.hurt+=43;
        else if(q.wep[0]=='V')
            q.hurt+=110;
        else if(q.wep[0]=='I')
            q.hurt+=23;
        que.push(q);
    }
    int a[7]= {7,4,3,9,3,6,2};     //兽的防
    int b[7]= {100,34,24,43,34,65,90};//兽的攻
    int c[7]= {2333,600,200,400,500,1100,1400};//兽的血
    for(int i=0; i<7; i++)
    {
        cin>>p[i].v;   //输入兽的速度,并让p的成员:防,攻,血赋初值
        p[i].har=a[i];
        p[i].att=b[i];
        p[i].HP=c[i];
    }

    int t1,t2,h1,h2,ans=0,flag=1;
    for(int i=0; i<7; i++)       //优先攻击体型最大的
   {
        while(!que.empty())      //只要队列里头还有东西,就是还有妖精存在
        {
            ans++;
            r=que.front();      //取出来第一个妖精让其战斗
            que.pop();           //这里先让他出去,如果没死的话到后来,再进来
            t1=r.hurt;
            h1=t1-p[i].har;      //妖精的伤害减去兽的护甲为对兽的总伤害,这里标记为h1
            //p[i].HP-=h1;
            t2=p[i].att;
            h2=t2-r.har;          //兽的伤害间距妖精的护甲为对妖精的总伤害,这里标记为h2
            //r.HP-=h2;
            if(r.v>p[i].v)     //如果妖精的速度大于兽的速度,兽要被攻击两次,妖精被攻击一次
            {
                p[i].HP-=2*h1;
                r.HP-=h2;
            }
            else if(r.v<p[i].v)  //同理
            {
                r.HP-=2*h2;
                p[i].HP-=h1;
            }
            else         //速度相等时
            {
                r.HP-=h2;
                p[i].HP-=h1;
            }
            if(r.HP>0)
                que.push(r);  //如果一回合后该妖精没死,重新进队列
            if(p[i].HP<=0)    //如果当前的兽死了,就需和下一个兽打,这里break一下
                break;
            if(que.empty())    //如果队列空了,也就是妖精都死光了,肯定是失败的,flag标记为0,要输出BOOM!
            {
                flag=0;
                break;
            }
        }
        if(flag==0)    //紧跟着上一步,也需跳出for
            break;
    }
    if(ans<=100&&flag!=0)
        cout<<ans<<endl;
    else
        cout<<"BOOM!"<<endl;
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值