C ++-为文本RPG创建基本的战斗功能

时间:2018-09-20 04:21:50

标签: c++ function

我目前正在为一堂课编写基本的RPG文本,而战斗系统出现了一些奇怪的问题。基本上,在每个战斗阶段,我都可以选择攻击还是不攻击敌人。当我攻击敌人时,生命值会以预期的速度降低。但是,当我选择不发动攻击时(这意味着敌人仍会发动攻击),那么我不会直接说明对敌人造成的伤害,但是当我下次选择发动攻击时,它将对敌人造成预期的伤害敌人以及我未发动攻击时造成的伤害。

(警告:我知道我的代码写得不好,可能没有最好的编程逻辑……我是一名新学生,并且仅使用到目前为止所学的知识。)

我的代码如下:

int showEnemyHp(int enemyhp, int attack) {
    enemyhp = enemyhp - attack;
    return enemyhp;
}

int showHp(int hp, int enemyattack) {
    hp = hp - enemyattack;
    return hp;
}

void enemyBattle() {
    int hp = 30, enemyhp = 20, attack = 10, enemyattack = 5;
    int hitEnemy;

    while (true) {
        cout << "Hit enemy?\n(1) Yes\n(2) No" << endl;
        cin >> hitEnemy;

        if (hitEnemy == 1) {
            enemyhp = showEnemyHp(enemyhp, attack);
            hp = showHp(hp, enemyattack);
            cout << "You hit the enemy." << endl;
            cout << "The enemy now has " << enemyhp << "HP left." << endl;
            if (enemyhp <= 0) {
                cout << "You've killed the enemy!" << endl;
                break;
            } else if (enemyhp > 0) {
                cout << "The enemy hits you back." << endl;
                cout << "You now have " << hp << "HP left." << endl;
            }
        } else if (hitEnemy == 2) {
            enemyHp = showEnemyHp(enemyhp, attack);
            hp = showHp(hp, enemyattack);
            cout << "You have chosen not to hit the enemy." << endl;
            cout << "The enemy hits you back." << endl;
            cout << "You now have " << hp << "HP left." << endl;
        } else {
            cout << "You can't do that!" << endl;
            return enemyBattle();
        }
    }
    while (hp > 0 && enemyhp > 0);
}

有人可以帮助我解决我做错的事情吗,为什么会这样?而且,解决此类问题的任何暗示都将是非常好的。我也可能希望对如何更好地优化此代码有所帮助。 (就像我说过的那样,我现在的C ++工具箱非常有限。我只花了大约一个月的时间来研究它……我的教授甚至还没有教过我们自己学过的数组)。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的总体逻辑似乎很好,但您可能没有考虑到一些细节。就像他的评论中提到的@Sami Kuhmonen一样,showEnemyHp()函数实际上是在更新敌人的HP值而不显示它。

如果计划仅将函数int showEnemyHp(int, int)int showHp(int, int)仅用于更新HP值,则最好将其重命名为int updateEnemyHp(int, int)int updateUserHp(int, int)之类的更合适的名称。没什么。

也放

cout << "The enemy now has " << enemyhp << "HP left." << endl;

在检查敌方HP是否为负值之前,可能会导致潜在的有害HP负值打印出来(假定不打算显示HP负值)。处理极端情况后,最好打印HP值。

cout << "You hit the enemy." << endl;
if (enemyhp <= 0) {
    cout << "You've killed the enemy!" << endl;
    break;
} else if (enemyhp > 0) {
    cout << "The enemy now has " << enemyhp << "HP left." << endl;
    cout << "The enemy hits you back." << endl;
    cout << "You now have " << hp << "HP left." << endl;
}

还应注意,当用户决定不发动攻击时,不会显示敌人的更新后的HP,因此不会显示在此回合中对敌人造成的任何伤害。因此,只需为敌方惠普添加打印即可解决此问题

} else if (hitEnemy == 2) {
    enemyHp = showEnemyHp(enemyhp, attack);
    // Dammage done when user decides not to attack, probably should be commented?
    hp = showHp(hp, enemyattack);
    cout << "You have chosen not to hit the enemy." << endl;
    cout << "The enemy hits you back." << endl;
    cout << "You now have " << hp << "HP left." << endl;
    // Handle negative values of enemy HP and print final value
    if (enemyhp <= 0) {
        cout << "You've killed the enemy!" << endl;
        break;
    } else if (enemyhp > 0) {
        cout << "The enemy now has " << enemyhp << "HP left." << endl;
        cout << "The enemy hits you back." << endl;
        cout << "You now have " << hp << "HP left." << endl;
    }
}

在处理无效输入的最终条件分支中,在返回期间调用enemyBattle()可能会导致无限递归,无论哪种情况,这都是非常糟糕的。最好将return enemyBattle();替换为continue;,这样只会继续执行循环

} else {
    cout << "You can't do that!" << endl;
    // Continue program
    continue;
}

如果您希望在用户输入无效输入时退出程序,则可以将return enemyBattle();替换为return;,这样您的代码将如下所示:

} else {
    cout << "You can't do that!" << endl;
    // Exit program
    return;
}

重要的是要记住,该程序没有检查用户的HP,以防用户的HP变为零或负数,则程序可能需要通过通知用户来处理它。

最后,我看不到程序末尾需要while (hp > 0 && enemyhp > 0);,这似乎是多余的,因为该语句仅在控件离开while(true){...}循环时才执行enemyhp <= 0时。