2013-09-16 79 views
0

我正在學習一個製作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; 
} 
+1

您需要出示'球員:: attack'(至少) –

+0

'mainPlayer.attack(*怪物)'總是返回'true'? – SirGuy

+0

我在帖子底部添加了Player :: attack和Monster :: attack函數。 –

回答

3

Player::attack()方法只有一個返回語句: return true;。您忘記將最後一行return false;添加到您的方法中。

這可能很容易被阻止如果啓用警告(並注意它們!)

+0

謝謝!這樣一個簡單的錯誤......多麼尷尬。無論如何,再次感謝! –

1

Player::attackreturn在所有情況下(特別是當它需要返回false)。當調用函數試圖訪問的Player::Attack返回值會收到垃圾等你進入if(ranAway)塊,也許打破while循環