我正在學習一個製作MUD(基於文本的RPG)的教程,而且我的主要功能有問題。如果你看代碼,你會看到當玩家移動時它會檢查一個隨機的相遇,如果怪物!= 0,它會進入戰鬥循環。當我在命令提示符中執行這個命令時,它會允許我攻擊怪物,但它永遠不會對怪物 - >攻擊(mainPlayer)函數產生影響。它只是回到屏幕上,指出我是否想要移動,休息,查看統計數據或退出。任何幫助,將不勝感激!C++爲什麼我的循環中斷?
#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;
}
您需要出示'球員:: attack'(至少) –
'mainPlayer.attack(*怪物)'總是返回'true'? – SirGuy
我在帖子底部添加了Player :: attack和Monster :: attack函數。 –