C ++为什么我的循环中断了?

时间:2013-09-16 18:29:43

标签: c++ function loops while-loop

我正在学习制作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

这是Player :: attack功能:

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;
        }
    }
}

这是Monster :: attack功能:

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;
}

2 个答案:

答案 0 :(得分:3)

您的Player::attack()方法只有一个return语句:return true;。您忘了将最后一行return false;添加到您的方法中。

如果您启用警告(并注意它们!),这可能很容易被阻止。

答案 1 :(得分:1)

Player::attack在所有情况下都不return(特别是当它需要返回false时)。当调用函数尝试访问Player::Attack的返回值时,它将变为垃圾,因此您输入if(ranAway)块并突破while循环