2017-08-17 1 views
-2

Je construis un jeu de combat de monstres basé sur console simple à des fins d'entraînement.C# if else problème de gestion des entrées utilisateur

J'ai créé une boucle while qui est presque là où j'en ai besoin, mais lorsque l'utilisateur entre un choix incorrect, le message final de type "entrée incorrecte" boucle simplement à l'infini sur l'écran.

Quelqu'un pourrait-il suggérer une solution s'il vous plaît?

Ou, si j'utilise un essai, attraper le gestionnaire d'exception à la place (je ne suis pas très bon à ceux-ci pour le moment).

Merci,

Code suit:

P.S La variable acceptInput booléenne est initialisé en haut de la classe qui ne sont pas inclus dans ce segment de code.

while (!acceptInput) 
        { 
        if (playerChoice == "a" || playerChoice == "h") 
        { 
         if (playerChoice == "a") 
         { 
          player.PlayerAttack(); 
          if (random.NextDouble() > .9) 
          { 
           Console.WriteLine("You missed!"); 
           Console.WriteLine("Press ENTER to continue"); 
           Console.ReadLine(); 
          } 
          else 
          { 
           Console.WriteLine("It's a hit!"); 
           monster.MonsterDecreaseHealth(player.AttackPower); 
           Console.WriteLine("Press ENTER to continue"); 
           Console.ReadLine(); 
          } 
          acceptInput = true; 
         } 
         else if (playerChoice == "h") 
         { 
          player.PlayerHeal(); 
          acceptInput = true; 
         } 
        } 
        else 
        { 
         Console.WriteLine("That is not a valid choice, please enter either A or H"); 
        } 
        } 
+0

vous devez inclure comment vous obtenez la valeur de 'playerChoice'. –

+0

Vous ne modifiez pas la condition de boucle sur une entrée non valide, alors pourquoi tout changement? vous devez obtenir 'playerChoice' du joueur * dans la boucle, sinon il ne changera jamais. – itsme86

+1

Pourquoi votre 'while (! AcceptInput)' est-il inversé? Pourquoi pas alors que while (acceptInput) 'semble confus. en anglais, cela se lirait comme si ** tandis que ** ** n'acceptant pas l'entrée, faites tout ici de façon répétée. » – Seabizkit

Répondre

2

Semblable à ce que Pintang a dit plus haut, c'est parce que l'utilisateur n'a pas l'occasion de réinitialiser la valeur de la variable playerChoice. Au début de la boucle while, vous devez autoriser la réinitialisation de la variable playerChoice à une nouvelle entrée. Il n'existe actuellement aucune méthode permettant à l'utilisateur de mettre à jour la valeur de playerChoice, donc si la première instance de la condition est évaluée à false, il y aura une boucle infinie. Je ferais quelque chose comme ceci

while (!acceptInput) 
{ 
    playerChoice = GetUserInput(); // GetUserInput() return user input string 

    if (playerChoice.Equals("a")) 
    { 
     player.PlayerAttack(); 

     if (Random.NextDouble() > 0.9) 
     { 
      Console.WriteLine("You Missed!"); 
      Console.WriteLine("Press 'Enter' to Continue..."); 
      Console.ReadLine(); 
     } 

     else 
     { 
      Console.WriteLine("It's a hit!"); 
      monster.MonsterDecreaseHealth(player.AttackPower); 
      Console.WriteLine("Press 'Enter' to Continue..."); 
      Console.ReadLine(); 
     } 

     acceptInput = true; 
    } 

    else if (playerChoice.Equals("h")) 
    { 
     player.PlayerHeal(); 

     acceptInput = true; 
    } 

    else 
    { 
     Console.WriteLine("That is not a valid choice, please enter either A or H"); 
    } 
} 
+0

Ce que [@ edm2282] (https://stackoverflow.com/users/8309428/edm2282) voulait dire, si vous ne définissez pas 'playerChoice' sur soyez relus, votre programme bouclera pour toujours car il aura toujours la même valeur. Placez 'playerChoice = Console.ReadLine();' après votre message "Ce n'est pas un choix valide". – Tiramonium

-2

La première option consiste à utiliser:

break; 

dans votre état autre où vous imprimez choix non valide.

La deuxième option est de mettre la ligne suivante:

acceptinput=true; 

dans cette condition d'autre.

+0

'Console.WriteLine (" Vous avez manqué! ");' – Will