簡體   English   中英

C#策划者游戲

[英]C# mastermind game

在Main方法的for循環中,如果您以可視化方式復制/粘貼/運行整個程序,則會看到我正在嘗試結束游戲。 如果用戶尚未猜測,則為“ if”。 然后嘗試遞減1並不斷猜測。 如果用戶猜到了PCArray,則第二個“ else if”,游戲結束並顯示消息。 這些工作。

但是,第一個“ else if”(如果用戶已經用盡了所有嘗試猜測的機會,而沒有猜測PCArray的話)應該說“哦,不,您無法猜測...”,這為什么不起作用。

我只是希望它能起作用,以便在以下情況下出現:-用戶未猜測但仍嘗試,嘗試將遞減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;
            }
        }

首先,您應該重新考慮代碼,因為流控制分散在整個代碼中。 例如,您不需要attemptsremaining ,它們可以控制同一件事。

使用兩個變量來控制同一件事是導致您出現問題的原因。 您的for的前兩個if應該是這樣的:

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;
    }
}

它還會進行一些驗證,甚至可以讓您再次玩! ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM