sdutoj Fire Emblem

Fire Emblem

                        Time Limit: 1000MS Memory Limit: 65536KB
                                        Submit Statistic

Problem Description

火焰之纹章 (Fire Emblem) 是 SRPG 游戏的巅峰之作,其严格的战场设定和复杂的战斗和剧情系统,使得游戏的难度相当高。
从 1990 年至今,游戏共在各个游戏平台推出了十多部作品,都相当的受欢迎。
3744

我们来简化一下游戏系统,bLue 和 Stone 两人对战,每人有攻(初始攻击力)、防(初始防御力)、速(初始攻击速度)、血(生命值)4 个属性,并且都会携带一把武器和一件防具。
武器有 2 种属性:攻击力加成和重量。
防具有 2 种属性:防御力加成和重量。
玩家的实际攻击力 = 初始攻击力 + 武器攻击力加成。
玩家的实际防御力 = 初始防御力 + 防具防御力加成。
玩家的实际攻击速度 = 初始攻击速度 - 武器重量 - 防具重量。
玩家可用的武器和防具及其属性如下表(允许双方使用相同的武器和防具):
类型 名称 属性加成 重量
武器 DevineRapier 10 5
武器 InfinityBlade 25 25
武器 TheSwordOfPBH 50 10
防具 Immortal 15 5
防具 Ragnarok 25 25
防具 HuaJiShield 50 1

当游戏开始时,两人轮流发起战斗(如果某人的攻击速度小于等于 0 ,则他将无法发起战斗),每场战斗的规则为:
攻方先攻击一次,守方接着再攻击一次。攻击速度快的人可以在本轮战斗结束时额外再攻击一次(攻击速度相等时不存在额外攻击)。
伤害计算公式:伤害 = 自己的攻击力 - 对方的防御力(伤害小于等于 0 时均视为 0)。
在任何一次攻击结束后,如果被攻击者的生命值小于等于 0,则他将立即输掉游戏。

鉴于游戏的设定为蓝方先手,那么 bLue 当然要先攻击了。我们的问题就是,他们两人究竟谁会获得胜利呢?
Input

输入数据有多组(数据组数不超过 100),到 EOF 结束。
每组输入两行数据:
第一行输入 4 个整数和 2 个字符串,分别代表 bLue 的攻、防、速、血、武器、防具;
第二行输入 4 个整数和 2 个字符串,分别代表 Stone 的攻、防、速、血、武器、防具。
所有整数数值都在 [1, 100] 范围内,字符串不含空格且长度最大为 13 。
Output

每组输出占一行,若 bLue 赢,输出 “bLue wins!”;若 Stone 赢,输出 “Stone wins!”;若无法分出胜负(两人都无法发动战斗或两人都无法对对方造成伤害),则输出 “bLue Stone have to give up!”(输出均不包含引号)。
Example Input

30 5 25 30 DevineRapier Immortal
20 5 40 30 DevineRapier Ragnarok
Example Output

bLue wins!
Hint

对第 1 组示例的解释:
bLue 的属性为:攻击力:40,防御力:20,攻击速度:15,可以造成的伤害:10。
Stone 的属性为:攻击力:30,防御力:30,攻击速度:10,可以造成的伤害:10。

bLue 的攻击速度高,所以他每轮战斗结束时都会额外攻击一次。
战斗过程(b 表示 bLue,S 表示 Stone,→ 表示攻击,hp1 表示 bLue 的生命值,hp2 表示 Stone 的生命值):

Battle 1:
b→S hp2: 30-10=20
S→b hp1: 30-10=20
b→S hp2: 20-10=10(额外攻击)

Battle 2:
S→b hp1: 20-10=10
b→S hp2: 10-10=0

对于本题输入输出中所涉及的字符串,建议将其复制粘贴到你的代码中,以避免拼写错误。


这是一个小模拟题,需要注意的地方:
是轮流发动攻击,每一回合之后,速度快的可以追加一个攻击,每一字攻击之后都要判断一下是不是没血了


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int Fabs(int x){
    return x >= 0 ? x : 0;
}

char tools1[3][20] = {"DevineRapier", "InfinityBlade", "TheSwordOfPBH"};
char tools2[3][20] = {"Immortal", "Ragnarok", "HuaJiShield"};
int tools11[3][2] = {{10, 5}, {25, 25}, {50, 10}};
int tools22[3][2] = {{15, 5}, {25, 25}, {50, 1}};

int main(){
    int Ba, Bd, Bs, Bhp;
    char Btool1[20], Btool2[20];
    int Sa, Sd, Ss, Shp;
    char Stool1[20], Stool2[20];
    std::ios::sync_with_stdio(false);
    //freopen("data1.in", "r", stdin);
    //freopen("txt.out", "w", stdout);
    while (std::cin >> Ba >> Bd >> Bs >> Bhp >> Btool1 >> Btool2){
        std::cin >> Sa >> Sd >> Ss >> Shp >> Stool1 >> Stool2;
        int Badddamage = 0, Sadddamage = 0, Badddefense = 0, Sadddefense = 0, Baddweight = 0, Saddweight = 0;
        for (int i = 0; i < 3; i++){
            if (strcmp(Btool1, tools1[i]) == 0){
                Badddamage += tools11[i][0];
                Baddweight += tools11[i][1];
            }
            if (strcmp(Btool2, tools2[i]) == 0){
                Badddefense += tools22[i][0];
                Baddweight += tools22[i][1];
            }
            if (strcmp(Stool1, tools1[i]) == 0){
                Sadddamage += tools11[i][0];
                Saddweight += tools11[i][1];
            }
            if (strcmp(Stool2, tools2[i]) == 0){
                Sadddefense += tools22[i][0];
                Saddweight += tools22[i][1];
            }
        }

        int Bfactdefense = Bd + Badddefense, Bfactdamage = Ba + Badddamage;
        int Sfactdefense = Sd + Sadddefense, Sfactdamage = Sa + Sadddamage;

        int Bdamage = Fabs(Bfactdamage - Sfactdefense);
        int Sdamage = Fabs(Sfactdamage - Bfactdefense);
        int Bspeed = Fabs(Bs - Baddweight);
        int Sspeed = Fabs(Ss - Saddweight);

        if ((Bdamage == 0 && Sdamage == 0) || (Bspeed == 0 && Sspeed == 0) || (Bdamage == 0 && Sspeed == 0) ||
            (Sdamage == 0 && Bspeed == 0)){
            std::cout << "bLue Stone have to give up!" << std::endl;
            continue ;
        }
        else if (Bspeed == 0 && Sdamage > 0){
            std::cout << "Stone wins!" << std::endl;
            continue ;
        }
        else if (Sspeed == 0 && Bdamage > 0){
            std::cout << "bLue wins!" << std::endl;
            continue ;
        }
        bool Bflag = false, Sflag = false;
        if (Bspeed > Sspeed) Bflag = true;
        else if (Bspeed < Sspeed) Sflag = true;
        for (int i = 1; Bhp >= 1 && Shp >= 1; i++){
            if (i % 2 == 1){
                Shp -= Bdamage;
                if (Shp <= 0) break;
                Bhp -= Sdamage;
                if (Bhp <= 0) break;
                if (Bflag){
                    Shp -= Bdamage;
                    if (Shp <= 0) break;
                }
                else if (Sflag){
                    Bhp -= Sdamage;
                    if (Bhp <= 0) break;
                }
            }
            else{
                Bhp -= Sdamage;
                if (Bhp <= 0) break;
                Shp -= Bdamage;
                if (Shp <= 0) break;
                if (Bflag){
                    Shp -= Bdamage;
                    if (Shp <= 0) break;
                }
                else if (Sflag){
                    Bhp -= Sdamage;
                    if (Bhp <= 0) break;
                }
            }
        }
        if (Bhp <= 0) std::cout << "Stone wins!" << std::endl;
        else std::cout << "bLue wins!" << std::endl;
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值