0

さて、まずは自己紹介。私はベンです。オランダ出身の 17 歳の「ゲーム プログラマー」で、C++ でプログラミングを始めたばかりです (約 1 か月前にプログラミングを始めましたが、現在 1 年間プログラミングしています) (そして、Microsoft Visual Studio を使用しています)。 2012 コンパイラ)。今、私は「自分でそれを学んでいます」が、まだ本を使っています。その本は Michael Dawson 著「Beginning C++ Through Game Programming, Third Edition」と呼ばれています。

第 2 章を終えたところですが、最後の練習問題は次のとおりでした。「プレイヤーとコンピューターが役割を切り替える新しいバージョンの Guess My Number プログラムを作成します。つまり、プレイヤーが数字を選び、コンピューターがそれが何であるかを推測する必要があります。 ."

「Guess My Number」プログラムのコードは次のとおりです。

// Guess My Number
// The classic number guessing game

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand(static_cast<unsigned int>(time(0)));  //seed random number generator

    int secretNumber = rand() % 100 + 1;    // random number between 1 and 100
    int tries = 0;
    int guess;

    cout << "\tWelcome to Guess My Number\n\n";
    do
    {
        cout << "Enter a guess: ";
        cin >> guess;
        ++tries;

        if (guess > secretNumber)
        {
            cout << "Too high!\n\n";
        }
        else if (guess < secretNumber)
        {
            cout << "Too low!\n\n";
        }
        else
        {
            cout << "\nThat's it! You got it in " << tries << " guesses!\n";
        }
    } while (guess != secretNumber);

    return 0;
}

今、私は思考とプログラミングのテストで忙しくしていましたが、うまくいきませんでした。そんな無限ループにハマってしまったようです。しかし、私は問題を見つけることができません。

これがコードであり、これを修正する他の方法は大歓迎ですが、私は言語の多くを知らないことに注意してください. ;)

// Guess My Number 2
// The classic number guessing game with a twist

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand(static_cast<unsigned int>(time(0)));

    int secretNumberComputer = rand() % 100 + 1;
    int secretNumberPlayer;
    int triesPlayer = 0;
    int triesComputer = 0;
    int guessPlayer;
    int guessComputer;
    int tooHighPlayer;
    int tooLowPlayer;
    int correctPlayer;
    int tooHighComputer;
    int tooLowComputer;
    int correctComputer;
    int selectNumberIncorrect;
    int lowerGuessComputer = 101;
    int higherGuessComputer = 0;


    cout << "Welcome to Guess My Number\n\n";   

    do
    {
        cout << "Enter a guess: ";
        cin >> guessPlayer;
        ++triesPlayer;

        tooHighPlayer = (guessPlayer > secretNumberComputer);
        tooLowPlayer = (guessPlayer < secretNumberComputer);
        correctPlayer = (guessPlayer == secretNumberComputer);

        if (tooHighPlayer)
        {
            cout << "Too high!\n\n";
        }
        else if (tooLowPlayer)
        {
            cout << "Too low!\n\n";
        }
        else if (correctPlayer)
        {
            cout << "\nThat's it! You got it in " << triesPlayer << " guesses!\n\n";
            break;
        }
        else
        {
            cout << "Error, check code!\n\n";
            break;
        }
    } while (!correctPlayer);


    cout << "Now it's time for you to pick a number and then the computer will guess.\nEnter a number between 1 and 100: ";


    do
    {
        cin >> secretNumberPlayer;
        selectNumberIncorrect = (secretNumberPlayer > 100 || secretNumberPlayer < 1);
        if (selectNumberIncorrect)
        {
            cout << "\nHey, that isn't a number between 1 and 100! Please pick a number that is: ";
        }
        else
        {
            break;
        }
    } while (selectNumberIncorrect);

    guessComputer = (rand() < lowerGuessComputer && rand() > higherGuessComputer);
    cout << "\n\nNow the computer is going to try to guess your number:" << endl;
    cout << "Computer, take a guess: " << guessComputer << endl;
    ++triesComputer;

    tooHighComputer = (guessComputer > secretNumberPlayer);
    tooLowComputer = (guessComputer < secretNumberPlayer);
    correctComputer = (guessComputer == secretNumberPlayer);
    lowerGuessComputer = (rand() % 100 + 1 && rand() < guessComputer);
    higherGuessComputer = (rand() % 100 + 1 && rand() > guessComputer);

    if (tooHighComputer)
    {
        cout << "Too High!\n\n";
        guessComputer = lowerGuessComputer;
    }
    else if (tooLowComputer)
    {
        cout << "Too Low!\n\n";
        guessComputer = higherGuessComputer;
    }
    else if (correctComputer)
    {
        cout << "\nThat's it! You got it in " << triesComputer << " guesses!\n\n";
    }
    else
    {
        cout << "Error, check code!\n\n";
    }


    do
    {
        cout << "Computer, take a guess: " << guessComputer << endl;
        ++triesComputer;


        if (tooHighComputer)
        {
            cout << "Too High!\n\n";
            guessComputer = lowerGuessComputer;
        }
        else if (tooLowComputer)
        {
            cout << "Too Low!\n\n";
            guessComputer = higherGuessComputer;
        }
        else if (correctComputer)
        {
            cout << "\nThat's it! You got it in " << triesComputer << " guesses!\n\n";
            break;
        }
        else
        {
            cout << "Error, check code!\n\n";
            break;
        }
    } while (!correctComputer);


    if (triesComputer < triesPlayer)
    {
        cout << "You lost against the computer!\n\n";
    }
    else if (triesComputer > triesPlayer)
    {
        cout << "You won!\n\n";
    }
    else
    {
        cout << "It's a tie!\n\n";
    }

    cout << "Thank you for playing! Goodbye!" << endl;

    return 0;
}
4

4 に答える 4

2

このブロックでは、コンピューターの推測の正しさをチェックしていない ( correctComputer を割り当てている) ため、最初に正しく推測しない限り、ループは永遠に続きます。

do
{
    cout << "Computer, take a guess: " << guessComputer << endl;
    ++triesComputer;


    if (tooHighComputer)
    {
        cout << "Too High!\n\n";
        guessComputer = lowerGuessComputer;
    }
    else if (tooLowComputer)
    {
        cout << "Too Low!\n\n";
        guessComputer = higherGuessComputer;
    }
    else if (correctComputer)
    {
        cout << "\nThat's it! You got it in " << triesComputer << " guesses!\n\n";
        break;
    }
    else
    {
        cout << "Error, check code!\n\n";
        break;
    }
} while (!correctComputer);
于 2013-01-09T22:21:00.823 に答える
1

Kevin Tranが書いたものに加えて、cinの有効な入力タイプを確認してください。

誰かが整数の代わりに文字を入力していると想像してみてください。

それで

cin >> guessPlayer;

次のように書くことができます

if (cin >> guessPlayer) {
        // Do you logic here
    }
else {
 cout<<"Enter numbers only. :)";endl;
 continue;
}

お役に立てれば。

于 2013-01-09T23:17:33.603 に答える
1

2 番目doのループでは、コンピューターの推測が再計算されることはありません。

つまり、ループの前にコンピューターに 1 つの数値を推測doさせ、ループ内でその1 つの推測が高すぎるか低すぎるかをチェックし続け、その値を再計算することはありません。それは明らかに終わりません。

2 番目のループ内でコンピューターの推測計算を行う必要があります。

編集

また、このロジックは正しくありません。

lowerGuessComputer = (rand() % 100 + 1 && rand() < guessComputer);
higherGuessComputer = (rand() % 100 + 1 && rand() > guessComputer);

右側の演算の結果はブール値であるため、推測は常に 0 または 1 になります。実際、私はあなたがそこで何をしようとしているのかわかりません。&&整数とブール値の間で実行しています。また、2 つの異なる推測を計算している理由もわかりません。指定された上位/下位パラメーターの範囲内で 1 つの数値を計算する必要があります。

于 2013-01-09T22:18:28.000 に答える
0

あなたが投稿した多くの欠陥のあるコードを分析する代わりに、あなたのプログラムが何をしなければならないかを考えてみましょう: ユーザーは乱数を選び、コンピューターはその数字を推測しようとします。

したがって、プログラムの流れは次のようになります。

コンピューターが乱数を選択します。それを出力し、数値が高すぎるか、低すぎるか、または正しいかを選択するようユーザーに求めます。(つまり、高すぎる場合は「1」、低すぎる場合は「2」、正しい場合は「3」を入力するようユーザーに求めることによって)。

ユーザーが「3」と入力すると、明らかに完了です。

値が高すぎる場合、コンピューターは新しい乱数 (最後の推測よりも小さい) を選択し、上記のロジックを再試行します。

値が低すぎる場合、コンピューターは新しい乱数 (最後の推測よりも大きい) を選択し、上記のロジックを再試行します。

それでは、上記を実装するいくつかのコードを試して実装しましょう。

using namespace std;

int main()
{
    int range_low = 0;    // The number the user picked is greater than this
    int range_high = 100; // The number the user picked is smaller than this

    srand(static_cast<unsigned int>(time(0)));

    do
    {
        // We want to generate a random number between range_low and range_high. We do this
        // by generating a random number between zero and the difference of "low" and "high"
        // adding it to low and adding one more.           
        int guess = range_low + ((rand() % (range_high - range_low)) + 1);

        cout << "I'm guessing your number is " << guess << "... how did I do?" << endl
             << "    [1: too high, 2: too low, 3: you got it!] ";

        // Now let's see how we did...

        int choice;

        cin >> choice;

        if(choice == 3)
        {
            cout << "Be amazed at my psychic powers! For I am a computer!" << endl;
            break;
        }

        if(choice == 2)
        { 
            cout << "Hmm, ok. I was sure I had it. Let's try again!" << endl;
            range_low = guess;
        }

        if(choice == 1)
        {
            cout << "Really? Ok, ok, one more try!" << endl;
            range_high = guess;
        }
    } while(true);

    return 0;
}

上記を改善するための2つの演習を次に示します。

まず、このコードのロジックを自分のコードのロジックと比較して、コードのどこが違うかを確認してください。なぜ間違っているのかを理解してください。C++ を理解するコンピューターのように、ペンと紙を使ってプログラムを実行してみると役に立ちます。

次に、コンピューターが同じ数字を 2 回推測しないようにするコードを追加してみてください。

于 2013-01-09T22:58:51.730 に答える