0

これを正しくフォーマットしたことを本当に願っています。私はこの推測ゲームに取り組んできましたが、かなりうまく機能します。私が持っている唯一の問題はgameSummary機能にあります。努力を合計する代わりに (たとえば、3 ラウンドのプレイ、1 ラウンドで最大 15 回の推測、別のラウンドでは最大 5 回の推測、平均はいくらでも)、各ゲームの結果を投稿します。

例:

Total number of rounds: 1
The most number of guesses in one round: 10
The least number of guesses in one round: 0
Average number of guesses per round: -1.#IND
Total number of rounds: 1
The most number of guesses in one round: 5
The least number of guesses in one round: 0
Average number of guesses per round: -1.#IND

1 つのゲームのみがカウントされたため、これも平均を台無しにします。使用する必要があると感じていgameSummary(rounds, mostGuesses, leastGuesses, averageGuesses);ますが、合計ゲームの結果をカウントするためにどこに置くべきか正確にはわかりません. 何か案は?

bool isTrue(int guess, int tries, int number, 
    int rounds, int mostGuesses, int leastGuesses, float averageGuesses)
{
    char answer;
    bool inGame = true; // states that the user is currently in the game
    while (inGame == true)
    {
        if (guess < 1 || guess > 99)
        {
            cout << "Invalid guess." << endl;
            cout << "Please take another guess: ";
            cin >> guess;
        }
        else
        {
            if (guess > number)
            {
                cout << "Lower please: ";
                cin >> guess;
                tries++;
            }
            else if (guess < number)
            {
                cout << "Higher please: ";
                cin >> guess;
                tries++;
            }
            else if (guess == number)
            {
                cout << "Congratulations! " << guess << " is the number!!\n";
                cout << "You guessed correctly in " << tries << " tries!!\n";
                inGame = false; // once the game is won, the while loop breaks.
                rounds++;
            }
            if (tries > mostGuesses)
            {
                mostGuesses = tries;
            }
            else if (tries < mostGuesses)
            {
                leastGuesses = tries;
            }
        }
    }
    cout << "do you want to play another round? ";
    cin >> answer;
    if (answer == 'Y' || answer == 'y')
    {
        game(); // replays the game if the user wants.
    }
    gameSummary(rounds, mostGuesses, leastGuesses, averageGuesses);
    return false;
}

void gameSummary(
    int rounds, int mostGuesses, int leastGuesses, float averageGuesses)
{
    cout << "Total number of rounds: " 
        << rounds << endl;
    cout << "The most number of guesses in one round: " 
        << mostGuesses << endl;
    cout << "The least number of guesses in one round: " 
        << leastGuesses << endl;
    cout << "Average number of guesses per round: " 
        << averageGuesses << endl;
}
4

1 に答える 1

0

あなたの関数は自分自身を呼び出しているようです:

if (answer == 'Y' || answer == 'y')
{
    game(); // replays the game if the user wants.
}
gameSummary(rounds, mostGuesses, leastGuesses, averageGuesses);

「game()」は「isTrue()」を呼び出していると思います。つまり、'Y' と答えると、"game" が呼び出されて再生され、2 番目のゲームが要約されてから、isTrue の最初の呼び出しに戻り、gameSummary() が呼び出されます。

ideone でこのsscceライブ デモを参照してください: http://ideone.com/oP5opZ

#include <string>
#include <iostream>

void game(const std::string& from);

class PathTracker {
    std::string m_path;

public:
    PathTracker(const std::string& path_, const char* func_)
        : m_path(path_)
        {
            m_path += ">";
            m_path += func_;
            std::cout << m_path << " +enter+" << std::endl;
        }

    const std::string path() const { return m_path; }

    ~PathTracker() { std::cout << m_path << " -return-" << std::endl; }
};

void gameSummary(const std::string& from)
{
    PathTracker p(from, "gameSummary");
    std::cout << "[game summary]" << std::endl;
}

void isTrue(const std::string& from)
{
    PathTracker p(from, "isTrue");
    std::cout << "Another game? ";
    char answer;
    std::cin >> answer;
    std::cout << "Got " << answer << std::endl;
    if (answer == 'Y' || answer == 'y') {
        game(p.path());
    }
    gameSummary(p.path());
}

void game(const std::string& from)
{
    PathTracker p(from, "game");
    std::cout << "[get user input]" << std::endl;
    isTrue(p.path());
}

int main(int argc, const char* argv[])
{
    game("main");
}

「Y」と「N」を入力すると、出力は次のようになります。

main>game +enter+
[get user input]
main>game>isTrue +enter+
Another game? Got Y
main>game>isTrue>game +enter+
[get user input]
main>game>isTrue>game>isTrue +enter+
Another game? Got N
main>game>isTrue>game>isTrue>gameSummary +enter+
[game summary]
main>game>isTrue>game>isTrue>gameSummary -return-
main>game>isTrue>game>isTrue -return-
main>game>isTrue>game -return-
main>game>isTrue>gameSummary +enter+
[game summary]
main>game>isTrue>gameSummary -return-
main>game>isTrue -return-
main>game -return-

「Y」と応答すると、プログラムは「game」への INNER 呼び出しに迂回して実行され、gameSummary を呼び出し、コードがあった場所に戻ります。これは、「gameSummary」への元の呼び出しが発生する直前です。 .

再帰の原則は、これでより簡単に示されるかもしれません: http://ideone.com/sFk468

#include <iostream>

void foo(int i)
{
    if (i == 0) {
        foo(1);
    }
    std::cout << "foo(" << i << ")" << std::endl;
}

int main(int argc, const char* argv[])
{
    foo(0);
}

どの出力

foo(1)
foo(0)

コードは同じ基本パターンを繰り返しています。

于 2013-09-26T06:32:49.920 に答える