2016-07-24 3 views
0

Je sais que ce serait plus simple si j'utilisais simplement des nombres consécutifs, mais je veux que l'utilisateur choisisse plus facilement un nombre correspondant au type de matrice qu'il choisit. Si j'utilise un opérateur ou suis-je limité à comparer seulement deux choses? C'est ce que j'ai essayé de faire mais ça n'a pas marché. Est-ce ma syntaxe incorrecte ou puis-je pas plusieurs termes chaîne dans une déclaration ?:Comment puis-je exclure plusieurs valeurs d'une opération? Aurais-je utiliser un opérateur ou avec une instruction if else?

if (typeOfDice != 4 || typeOfDice != 6 || 
     typeOfDice != 8 || typeOfDice != //10 || typeOfDice != 12 || 
     typeOfDice != 20 || typeOfDice != 100) 

Voici le programme court, je suis en train de le faire fonctionner. Je veux juste vous assurer que l'utilisateur peut » t briser le programme:

static void Main(string[] args) 
    { 
     Start: 
     Random roll = new Random(); 

     // Request dice type from user 
     Console.WriteLine("Please input the type of dice you want to roll. "); 

     // Display dice types to user 
     Console.WriteLine("4) Four-sided"); 
     Console.WriteLine("6) Six-sided"); 
     Console.WriteLine("8) Eight-sided"); 
     Console.WriteLine("10) Ten-sided"); 
     Console.WriteLine("12) Twelve-sided"); 
     Console.WriteLine("20) Twenty-sided"); 
     Console.WriteLine("100) Percentage"); 
     Console.WriteLine(" "); 

     // Take dice type from user 
     Console.Write("Type of Dice: "); 
     int typeOfDice = Convert.ToInt32(Console.ReadLine()); 
     Console.WriteLine(" "); 

     // Prevents user from breaking the program by printing a corrective message 
     // and restarting the program in the event an inappropriate choice is made by the user. 
     if (typeOfDice != 4 || typeOfDice != 6 || 
     typeOfDice != 8 || typeOfDice != //10 || typeOfDice != 12 || 
     typeOfDice != 20 || typeOfDice != 100) 
      Console.WriteLine("That is not an acceptable die type. Please try again."); 
     goto Start; 
     else 
     { 

      // Initiates random variable and total variable 
      Random rnd = new Random(); 
      int total = 0; 

      // Request number of dice from user 
      Console.WriteLine("Please input the number of dice you want to roll "); 
      Console.WriteLine(" "); 

      // Accept number of dice from user 
      Console.Write("Number of Dice: "); 
      int numberOfDice = Convert.ToInt32(Console.ReadLine()); 
      Console.WriteLine(" "); 

      /// Assigns random generator parameters to user's choice of dice type and 
      // generates random number, looping until the die is rolled the requested 
      // number of times and the result of each new roll is added to the total 
      switch (typeOfDice) 
      { 

       case 4: 
        for (int count = 0; count < numberOfDice; count++) 
        { 

         int currentRoll = rnd.Next(typeOfDice); 
         total += currentRoll + 1; 
         Console.Write("{0} ", currentRoll + 1); 
         //Console.WriteLine(" "); 

        } 
        break; 

       case 6: 
        for (int count = 0; count < numberOfDice; count++) 
        { 

         int currentRoll = rnd.Next(typeOfDice); 
         total += currentRoll + 1; 
         Console.Write("{0} ", currentRoll + 1); 
         //Console.WriteLine(" "); 

        } 
        break; 

       case 8: 
        for (int count = 0; count < numberOfDice; count++) 
        { 

         int currentRoll = rnd.Next(typeOfDice); 
         total += currentRoll + 1; 
         Console.Write("{0} ", currentRoll + 1); 
         //Console.WriteLine(" "); 

        } 
        break; 

       case 10: 
        for (int count = 0; count < numberOfDice; count++) 
        { 

         int currentRoll = rnd.Next(typeOfDice); 
         total += currentRoll + 1; 
         Console.Write("{0} ", currentRoll + 1); 
         //Console.WriteLine(" "); 

        } 
        break; 

       case 12: 
        for (int count = 0; count < numberOfDice; count++) 
        { 

         int currentRoll = rnd.Next(typeOfDice); 
         total += currentRoll + 1; 
         Console.Write("{0} ", currentRoll + 1); 
         //Console.WriteLine(" "); 

        } 
        break; 

       case 20: 
        for (int count = 0; count < numberOfDice; count++) 
        { 

         int currentRoll = rnd.Next(typeOfDice); 
         total += currentRoll + 1; 
         Console.Write("{0} ", currentRoll + 1); 
         // Console.WriteLine(" "); 

        } 
        break; 

       case 100: 
        for (int count = 0; count < numberOfDice; count++) 
        { 

         int currentRoll = rnd.Next(typeOfDice); 
         total += currentRoll + 1; 
         Console.Write("{0} ", currentRoll + 1); 
         //Console.WriteLine(" "); 

        } 
        break; 

      } 

      // Prints total of dice rolls. 
      Console.WriteLine(" "); 
      Console.WriteLine("Total: {0}", total); 
      Console.WriteLine(" "); 

      goto Start; 
     } 

    } 
+0

Vouliez-vous dire une partie de la comparaison? 'typeOfDice! = // 10 ...' Cette ligne ne sera probablement pas compilée telle quelle. –

Répondre

1

Vous voulez un & & (logique) entre votre test pas || (OU logique)

if (typeOfDice != 4 && 
    typeOfDice != 6 && 
    typeOfDice != 8 && 
    typeOfDice != 10 && 
    typeOfDice != 12 && 
    typeOfDice != 20 && 
    typeOfDice != 100) 

Avec le || operator, même si vous sélectionnez une valeur correcte pour les dés, l'évaluation est si toujours vrai. Par exemple, supposons que votre utilisateur sélectionne un dé = 4, maintenant cette valeur de dés (4) est différente de la valeur de dés 6 (ou toute autre valeur acceptable) et donc votre condition trouvera toujours une condition qui est vraie et votre code affiche le message d'erreur

Je souhaite également vous présenter le mot-clé enum.

public enum DiceType 
{ 
    FourSides = 4, 
    SixSides= 6, 
    EightSides = 8, 
    TenSides = 10, 
    TwelveSides = 12, 
    TwentySides = 20, 
    Percentage = 100 
} 

Maintenant, au lieu d'utiliser des numéros magiques que vous utilisez une variable de ce type ENUM

Random roll = new Random(); 
while(true) 
{ 
    // Request dice type from user 
    Console.WriteLine("Please input the type of dice you want to roll. "); 

    // Display dice types to user 
    Console.WriteLine("4) Four-sided"); 
    Console.WriteLine("6) Six-sided"); 
    Console.WriteLine("8) Eight-sided"); 
    Console.WriteLine("10) Ten-sided"); 
    Console.WriteLine("12) Twelve-sided"); 
    Console.WriteLine("20) Twenty-sided"); 
    Console.WriteLine("100) Percentage"); 
    Console.WriteLine(" "); 
    Console.WriteLine("Type quit to exit "); 

    // Take dice type from user 
    Console.Write("Type of Dice: "); 
    string input = Console.ReadLine(); 
    if(input == "quit") 
     break; 

    DiceType typeOfDice; 

    // Try to parse the input and check if it could be an enum of the 
    // desidered type (Note user can also input "foursides" not just 4 
    if (!Enum.TryParse<DiceType>(input, true, out typeOfDice) || 
     !Enum.IsDefined(typeof(DiceType), typeOfDice)) 
     Console.WriteLine("That is not an acceptable die type. Please try again."); 
    else 
    { 
     .... 
     switch (typeOfDice) 
     { 
      case DiceType.FourSides: 
       ..... 
       break; 
      case DiceType.SixSides: 
       ..... 
       break; 

      .... 
     } 
    } 
} 

J'ai supprimé le code goto. Au lieu de cette fameuse mauvaise pratique, j'ai ajouté une boucle infinie autour du code. Un nouveau choix dans votre menu (quitter) permet à votre utilisateur de quitter la boucle et de terminer le programme.

+0

Cela semble avoir corrigé, merci. Mais je reçois une erreur maintenant pour le goto Start; déclaration juste avant l'autre déclaration. Il veut une parenthèse bouclée, mais je pensais que je pourrais juste avoir un point-virgule là-bas et cela le ramènerait à l'étiquette de début en haut. A la fin du programme j'ai aussi un goto Start; déclaration qui semble bien fonctionner. Ajouter des accolades ne semble pas aider. – JohnnyRelentless

+0

N'utilisez pas goto. C'est vraiment une mauvaise pratique et peut être la source de bugs très difficiles à repérer. Au lieu de cela, entourez tout le code qui doit être répété dans une boucle infinie _while (true) _, ajoutez un nouveau choix à votre menu ("Tapez quit to exit"), vérifiez ce mot avant d'entrer l'analyse du code DiceType et ajoutez une déclaration _break_ pour sortir de la boucle infinie – Steve