C#mastermind游戏

时间:2015-07-19 21:04:05

标签: c#

在Main方法中,在for循环中,如果您在视觉中复制/粘贴/运行整个程序,您将看到我试图结束游戏。首先"如果",如果用户没有猜到;然后尝试减1并继续猜测。第二个"否则如果",如果用户已经猜到PCArray,则比游戏结束并显示消息。那些工作。

但是,第一个"否则如果",如果用户已经用尽他的猜测,并且没有猜到PCArray,那么它应该说"哦不,你不能" 39;猜猜..."为什么这不起作用。

我只是想让它工作,以便: - 用户没有猜到但仍有尝试,尝试递减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;
            }
        }

1 个答案:

答案 0 :(得分:3)

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

使用两个变量来控制同一件事是造成问题的原因。 if中的前两个for应该是这样的:

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

else if (remaining == 1)

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

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

hits方法中的CountHits变量完全没必要;你应该回归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;
    }
}

它可以进行更多验证,甚至可以让您再次玩游戏! ;)