Что мешает генератору случайных чисел рандомизировать каждый раз, когда игрок начинает новую игру?

{
    int i,game = 0,guess,count = 0;

    int rando;
        

        srand (time(0));

        rando = rand() % 50 + 1;
    

        cout << "****Welcome To The Game****\n";
        cout << "1: Start the game\n";
        cout << "2: End the game\n";
        cin >> game; 

    while (game != 2 && count != 11)
    {

        cout << "Enter a number between 1 and 50: ";
        cin >> guess;

        count++;

        if(guess == rando)
        {
            cout << "you got it!\n";

            cout << "would you like to play again?\n";
            cin >> game; 
        }
    
        else if(guess < rando)
        {
            cout << "too low, try again " << endl;
        }
            
        else if(guess > rando)
        {
            cout << "Too high, try again" << endl;
        }
            
        
        if (count == 11)
        {
            cout << "too many guesses. the number was: " << rando << "." << endl;

            cout << "would you like to play again?\n";
            cin >> game; 
        }
        
        if (game == 2)
        {
            cout << "@@@ Thank you. See you next time.@@@\n";
        }
    }
    return 0;
}

когда я запускаю игру, она генерирует новый номер каждый раз, когда я запускаю программу, но не когда я прошу снова сыграть. Я пытался вставить его в то время, но это портит код. как выполнить второй вариант в первом предложении?

Вам нужно получать новое случайное число каждый раз, когда вы хотите сыграть в новую игру. У вас есть строка кода, которая выполняет цикл внутри?

NathanOliver 06.04.2022 16:33

Когда вы хотите снова сыграть, вы все еще находитесь в цикле while. Либо вам нужно вырваться из него и начать всю игру заново, либо вам нужно поставить генерацию числа в цикл.

Pachari 06.04.2022 16:35

Похоже, вам нужно немного отшлифовать свой код, но также, если вы используете отладочный выпуск в Visual Studio rand, это не так уж и случайно, чтобы помочь вам в отладке.

Code Gorilla 06.04.2022 16:40

@NathanOliver, когда я добавляю строку кода внутри цикла, программа работает неправильно. когда я добавил его, например, я мог угадать 12 и получить ответ «слишком низкий», даже если число было 4.

30for30 06.04.2022 16:48

Отладка и выпуск @CodeGorilla не являются детерминированным фактором в prng среды выполнения VC; заполнение является. Если не задано (srand( something entropic )), действие среды выполнения по умолчанию в отладке и выпуске оба эквивалентно srand(1), и это не относится к VC; это часть языкового стандарта. Проблема ОП в том, что они рисуют только одно случайное число.

WhozCraig 06.04.2022 16:48

@ 30for30 Мой хрустальный шар говорит мне, что вы поместили его не в то место в петле. Это должно быть только в конкретных предложениях if, касающихся запуска новой игры. в вашем коде есть два таких случая: if(guess == rando) и if (count == 11)

WhozCraig 06.04.2022 16:49

Похоже, у вас есть один цикл, который контролирует как «неоднократное угадывание, пока я не выиграю или не исчерпаю догадки», и, «неоднократное воспроизведение раундов, пока я не решу выйти». Вам нужно генерировать новое случайное число каждый раз, когда происходит последнее, но сохранять его неизменным между итерациями первого. Это сложно, пока обе петли смешаны вместе, как у вас здесь. Разделите его на внешний цикл для того, чтобы сыграть еще один раунд или выйти, и внутренний цикл для угадывания, и тогда у вас будет единственное место, где вы можете изменить значение цели.

Nathan Pierson 06.04.2022 16:50

Вопросы по отладке обычно должны содержать минимальный воспроизводимый пример проблемы, которая включает в себя функцию main и все #include директивы.

Andreas Wenzel 06.04.2022 17:04

@NathanPierson спасибо за помощь в разработке программы. Я планирую попробовать совершенно новый подход с циклом for вместо while и разделения, как вы сказали.

30for30 06.04.2022 18:07

@WhozCraig, когда я использую ваш ответ, есть ли способ сбросить счетчик до 0 каждый раз, когда игра снова запускается?

30for30 06.04.2022 18:08
Получение данных из формы с помощью JavaScript - краткое руководство
Получение данных из формы с помощью JavaScript - краткое руководство
Получить данные из формы с помощью JS очень просто: вы запрашиваете элемент формы, передаете его конструктору new FormData() и, наконец, получаете...
Пользовательские правила валидации в Laravel
Пользовательские правила валидации в Laravel
Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей...
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
0
10
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
int randomGame()
{
    int gameMenuChoice = 0;

    srand(time(0));

    std::cout << "****Welcome To The Game****\n";
    std::cout << "1: Start the gameMenuChoice\n";
    std::cout << "2: End the gameMenuChoice\n";
    std::cin >> gameMenuChoice;

    while (gameMenuChoice != 2)
    {
        const int rando = rand() % 50 + 1;
        int guess = 0;
        for (int count = 0; count < 11 && guess != rando; ++count)
        {
            std::cout << "Enter a number between 1 and 50: ";
            std::cin >> guess;
            if (guess < rando)
            {
                std::cout << "too low, try again \n";
            }
            else if (guess > rando)
            {
                std::cout << "Too high, try again\n";
            }
        }
        if (guess == rando)
        {
            std::cout << "you got it!\n";
        }
        else
        {
            std::cout << "too many guesses. the number was: " << rando << ".\n";
        }
        std::cout << "would you like to play again?\n";         // I think people will enter Y for yes here.
        std::cin >> gameMenuChoice;
    }
    std::cout << "@@@ Thank you. See you next time.@@@\n";

    return 0;
}

Я разделил ваше меню и циклы игровой рутины и немного упростил логику.

Другие вопросы по теме