-1
votes

Comment puis-je faire une partie de mon code pour boucler et répéter une question jusqu'à ce que la réponse soit une entrée valide C ++

Le code fonctionne bien im je manque juste de manquer l'élément où si la fin demande de répéter le jeu si j'entraîne "A" en tant qu'utilisateur, je voudrais répéter le code de répéter la question avec une nouvelle instruction COUT telle que "une réponse invalide s'il vous plaît répondre y / n et si oui évidemment le jeu se redémarre (Ciseaux en papier rock jeu B / W 2 joueurs)

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 commentaires

Tout comme une suggestion amicale, je recommanderais vivement de garder une indentation cohérente dans votre code, même si elle n'est techniquement pas nécessaire pour qu'il soit exécuté. Il rend le code beaucoup plus facile à lire, pour vous-même et pour les autres. Une fois que vous avez commencé à faire des projets plus importants, vous trouverez qu'il est beaucoup plus facile de changer votre code et de comprendre ce que vous avez écrit.


Vous effectuez une validation d'entrée déjà pour l'entrée R, P ou S. Qu'est-ce qui serait différent de la validation de la prochaine entrée? À propos, une autre suggestion de style est de nommer des variables afin que le nom reflète leur contenu ou leur objectif. Le joueur1 est un bon nom pour un joueur (par exemple une structure qui détient un nom et un score) mais un mauvais nom pour l'entrée. (Un nom meilleur pourrait être player1input ;-).) Une autre suggestion est de rechercher le dossier ... tandis que la boucle pouvant être utilisée pour éviter la duplication de code lorsqu'une action (comme entrée par l'utilisateur par exemple) est toujours requis et doit être répété jusqu'à ce qu'une condition soit remplie.


Merci beaucoup im toujours à l'école pour le code d'où les erreurs plébéiennes :)


3 Réponses :


1
votes

Je crois que la méthode la plus élégante est de le faire: xxx

alors vous pouvez demander un geste comme ceci: xxx

ou pour une réponse oui / non comme ceci: xxx

Cela vous empêchera de répéter le code des deux demandant à l'utilisateur un mouvement et de demander à l'utilisateur un autre Jeu, donc c'est mieux la pratique du code.


1 commentaires

C'est une belle solution. Un pourrait construire la liste des choix dans la question de l'ensemble (avec la prestation de maintenabilité que lorsque l'ensemble change ultérieurement, la question se met automatiquement mise à jour avec elle), mais peut-être que cela est surdéputé pour cela. Dunno.



0
votes

Vous pouvez faire quelque chose comme ceci:

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 commentaires

0
votes
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;
^ Figured it out! Yeah went back to my indentation and compared to my first loop. Thanks so much all for helping :)

0 commentaires