Почему компьютер присваивает 2 разных случайных числа при выборе режима игры для двух игроков?

#c #random

#c #Случайный

Вопрос:

Кто-нибудь, пожалуйста, поможет мне разобраться в этом? Я пишу программу под названием «Игра в угадайку», в которой игроку (ам) предлагается угадать случайное число, сгенерированное компьютером, в диапазоне от 1 до 100. Моя проблема, которую я обнаружил, заключается в том, что когда вы выбираете двух игроков, и каждый игрок начинает угадывать, оказывается, что компьютер выбрал случайное число для обоих игроков. Я не понимаю, почему это происходит, потому что я присваиваю случайное число одной переменной «compSelect» и проверяю его на соответствие предположениям каждого игрока. Я попытался выполнить поиск по этому вопросу на этом сайте, но смог найти только то, почему компьютер дважды запрашивал одного и того же игрока. Однако это не то, что я ищу.

На моем выводе, когда игрок 1 и игрок 2 каждый раз угадывают ответ друг друга, например, игрок 1 угадывает: 10, игрок 2 угадывает: 10; игрок 1 угадывает: 15, игрок 2 угадывает: 15; программа в конечном итоге скажет «угадай ниже» для игрока 1 и «угадай выше» для игрока 2. Кто-нибудь знает, почему это? Я хочу, чтобы оба игрока угадывали одно и то же число.

ОБНОВЛЕНИЕ: я не знаю, как вставить сюда вывод, поэтому я просто введу результаты теста:

Добро пожаловать в игру и тому подобное. Компьютер выбрал число. Вы можете начать угадывать.

Предположение игрока 1: на 10 меньше.

Предположение игрока 2: на 10 угадайте больше

Игрок 1 угадывает:

Это мой код для выбора двух игроков. Я использую Code::Blocks 16.01.

 #include <iostream>
#include <iomanip>
#include <cmath> //needed for pow() and ceil() ///also rand()
#include <conio.h> //needed for kbhit()
#include <windows.h> //needed for Sleep()
#include <cstdlib> //needed for srand() and rand()
#include <time.h> //needed for time()
using namespace std;

int main()
{
    int waitTime = pow(100,2); //amount of time computer will pause for
    int A, B, Y; //switch-case arguments //if-else
    int i = 0;
    int play1Guess, play2Guess, compSelect; //player guesses amp; computer's   selection ///while, if-else
    int numGuess1, numGuess2, numGuessSum1 = 0, numGuessSum2 = 0; //guess  counter
    int gamesPlay = 0; //games played counter
    double guessWinAvg1, guessWinAvg2; //average number of guesses it took before guessing the correct number
    char playerCount, replayGuessGame; //switch-case expression //if-else

    while (true) { //an infinite amount of runs until user selects N when prompted
    cout << "n                          WELCOME TO THE GEUSSING GAMEn"
         << "          ------------------------------------------------------------nn"
         << setw(67) << "The computer will select a random number from 1-100.n"
         << setw(53) << "Try to guess the number.n"
         << setw(71) << "The player who guesses correctly with the fewest tries wins.n"
         << setw(56) << "Exit the game by guessing 0.nn"
         << setw(47) << "Good luck!nn";
    system("pause"); //prompts user to continue

    cout << "nn  A - 1 Player"
         << "n  B - 2 Players"
         << "nnHow Many Players?: ";
    cin >> playerCount; //allows user to play with friends

    switch (playerCount) { //game-play start
    case 'B':
    numGuess2 = 0; //resets guess count each instance
    gamesPlay  ; //increments games played counter for player 1
    cout << "nPlease wait while the computer selects a number . . .";
    srand(time(NULL)); //randomizes first seed int value each game
    compSelect = 1   rand() % 100; //selects a random number between 1-100
    Sleep(waitTime); //pauses program for set amount of time
    cout << "nnThe computer has selected a number. You may begin guessing.nnn";

    cout << "Player 1 Start: ";
    cin >> play1Guess; //stores player's guess
    numGuess1  ; //counts number of guesses player takes
    while ((play1Guess != 0) || (play2Guess != 0)) { //if player guesses 0 - exits game
        if ((play1Guess > compSelect) || (play2Guess > compSelect)) {
            cout << "nGuess Lower.nnn";
        }
        else if ((play1Guess < compSelect) || (play2Guess < compSelect)) {
            cout << "nGuess Higher.nnn";
        }
        else if ((play1Guess == compSelect) || (play2Guess == compSelect)) {
            cout << "nCorrect!";
            break; //prevents program from asking player to guess again
        }//end if-else chain

        int playType = 2; //size of array based on number of players ///array, nested if-else
        string switchTurns[playType] = {"Player 2 Guess: ", "Player 1 Guess: "}; //{switchTurns[0], switchTurns[1]}
        for (; i >= 0;) { //allows player to guess multiple times
            if (i == 0) { //if i is an odd integer
                cout << switchTurns[i]; //Player 2
                cin >> play2Guess;
                numGuess2  ; //counts player 2 guesses
                i  ; //increments i so else statement is true next time through
            }
            else { //if i is an even integer
                cout << switchTurns[i]; //Player 1
                cin >> play1Guess;
                numGuess1  ; //counts player 1 guesses
                i--; //decrements i so if statement is true next time through
            }
            break; //forces program to reenter while loop
        }//end for loop
    }//end inner while loop

    cout << "Good Game!";
    cout << "Would you like to play again? <Y/N>: ";
    cin >> replayGuessGame;
    if (replayGuessGame == 'Y') //Replay
        ; //null
    else { //No replay
        guessWinAvg1 = numGuess1/double (gamesPlay); //avg guesses before winning for player 1
        guessWinAvg2 = numGuess2/double (gamesPlay); //" player 2
        cout << "You played " << gamesPlay << " time(s)." << "nn";

        if (numGuess1 < numGuess2) {
            cout << "Congratulations Player 1!!nYou won The Guessing Game!"
                 << "nnYour average number of guesses beforenguessing the correct number was "
                 << guessWinAvg1 << "." << endl;
            cout << "Player 2 lost The Guessing Game!"
                 << "nnYour average number of guesses beforenguessing the correct number was "
                 << guessWinAvg2 << "." << endl;
        }//if
        else if (numGuess2 < numGuess1) {
            cout << "Congratulations Player 2!!nYou won The Guessing Game!"
                 << "nnYour average number of guesses beforenguessing the correct number was "
                 << guessWinAvg2 << "." << endl;
            cout << "Player 1 lost The Guessing Game!"
                 << "nnYour average number of guesses beforenguessing the correct number was "
                 << guessWinAvg1 << "." << endl;
        }//else-if

        return 0; //terminates program //placed here to accommodate for continue (replay)
    }//end outer if-else

        break; //exits switch-case
    default: //included as a precaution
        cout << "nInvalid Option.nn";
    }//switch-case

    cout << "nnn"; //separates first game display from second game display
    continue; //allows player to replay Guessing Game
    }//end outer while loop
}//end main
  

Спасибо всем, кто помогает. Я действительно ценю это!

Комментарии:

1. if ((play1Guess > compSelect) || (play2Guess > compSelect)) { Вы предположительно даете подсказку одному игроку — почему вы проверяете догадки обоих игроков, чтобы сгенерировать эту подсказку?

2. @Xunie Извините, я отредактирую это в.

3. @Igor Tandetnik Я думал, что должен, поэтому компьютер скажет игроку 2 угадать большее / угадать меньшее / также правильно

4. Если play1Guess значение меньше и play2Guess больше (или наоборот), вы попросите обоих игроков угадать меньшее. Это то, чего вы хотите? Для меня это не имеет особого смысла.

5. Нет. Я хочу, чтобы он проверял, является ли предположение игрока меньше, больше или равно выбранному компьютером, а затем предлагал игроку угадать меньше, угадать выше или исправить. Однако, @Xunie (я только что обновил, как выглядит выводимый дисплей, кстати), когда оба игрока угадывают одно и то же число, это дает разную обратную связь..