我目前正在为一堂课编写基本的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 ++工具箱非常有限。我只花了大约一个月的时间来研究它……我的教授甚至还没有教过我们自己学过的数组)。非常感谢您的帮助。
答案 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
时。