Как получить часть моего кода, чтобы зациклить и повторять вопрос, пока ответ не является допустимым вводом C ++ - PullRequest
0 голосов
/ 08 января 2019

Код работает нормально. Я просто пропускаю элемент, где, если конечный запрос на повторение игры, если я введу «a» как пользователя, я бы хотел, чтобы код повторил вопрос с новым оператором cout, таким как «неверный ответ, пожалуйста». ответьте да / нет и если да, то, очевидно, игра перезапускается сама (Рок бумага ножницы игра ч / б 2 игрока)

int main(int argc, const char * argv[]) {
char playAgain ='y' ;  // loop control


do
{
    char Player1;
    char Player2 = '\0';



    cout << "Player 1, Enter R, P, or S: ";         // Player 1
    cin >> Player1;

    Player1 = toupper(Player1);
    while (Player1 != 'R' && Player1 != 'P' && Player1 !='S' )
    {
        cout << "please only answer R , P , or S: " << endl;

        cin >> Player1;
        Player1 = toupper(Player1);


    }
    {
    cout << "Player 2, Enter R, P, or S: ";         // Player 2
    cin >> Player2;
     Player2 = toupper(Player2);
    while (Player2 != 'R' && Player2 != 'P' && Player2 !='S' )
    {

    cout << "please only answer R , P , or S: " << endl;

    cin >> Player2;
    Player2 = toupper(Player2);

    }}
    if (Player1 == Player2)     //TIE
    {
        cout << "Nobody wins."<<endl;}


 else   if (Player1 == 'R' && Player2 == 'P')
    {
        cout << "Paper covers rock, Player 2 wins."<< endl;
    }

   else if (Player1 == 'P' && Player2 == 'R')
    {
        cout << "Paper covers rock, Player 1 wins."<< endl;
    }
  else  if (Player1 == 'S' && Player2 == 'P')
    {
        cout << "Scissors cut paper, Player 1 wins."<< endl;
    }
  else  if (Player1 == 'P' && Player2 == 'S')
    {
        cout << "Scissors cut paper, Player 2 wins."<< endl;
    }
   else if (Player1 == 'R' && Player2 == 'S')
    {
        cout << "Rock breaks scissors, Player 1 wins."<< endl;
    }
   else if (Player1 == 'S' && Player2 == 'R')
    {
        cout << "Rock breaks scissors, Player 2 wins."<< endl;
    }

    {     cout << "Play again? (y/n): ";         // Player 1
    cin >> playAgain;
        if (playAgain=='N' || playAgain=='n')
        { cout <<"BYEEEEE"<<endl;}

    }}


while (playAgain=='Y' || playAgain=='y');

return 0;

}

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Вы можете сделать что-то вроде этого:

int main() {
    while(true) {
        char input;
        std::cout << "Would you like to continue the game? (y/n): ";
        std::cin >> input;

        if(input == 'n' || input == 'N')
            return 0;
        else if(input == 'y' || input == 'Y') {
            startGame();
            break;
        } else {
            std::cout << "Invalid response." << std::endl;
        }
    }
}
0 голосов
/ 09 января 2019
cout << "Play again? (y/n): ";
    cin >> playAgain;
while (playAgain != 'Y' && playAgain != 'y' && playAgain !='n' )
{     cout << "Error input :Play again? (y/n): ";         // Player 1
    cin >> playAgain;

^ Разобрался! Да, вернулся к моему отступу и по сравнению с моей первой петлей. Большое спасибо всем за помощь:)

0 голосов
/ 08 января 2019

Я считаю, что самый элегантный способ сделать это:

#include <iostream>
#include <string>
#include <set>

static const std::set<std::string> RPS {
    "R",
    "P",
    "S"
};

static const std::set<std::string> yesno {
    "yes",
    "no"
};

std::string ask_user(
    const std::string& question,
    const std::set<std::string>& valid_answers
) {
    std::cout << question << std::flush; // outputs question (and flushes cout so it displays)
    std::string answer;
    while (true) { // this loop will terminate only when "break;" is reached
        std::getline(std::cin, answer); // get answer
        if (valid_answers.count(answer) == 0) { // if answer is not in valid_answers
            std::cout << "Invalid answer!" << std::endl; // complain to the user
        } else { // if answer is not invalid
            break; // exit loop
        }
    }
    return answer;
}

Тогда вы можете попросить ход, как это:

std::string p1_move = ask_user("Player 1 move (R/P/S)?\n", RPS);

или для ответа да / нет, как это:

std::string answer = ask_user("Another game (yes/no)?\n", yesno);

Это избавит вас от необходимости повторять код как для запроса пользователя на переход, так и для запроса пользователя на другую игру, так что лучше попрактиковаться в коде.

...