Завершение цикла, когда пользователь дважды ошибся? - PullRequest
1 голос
/ 10 февраля 2012

Я делаю тест и тестирую пользователя.Если пользователь ошибается, ему дается второй шанс или пропускается, если он выбирает второй шанс и снова ошибается, игра окончена.Как мне выйти из этого цикла, чтобы закончить игру?Я пробовал цикл do while,

do { stuff} while (wrong<2) while counting ++wrong;

каждый раз, когда он ошибался, но не работал.

Я пометил ++wrong с // утверждениями ниже

void player_try (string questions[][5], char answers[])
{
    char user_guess;
    int m = 0;
    srand(time(NULL));
    int x;
    int choice;
    int wrong =0;

    for (m=0; m<7; m++)
    {
        do
        {
            x = (rand() % 7);
            cout << user_name << ": Here is question number " << m+1 << endl;
            cout << m+1 << ". " << questions[x][0]<< endl;
            cout << "A. " << questions[x][1]<< endl;
            cout << "B. " << questions[x][2]<< endl;
            cout << "C. " << questions[x][3]<< endl;
            cout << "D. " << questions[x][4]<< endl;
            cin >> user_guess;
            user_guess = toupper(user_guess);

            while (!(user_guess >= 'A' && user_guess <= 'D'))
            {
                cout << "Please choose a valid answer.";
                cin>> user_guess;
            }
            if (user_guess != answers[x])
            {
                cout <<"Wrong!" <<endl;     
                ++wrong;    // THIS IS WHERE I COUNT WRONG ONCE
                cout << "Skip this question or take a chance at greatness?"      << endl;
                cout << "Press 1 to skip, press 2 to take a chance at greatness" << endl;
                cin  >> choice;
                if (choice == '1')
                {
                    cout << "we shall skip this question." << endl;
                }
                else
                {
                    cout << "I applaud your bravery." << endl;
                    cout << user_name << ": Here is question number " << m+1 << endl;
                    cout << m+1 << ". " << questions[x][0]<< endl;
                    cout << "A. " << questions[x][1]<< endl;
                    cout << "B. " << questions[x][2]<< endl;
                    cout << "C. " << questions[x][3]<< endl;
                    cout << "D. " << questions[x][4]<< endl;
                    cin >> user_guess;
                    user_guess = toupper(user_guess);

                    while (!(user_guess >= 'A' && user_guess <= 'D'))
                    {
                        cout << "Please choose a valid answer.";
                        cin>> user_guess;
                    }
                }
                if (toupper(user_guess) != answers[x])
                {
                    cout <<"Wrong!" <<endl;
                    ++wrong;;  // THIS IS WHERE I CANT WRONG TWICE
                }
                else
                {
                    cout << "correct!" << endl;
                }
            }
            else
            {
                cout << "correct!" << endl;
            }
        }
        while(wrong < 2);
    }
}

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Измените тип возврата вашей функции на целое число. Это просто означает изменение «void» на «int». Затем внутри функции поместите return 0; в точку, в которой ваша функция должна завершиться. Убедитесь, что вы включили еще один return 1; для случая, когда пользователь тоже выиграл.

Так работает функция main (). Рассмотрим:

int main() 
{
  string tester = "some string";
  if(tester == "some string")
    return 1;

  cout << "Hey!"
  return 0;
}

В приведенном выше случае main () заканчивается на «return 1;» потому что утверждение if было TRUE. Обратите внимание, что "Эй!" никогда не печатается. Это будет работать так же для вашей функции.

Как плюс, вы можете использовать это возвращаемое значение, чтобы дать ДРУГИМ функциям (таким как main ()) знать, была ли функция завершена из-за того, что пользователь выиграл (вернул 1) или проиграл (вернул 0).

Да, оператор break также является допустимым способом завершения цикла, но я утверждаю, что этот метод является более безопасным и чистым способом решения этой проблемы. В общем, нам нравится знать, была ли функция или программа успешной или нет.

1 голос
/ 10 февраля 2012

Здесь есть несколько отличных предложений по рефакторингу кода, чтобы устранить дублирование усилий, но для того, чтобы программа работала незамедлительно, нужно выйти из цикла for, окружающего цикл do { } while(wrong < 2).

Простой способ сделать это - изменить цикл for, чтобы также проверить неверную переменную.Дополнительным преимуществом является то, что если я все правильно прочитал, вам больше не понадобится цикл do{ } while();.

for (m=0; m<7 && wrong < 2; m++)

1 голос
/ 10 февраля 2012

Вы можете использовать перерыв; заявление, если человек дважды получил неправильный ответ.

Согласно комментариям. Вы можете сбросить цикл do while в пользу цикла for. Просто поставьте перерыв внизу, если неправильные предположения 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...