C#Hangman,检查整个单词是否匹配

时间:2016-01-13 14:41:48

标签: c#

初学者在C#这里。我已经写了一个旧的经典游戏Hangman的控制台游戏,如果用户猜到字母在一个单词中没有看到它们。

我的代码效果很好,我只想再添加一个东西,我现在不知道如何去做。截至目前,如果您按“3”并玩游戏,您一次只能猜出一个角色。我想让用户能够猜出整个单词,如果正确,则将其与单词匹配并写出来。

截至当前,我有一个异常,如果用户尝试写入多个字符,则会写出错误消息。

我一直坚持这个很长的时间,如果有人能告诉我如何在我的代码中实现这一点,我会很高兴,我的代码如下。

    using System;
    using System.Collections.Generic;
    using System.Linq;//*Notering, ta reda på mer om linq
    using System.Media; 
    public class WordList : List<string> //Skapar klass WordList 
    {
    }
    public class Hangman
    {
    /* 
     * TO-DO-LIST:
     * Användaren ska kunna skriva in ett helt ord och  detta ska sedan
     * jämföras med de ord som finns i programmets lista. Se 10.7 i boken.
     */

    private static WordList words;
    private static Random randomR = new Random();

    public static void Main(string[] args)
    { /*Konsol utseende */
    Console.ForegroundColor = ConsoleColor.DarkGreen; //Ändra konstoltext färg till röd
    Console.Title = "C# Hangman"; //Ger konsolspelet en titel
    Console.WriteLine("Välkommen till C# Hangman-spelet!");                 //Hälsningsfras när spelet öppnas
    initializeWordList();

    //_______________________START-          MENY_______________________________________________
    int MenuChoice = 0; //Skapar heltals variabel som kommer användas i         switch sats
    while (MenuChoice != 4) //Loop som visar menyn tills spelaren gör ett val
    {

        Console.Write("\n\t1) Lägg till ord");
        Console.Write("\n\t2) Visa ordlista");
        Console.Write("\n\t3) Spela");
        Console.Write("\n\t4) Avsluta\n\n");

        Console.Write("\n\tVälj 1-4: ");        //Välj menyval

        MenuChoice = Convert.ToInt32(Console.ReadLine()); //Spelarens val registreras i 
                                                          //tidigare skapad variabel
        switch (MenuChoice)  //Switch sats startar.                           
        {  /*Alternativ 1 - Lägg till ord*/
            case 1: 
                Console.Clear();//Rensar konsolfönster
                Console.Write("\n\tLägg till ett ord\n\n");
                var insert = Console.ReadLine(); //Läser av inskrivet ord
                words.Add(insert); //Lägger till ord i lista
                Console.Write("\n\tOrdlista\n\n");
                words.Sort();
                foreach (string w in words) 
                    Console.WriteLine(w); //Skriv ut för att verifiera att ordet lagts till
                break;

            /*Alternativ 2 - Visa ordlista*/
            case 2: 
                Console.Clear();
                Console.Write("\n\tOrdlista\n\n");
                foreach (string w in words) // Skriver ut ordlista
                    Console.WriteLine(w);
                break;

            /*Alternativ 3 - Spela*/
            case 3:
                /*Spelar bakgrundsmusik i loop medans Alternativ 3 är valt*/
                (new SoundPlayer(@"c:\Program\Media\background.wav")).PlayLooping();
                Console.Clear();
                int numGuessesInt = -1; //Skapar variabel som används för att bestämma
                while (numGuessesInt == -1)//antal gissningar.

                {
                    /* Bestämmer antalet gissningar spelaren har.*/
                    userpickGuesses(ref numGuessesInt);
                }

                /* Väljer ut slumpartat ord*/
                string word = randomWord();


                /* skapar lista av char som visas */
                List<char> guessedLetters = new List<char>();
                bool solved = false;
                while (solved == false)
                {
                    /* Visning av sträng till spelare baserat på spelarens gissningar.
                     * Om spelaren ej lyckats gissa något rätt visas "_ _ _ " */
                    string wordToDisplay = showWord(guessedLetters, word);
                    /* Om strängen som returneras innehåller "_" karaktären, så har
                    * ej korrekt antal bokstäver gissats, för att kontrollera om spelare
                    * förlorar kollas det om variabel numGuessesLeft är mindre än 1.*/
                    if (!wordToDisplay.Contains("_"))
                    {
                        solved = true;
                        Console.WriteLine("Grattis, du vann!  Ordet du gissa var:  " + word);
                        /* Kolla om spelare vill spela igen. Om dom vill det så
                        * sätts variabel solved till true, detta avslutar loopen.
                        * Om spelare ej vill spela igen kommer metoden userReplay stänga ner programmet*/
                        userReplay();
                    }
                    else if (numGuessesInt <= 0)
                    {
                        solved = true;
                        Console.WriteLine("Trist kompis, du förlora! Det korrekta ordet var:  " + word);
                        userReplay();
                    }
                    else
                    {
                        /* Om spelaren varken vinner eller förlorar så
                        * visas ordet och antal gissningar minus 1.*/
                        letterGuess(guessedLetters, word, wordToDisplay, ref numGuessesInt);
                    }
                }

                break;

            case 4: /*Alternativ 4 - Avsluta spelet*/
                Console.WriteLine("\n\tTryck på valfri tangent för att avsluta?\n\n");
                break;
            default:
                Console.WriteLine("Error[1]: Fel tangent, testa igen");
                break;
        }

    }

}

    //_________________________Lista med färdigbestämda ord____________________________________________
    private static void initializeWordList()
    {
    words = new WordList();
    words.Add("projektarbete");         // innehåller ord: projektarbete
    words.Add("programmering");          // innehåller orden: projektarbete, programmering
    words.Add("csharp");
    words.Add("stenberg");
    words.Insert(1, "hårdvara"); // Innehåller orden: "projektarbete", "programmering", "csharp", 
    words.Sort();                // "stenberg" och "hårdvara"
}


    //___________________METOD-Välj antal gissningar_________________________________________________________

    private static void userpickGuesses(ref int userNumGuessesInt)
    {
    string numGuessesString = ""; //Intierar sträng med tomt innehåll
    Console.WriteLine("Välj antal gissningar: "); //Promptar spelare att ange antal gissningar
    numGuessesString = Console.ReadLine(); //Läser in antal gissningar av spelare
    try
    {
        userNumGuessesInt = Convert.ToInt32(numGuessesString); //Sträng görs om till heltal(int).
        if (!(userNumGuessesInt <= 20 & userNumGuessesInt >= 1))// Undantag om spelare skriver in för*
        {                                              //stort eller litet antal gissningar.
            throw new Exception();
        }
    }
    catch (Exception)
    {
        userNumGuessesInt = -1;
        Console.WriteLine("Error[2]: Fel antal gissningar");//Om undantaget är sant visas
    }                                                         //varnings meddelande
}

    //__________________METOD-Slumpat ord_________________________________________________

    private static string randomWord()
{
    return words[randomR.Next(0, words.Count() - 1)]; //*Notering, ta reda på mer om skillnad mellan .Count och .Count()
}


    //________________________METOD-Visa ord___________________________________________

    private static string showWord(List<char> guessedCharacters, string word)
    {
    string returnedWord = ""; //Initierar sträng med tomt innehåll
    if (guessedCharacters.Count == 0) 
    {
        foreach (char letter in word) //Visar karaktären "_" för varje bokstav
        {
            returnedWord += "_ ";
        }
        return returnedWord; //Returnerar värde
    }
    foreach (char letter in word)
    {
        bool letterMatch = false;//Skapar bool-variabel letterMatch som används för att kontrollera om 
        foreach (char character in guessedCharacters)//spelaren skrivit in en korrekt bokstav.
        {
            if (character == letter) //Om karaktären spelaren valt överrenstämmer med en bokstav
            {           //i det nuvarande ordet så visas endast den bokstaven istället för "_".
                returnedWord += character + " ";
                letterMatch = true;//Bool-variabeln sätts till "true" om spelar gör rätt val
                break;
            }
            else
            {
                letterMatch = false; //Om spelaren gör fel val så sätts/fortsätter 
                                     //bool-variabeln letterMatch att vara "falsk"

            }                        
        }
        if (letterMatch == false) //Om letterMatch är "false" så visas ej någon bokstav,
        {                         //utan endast karaktären "_"
            returnedWord += "_ ";
        }
    }
    return returnedWord;
}

    //_____________________________METOD-Gissa bokstav____________________________________________________________________________

    static void letterGuess(List<char> guessedCharacters, string word, string wordToDisplay, ref int numGuessesLeft)
    {
    string letters = "";
    foreach (char letter in guessedCharacters)
    {
        letters += " " + letter;
    }
    Console.WriteLine("Gissa på en bokstav mellan A-Ö");
    Console.WriteLine("Gissade bokstäver: " + letters);
    Console.WriteLine("Gissningar kvar: " + numGuessesLeft);
    Console.WriteLine(wordToDisplay);
    string guess = Console.ReadLine();
    char guessedLetter = 'a';
    try
    {
        guessedLetter = Convert.ToChar(guess);
        if (!char.IsLetter(guessedLetter))
        {
            throw new Exception();
        }
    }
    catch (Exception)
    {//Hanterar ett udantag om spelaren skriver in mer än 1 karaktär eller om karaktären ej är en bokstav
      Console.WriteLine("Error[3]: Endast en bokstav åt gången");

    }
    bool repeat = false;
    for (int i = 0; i < guessedCharacters.Count; i++)
    {
        if (guessedCharacters[i] == guessedLetter)
        {//Hanterar ett undantag om spelaren skriver in en bokstav som redan är vald
            Console.WriteLine("Error[4]: Du har redan valt den bokstaven, välj en annan");
            repeat = true;

        }
    }
    if (repeat == false)//Om spelare skriver in en bokstav korrekt, utan undantag, så läggs
    { //bokstaven till i gussedLetter för att sedan kunna visas som "gissade bokstäver"
        guessedCharacters.Add(guessedLetter);
        numGuessesLeft -= 1; //En gissning förloras
    }
}

    //_______________________METOD-Kolla om spelare vill spela igen______________________________________

    static void userReplay()
    {
    Console.WriteLine("Vill du spela igen? (j/n)");//Ger spelare ett val om omspel.
    string playAgain = Console.ReadLine();//Läser in spelares input.
    if (playAgain == "n")//Om spelare valt "n" avslutas programmet.
    {
        Environment.Exit(1);
    }
    Console.Clear();
}

}

2 个答案:

答案 0 :(得分:1)

string guess = Console.ReadLine();

阅读用户输入后检查其大小:

 if(guess.Length == 1)
 {
    //execute your current logic
 } else if(guess.Length >= 1){
     if(guess == word){
         // right guess
     }else{
      //wrong guess
     }
 }

答案 1 :(得分:0)

计算word中的字符数,并检查它是否与if(guess.Length > 1) { Console.WriteLine(guess == word ? string.Format("Congrats! The correct word was {0}", word) : string.Format("Oh darn! The correct word was '{0}'", word)); userReplay(); } else { //Execute your current try block here } 相同。

您可能还想更改错误消息以显示只允许使用字母,因为我们已经处理了“太多字符”的问题。

cat