簡體   English   中英

驗證用戶輸入是字母表中的一個字母

[英]Validating that user input is a letter of the alphabet

我正在嘗試制作一個劊子手游戲,它從單詞的文本文件中隨機選擇一個單詞。 然后它以星號顯示單詞,並要求用戶猜出單詞的每個字母,如果他們猜對了,就會發現那個字母。他們繼續玩,直到他們猜出單詞中的所有字母。猜出單詞后,它會顯示數字未命中並詢問他們是否想再玩一次。

我遇到的問題是我試圖驗證用戶輸入了一個字符並且它是字母表中的一個字母但是當用戶輸入一個字母時它只是開始一個無限循環。不知道如何解決這個問題.

 static void Main(string[] args)
    {
        char[] guessed = new char[26];
        char guess = ' ';
        char playAgain= ' ';
        bool validLetterInput = false;
        bool validAnswer = false;


        int amountMissed = 0, index = 0;

        do
        {
            // initilization of word and testword so that we could generate a testword with the same length as original
            char[] word = RandomLine().Trim().ToCharArray();

            char[] testword = new string('*', word.Length).ToCharArray(); 
            char[] copy = word;

            Console.WriteLine(testword);
            Console.WriteLine("I have picked a random word on animals");
            Console.WriteLine("Your task is to guess the correct word");


            while (!testword.SequenceEqual(word))
            {
                while (!validLetterInput)
                {
                    try
                    {
                        Console.Write("Please enter a letter to guess: ");
                        guess = char.Parse(Console.ReadLine().ToLower());
                        //Checks if guess is letter or not
                        if (((guess >= 'A' && guess <= 'Z') || (guess >= 'a' && guess <= 'z')))
                        {
                            validLetterInput = true;
                        }
                        else
                        {
                            Console.WriteLine("Invalid Input");
                        }


                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);

                    }
                }

                bool right = false;
                for (int j = 0; j < copy.Length; j++)
                {
                    if (copy[j] == guess)
                    {
                        Console.WriteLine("Your guess is correct.");
                        testword[j] = guess;
                        guessed[index] = guess;
                        index++;
                        right = true;
                    }
                }
                if (right != true)
                {
                    Console.WriteLine("Your guess is incorrect.");
                    amountMissed++;
                }
                else
                {
                    right = false;
                }
                Console.WriteLine(testword);

            }
            Console.WriteLine($"The word is {string.Join("",testword)}. You missed {amountMissed} times.");
            while (!validAnswer)
            {
                try
                {
                    Console.WriteLine("Do you want to guess another word? Enter y or n: ");
                    playAgain = char.Parse(Console.ReadLine());
                    if(playAgain == 'y' || playAgain == 'Y' || playAgain == 'n' || playAgain == 'N')
                    {
                        validAnswer = true;
                    }
                    else
                    {
                        Console.WriteLine("Invalid input try again");
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        } while (playAgain == 'y' || playAgain == 'Y');


        Console.WriteLine("Good-Bye and thanks for playing my Hangman game.");
    }
        public static string RandomLine()
    {

            // store text file in an array and return a random value
            string[] lines = File.ReadAllLines("E:\\Advanced1.csv");
            Random rand = new Random();
            return lines[rand.Next(lines.Length)].ToLower();



    }
}

你只需要添加一行。 檢查字母並打印測試詞后,將validLetterInput重置為false,以便它可以獲取下一個字母。

if (right != true)
{
    Console.WriteLine("Your guess is incorrect.");
    amountMissed++;
}
else
{
    right = false;
}
Console.WriteLine(testword);
validLetterInput = false;

在第一次驗證后,您似乎沒有將 validLetterInput 重置為 false。


while (!testword.SequenceEqual(word))
{
    while (!validLetterInput) // <-- Need to reset this after first correct validation
    {
        try
        {
            Console.Write("Please enter a letter to guess: ");
            guess = char.Parse(Console.ReadLine().ToLower());
            //Checks if guess is letter or not
            if (((guess >= 'A' && guess <= 'Z') || (guess >= 'a' && guess <= 'z')))
            {
                validLetterInput = true;
            }
            else
            {
                Console.WriteLine("Invalid Input");
            }


        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);

        }
    }
    validLetterInput = false; // <--- ADD THIS HERE

在第一個字母被接受為有效字符后,它永遠不會為下一個字母重置。 退出檢查有效輸入的 while 循環后,將 validLetterInput 重置為 false

暫無
暫無

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

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