2013-09-16 5 views
0

Я следую учебнику для создания MUD (текстовой RPG), и у меня возникают проблемы с моей основной функцией. Если вы посмотрите на код, вы увидите, что при перемещении игрока он проверит случайную встречу, и если монстр! = 0, он войдет в боевой цикл. Когда я выполняю это в командной строке, это позволит мне атаковать монстра, но он никогда не попадает в функцию monster-> attack (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

Вам нужно показать 'Player :: attack' (как минимум) –

+0

Возможно, 'mainPlayer.attack (* monster)' всегда возвращает 'true'? – SirGuy

+0

Я добавил как функции Player :: attack, так и Monster :: attack в нижней части сообщения. –

ответ

3

Ваш метод Player::attack() имеет только одно возвратное заявление: return true;. Вы забыли добавить конечную строку return false; в свой метод.

Это могло бы легко предотвратить, если вы включите предупреждения (и обратить на них внимание!)

+0

Спасибо! Такая простая ошибка ... как смущающе. В любом случае, еще раз спасибо! –

1

Ваш Player::attack не return во всех случаях (в частности, когда необходимо вернуть false). Когда вызывающая функция пытается получить доступ к возвращаемому значению Player::Attack, он получит мусор, и вы введете блок if(ranAway) и выйдете из цикла while.

Смежные вопросы