C++ 为什么我的循环中断了
C++ Why is my loop breaking?
我正在按照制作MUD(基于文本的RPG)的教程进行操作,但我的主要功能遇到了问题。 如果你看一下代码,你会发现当玩家移动时,它会检查随机遭遇,如果怪物!= 0,它将进入战斗循环。 当我在命令提示符下执行此操作时,它将允许我攻击怪物,但它永远不会进入怪物>攻击(mainPlayer)函数。 它只是回到屏幕,显示我是否要移动,休息,查看统计信息或退出。 任何这方面的帮助将不胜感激!
#include "stdafx.h"
#include "Map.h"
#include "Player.h"
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int main()
{
srand( time(0) );
Map gameMap;
Player mainPlayer;
mainPlayer.createClass();
// Begin adventure
bool done = false;
while( !done )
{
// Each loop cycle we output the player position and
// a selection menu.
gameMap.printPlayerPos();
int selection = 1;
cout << "1) Move 2) Rest 3) View Stats 4) Quit: ";
cin >> selection;
Monster* monster = 0;
switch( selection )
{
case 1:
// Move the player
gameMap.movePlayer();
// Check for a random encounter. This function
// returns a null pointer if no monsters are
// encountered.
monster = gameMap.checkRandomEncounter();
// 'monster' not null, run combat simulation.
if( monster != 0)
{
// Loop until 'break' statement.
while( true )
{
// Display hitpoints
mainPlayer.displayHitPoints();
monster->displayHitPoints();
cout << endl;
// Player's turn to attack first.
bool runAway = mainPlayer.attack(*monster);
if( runAway )
{
break;
}
if( monster->isDead() )
{
mainPlayer.victory(monster->getXPReward());
mainPlayer.levelUp();
break;
}
monster->attack(mainPlayer);
if( mainPlayer.isDead() )
{
mainPlayer.gameover();
done = true;
break;
}
}
// The pointer to a monster returned from
// checkRandomEncounter was allocated with
// 'new', so we must delete it to avoid
// memeory leaks.
delete monster;
monster = 0;
}
break;
case 2:
mainPlayer.rest();
break;
case 3:
mainPlayer.viewStats();
break;
case 4:
done = true;
break;
} // End switch statement
} // End While statement
} // End main function
这是播放器::攻击功能:
bool Player::attack(Monster& monster)
{
int selection = 1;
std::cout << "1) Attack 2) Run: ";
std::cin >> selection;
std::cout << std::endl;
switch( selection )
{
case 1:
std::cout << "You attack the " << monster.getName()
<< " with a " << mWeapon.mName << std::endl;
if( Random(0, 20) < mAccuracy )
{
int damage = Random(mWeapon.mDamageRange);
int totalDamage = damage - monster.getArmor();
if( totalDamage <= 0)
{
std::cout << "Your attack failed to penetrate the "
<< monster.getName() << "'s armor." << std::endl;
}
else
{
std::cout << "You attack for " << totalDamage
<< " damage!" << std::endl;
// Subtract from monster's hitpoints.
monster.takeDamage(totalDamage);
}
}
else
{
std::cout << "You miss!" << std::endl;
}
std::cout << std::endl;
break;
case 2:
// 25% chance of being able to run.
int roll = Random(1, 4);
if( roll == 1 )
{
std::cout << "You run away!" << std::endl;
return true; //<-- Return out of the function.
}
else
{
std::cout << "You could not escape!" << std::endl;
break;
}
}
}
这是怪物::攻击功能:
void Monster::attack(Player& player)
{
cout << "A " <<mName << " attacks you "
<< "with a " << mWeapon.mName << std::endl;
if( Random(0,20) < mAccuracy )
{
int damage = Random(mWeapon.mDamageRange);
int totalDamage = damage - player.getArmor();
if( totalDamage <= 0 )
{
cout << "The " << mName << "'s attack failed to "
<< "penetrate your armor." << endl;
}
else
{
cout << "You are hit for " << totalDamage
<< " damage!" << endl;
player.takeDamage(totalDamage);
}
}
else
{
cout << "The " << mName << " missed!" << endl;
}
cout << endl;
}
您的Player::attack()
方法只有一个返回语句:return true;
。您忘记将最后一行return false;
添加到方法中。
如果您启用警告(并注意它们!
您的Player::attack
并非在所有情况下都return
(特别是当它需要返回false
时)。 当调用函数尝试访问 Player::Attack
的返回值时,它将成为垃圾,因此您进入 if(ranAway)
块并脱离 while 循环
相关文章:
- 我的代码运行良好,但在游戏循环中中断
- 使用 UDP 中断 while()-循环
- 如何使用中断停止循环?
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 使用 shared_ptr 在中断时结束多线程循环
- 为什么我的 while 循环对于特定输入中断,而对于其他输入工作正常?
- 为什么循环没有中断,并且 if 条件没有按预期工作?
- C 从另一个函数中断循环
- 使用 while(1) 但在 C++ 中无法中断循环
- 输入特定数字时中断循环
- 干净编码:如何从循环中的函数调用内部中断循环
- nullptr 不会在以零结尾的字符串上中断循环
- 使用 std::weak_ptr 和别名构造函数中断循环引用:声音或有问题
- 用功能中断循环
- g++优化中断循环
- 无法使用 cin.get 来检测周期来中断循环
- 返回内部循环以C++中断循环
- OpenMP 不支持中断循环
- while语句中断循环
- 如何在Linux应用程序上使用C++中的终端输入中断循环/进程