2016-01-13 85 views
-3

初學C#這裏。我已經寫了一個古老的經典遊戲Hang子手遊戲機,用戶猜測這些字母是在一個字裏,而沒有看到它們。C#Hang子手,檢查整個單詞是否匹配

我的代碼運行良好,我只想添加一件事,我現在不知道如何去做。截至目前,如果按下「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(); 
} 

}

+7

嗨@Strixx,讓我們更容易幫助你。我們大多數人不會說瑞典語,所以我們不能使用您的意見加快速度,並且您的代碼很久就會有人爲您解答。你可能知道邏輯屬於哪種方法,或者至少暗示我們將它放在哪裏。也許在不同的代碼塊中提取此方法?對我們來說越容易幫助,你就會越快得到答案! –

+0

這讓我害怕來自tl; dr對於大多數人來說,遵循TimBourguignon的出色建議可以改善您的問題。 – tomRedox

+0

你好@TimBourguignon,你是絕對正確的,現在我沒有想過發送這些信息並期望人們理解。已經清醒了2天直接編碼,所以我在大腦中有點模糊,感謝您的輸入! @ Exxoff的解決方案對我來說非常完美,所以在解決問題時不會改變它! – Strixx

回答

0

算多少字符有在guess並檢查它是否是一樣的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 
} 
+0

謝謝@Exxoff工作完美! – Strixx

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 
    } 
} 
+0

認爲這裏有一個錯字,如果長度== 1否則如果長度== 1? – n1ff

+0

@Niff你是對的:) – daryal