2015-07-19 109 views
0

在Main方法中,在for循环中,如果您在visual中复制/粘贴/运行整个程序,您会看到我试图结束游戏。首先“如果”,如果用户没有猜到;然后尝试减1并继续猜测。如果用户猜到PCArray,则第二个“else if”比游戏结束和消息显示。那些工作。C#mastermind游戏

但是,如果用户已经用尽猜测,并且没有猜到PCArray,那么第一个“else if”比应该说“哦不,你猜不到......”为什么是这个不工作。

我只是想让它工作,所以如果: - 用户没有猜到但仍然有尝试,尝试减1,直到0. - 用户猜对了正确的数字,它说恭喜。 - 尝试次数为0,用户仍然没有猜到号码,然后显示“哦,不......”的消息。

class Program 
     { 
      static void Main(string[] args) 
      { 
       string name; 

       Console.WriteLine("**************Let's play Master-Mined**************"); 
       Console.WriteLine(); 
       Console.Write("Please enter your name: "); 
       name = Console.ReadLine(); 
       Console.WriteLine("Welcome {0}. Have fun!! ", name); 

       int numberCount = 0; 
       int difficultyLevel = 0; 

       int digitNumber = GetRandomNumberCount(numberCount); 
       Console.Write(digitNumber + " it is. Let's play."); 
       Console.WriteLine(); 
       int[] PCArray = GenerateRandomNumbers(digitNumber); 

       Console.WriteLine("A " + digitNumber + "-digit number has been chosen. Each possible digit may be the number 1, 2, 3 or 4."); 
       Console.WriteLine(" ******"); 

       int difficulty = GetGameDifficulty(difficultyLevel); 
       int attempts = difficulty * digitNumber; 

       Console.WriteLine("Enter your guess ({0} guesses remaining)", attempts); 
       int remaining = attempts; 

       for (int i = 0; i < attempts; i++) 
       { 
        int[] userArray = GetUserGuess(digitNumber); 
        int hits = CountHits(PCArray, userArray, attempts); 

        if ((hits != PCArray.Length) && (attempts > 0)) 
        { 
         remaining--; 
         Console.WriteLine("Enter your guess ({0} guesses remaining)", remaining); 
        } 
        else if ((attempts < 1)) 
        {      
         Console.WriteLine("Oh no {0}! You couldn't guess the right number.", name); 
         Console.WriteLine("The correct number is: "); 
         for (int j = 0; j < PCArray.Length; j++) 
         { 
          Console.Write(PCArray[j] + " "); 
         } 
         Console.WriteLine("Would you like to play again (Y/N)? "); 
        } 
        else if (hits == PCArray.Length) 
        { 
         attempts = 0; 
         Console.WriteLine("You win {0}!", name); 
         Console.WriteLine("The correct number is:"); 
         for (int j = 0; j < PCArray.Length; j++) 
         { 
          Console.Write(PCArray[j] + " "); 
         } 
        } 
       } 
       Console.ReadLine(); 
      }   
      public static int GetRandomNumberCount(int numberCount) 
      { 
       int number = 0; 
       do 
       { 
        try 
        { 
         Console.Write("How many numbers would you like to use in playing the game (4-10)? "); 
         number = int.Parse(Console.ReadLine()); 
         Console.WriteLine(); 
        } 
        catch 
        { 
         Console.WriteLine("You must pick a number between 4 and 10. Choose again."); 
         Console.WriteLine(); 
        } 
       } while ((number < 4) || (number > 10)); 

       return number; 
      } 
      public static int GetGameDifficulty(int difficultyLevel) 
      { 
       int difficulty = 0; 

       do 
       { 
        try 
        { 
         Console.Write("Choose a difficulty level (1=hard, 2=medium, 3=easy): "); 
         difficulty = int.Parse(Console.ReadLine()); 
        } 
        catch 
        { 
         Console.WriteLine("   Incorrect entry: Please re-enter."); 
        } 
       } while ((difficulty < 1) || (difficulty > 3)); 

       return difficulty; 
      } 
      public static int[] GenerateRandomNumbers(int PCSize) 
      { 
       int eachNumber; 
       int[] randomNumber = new int[PCSize]; 
       Random rnd = new Random(); 

       for (int i = 0; i < randomNumber.Length; i++) 
       { 
        eachNumber = rnd.Next(1, 5); 
        randomNumber[i] = eachNumber; 
        Console.Write(eachNumber); 
       } 
       Console.WriteLine(); 
       return randomNumber; 
      } 
      public static int[] GetUserGuess(int userSize) 
      { 
       int number = 0; 
       int[] userGuess = new int[userSize]; 
       for (int i = 0; i < userGuess.Length; i++) 
       { 
        Console.Write("Digit {0}: ", (i + 1)); 
        number = int.Parse(Console.ReadLine()); 
        userGuess[i] = number; 
        //Console.Write(number); 
       } 
       Console.WriteLine(); 
       Console.Write("Your guess: "); 
       for (int i = 0; i < userGuess.Length; i++) 
       { 
        Console.Write(userGuess[i] + " "); 
       } 
       Console.WriteLine(); 
       return userGuess; 
      } 
      public static int CountHits(int[] PCArray, int[] userArray, int attempts) 
      { 
       int hit = 0; 
       int miss = 0; 
       int hits = 0; 

       for (int i = 0; i < PCArray.Length; i++) 
       { 
        if (PCArray[i] == userArray[i]) 
        { 
         hit = hit + 1; 
         hits = hit; 
        } 
        else 
        { 
         miss = miss + 1; 
        } 
       } 
       Console.WriteLine("Results: {0} Hit(s), {1} Miss(es)", hit, miss); 
       return hits; 
      } 
     } 

回答

3

首先,您应该重新考虑您的代码,因为流量控制分散在您的代码中。例如,您不需要attemptsremaining,它们控制着同样的事情。

使用两个变量来控制相同的事情是什么导致你的问题。前两个if在你for应该是这样的:

if (hits != PCArray.Length && remaining > 1) 

else if (remaining == 1) 

注意我删除了不必要的括号。通过这些更改,您的应用程序可以工作,但代码不太漂亮。

增强代码的一种简单方法是首先检查正确的结果,如果不是,则减少attempts变量并最终检查其值。这就是为什么用你的代码,if应该比较1,而不是0

您的CountHits方法中的hits变量是完全不必要的;你应该只返回hit。其实miss变量也可以避免,你可以计算它。还请记住使用++运算符。

但正如我先说的,重要的不是让它工作,而是要正确地组织你的代码。稍后我会发布我的版本。


我的版本,它不是世界上最美丽的东西,但我不想改变你的代码结构的

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("************** Let's play Master-Mind **************\n"); 

     string name = GetPlayerName(); 

     do 
     { 
      Play(name); 

      Console.Write("\nWould you like to play again (Y/N)? "); 
     } 
     while (Console.ReadLine().ToUpper() == "Y"); 
    } 

    private static void Play(string name) 
    { 
     int numberCount = GetRandomNumberCount(); 
     Console.Write(numberCount + " it is. Let's play."); 
     Console.WriteLine(); 

     int[] PCArray = GenerateRandomNumbers(numberCount); 
     Console.WriteLine("A {0}-digit number has been chosen. Each possible digit may be the number 1 to 4.\n", numberCount); 

     int difficulty = GetGameDifficulty(); 

     bool won = false; 
     for (int allowedAttempts = difficulty * numberCount; allowedAttempts > 0 && !won; allowedAttempts--) 
     { 
      Console.WriteLine("\nEnter your guess ({0} guesses remaining)", allowedAttempts); 

      int[] userArray = GetUserGuess(numberCount); 

      if (CountHits(PCArray, userArray) == numberCount) 
       won = true; 
     } 

     if (won) 
      Console.WriteLine("You win, {0}!", name); 
     else 
      Console.WriteLine("Oh no, {0}! You couldn't guess the right number.", name); 

     Console.Write("The correct number is: "); 
     for (int j = 0; j < numberCount; j++) 
      Console.Write(PCArray[j] + " "); 
     Console.WriteLine(); 
    } 

    private static string GetPlayerName() 
    { 
     Console.Write("Please enter your name: "); 
     string name = Console.ReadLine(); 
     Console.WriteLine("Welcome, {0}. Have fun!!\n", name); 
     return name; 
    } 

    public static int GetRandomNumberCount() 
    { 
     int number; 

     Console.Write("How many numbers would you like to use in playing the game (4-10)? "); 
     while (!int.TryParse(Console.ReadLine(), out number) || number < 4 || number > 10) 
      Console.WriteLine("You must pick a number between 4 and 10. Choose again."); 

     return number; 
    } 

    public static int GetGameDifficulty() 
    { 
     int difficulty = 0; 

     Console.Write("Choose a difficulty level (1=hard, 2=medium, 3=easy): "); 
     while (!int.TryParse(Console.ReadLine(), out difficulty) || difficulty < 1 || difficulty > 3) 
      Console.WriteLine("Incorrect entry: Please re-enter."); 

     return difficulty; 
    } 

    public static int[] GenerateRandomNumbers(int PCSize) 
    { 
     int eachNumber; 
     int[] randomNumber = new int[PCSize]; 
     Random rnd = new Random(); 

     Console.Write("PC number: "); 
     for (int i = 0; i < PCSize; i++) 
     { 
      eachNumber = rnd.Next(1, 5); 
      randomNumber[i] = eachNumber; 
      Console.Write(eachNumber); 
     } 
     Console.WriteLine(); 
     return randomNumber; 
    } 

    public static int[] GetUserGuess(int userSize) 
    { 
     int number = 0; 
     int[] userGuess = new int[userSize]; 
     for (int i = 0; i < userSize; i++) 
     { 
      Console.Write("Digit {0}: ", (i + 1)); 
      while (!int.TryParse(Console.ReadLine(), out number) || number < 1 || number > 4) 
       Console.WriteLine("Invalid number!"); 
      userGuess[i] = number; 
     } 
     Console.WriteLine(); 
     Console.Write("Your guess: "); 
     for (int i = 0; i < userSize; i++) 
     { 
      Console.Write(userGuess[i] + " "); 
     } 
     Console.WriteLine(); 
     return userGuess; 
    } 

    public static int CountHits(int[] PCArray, int[] userArray) 
    { 
     int hits = 0; 

     for (int i = 0; i < PCArray.Length; i++) 
     { 
      if (PCArray[i] == userArray[i]) 
       hits++; 
     } 

     Console.WriteLine("Results: {0} Hit(s), {1} Miss(es)", hits, PCArray.Length - hits); 
     return hits; 
    } 
} 

它确实多了一些验证和它甚至实际上让你再玩一次! ;)

+0

谢谢安德鲁,我试了几次,我认为它现在正常工作。 我完全理解“剩余”和“企图”是一样的。我没有得到的唯一问题是,如果我只在我的循环中使用“企图”而不是“剩余”,比程序停止一半。因此,如果您从8次尝试开始,则程序将以剩余4次猜测结束。如果你从12开始,程序将在6次尝试后开始。 –

+0

...在6次尝试后停止*(不开始)。 –

+0

那么,你应该调试它,看看它为什么停在那里;应该不难看出循环结束的条件是什么。 – Andrew