2016-01-13 5 views
-3

начинающий в C# здесь. Я написал консольную игру старой классической игры Hangman, были пользователи догадываются, что буквы в одном слове, не видя их.C# Hangman, проверьте, соответствует ли целое слово

Мой код работает хорошо, я просто хочу добавить еще одну вещь, и я не знаю, как это сделать. Начиная с текущего, если вы нажмете «3» и сыграете в игру, вы можете угадать только один символ за раз. Я хочу, чтобы пользователь мог угадать слово WHOLE, и если он правильный, сопоставьте его со словом и напишите его.

По состоянию на текущий момент у меня есть исключение, которое записывает сообщение ERROR, если пользователь пытается записать более одного символа.

Я застрял на этом очень долго и хотел бы, чтобы кто-нибудь мог сказать мне, как реализовать это в моем коде, мой код выглядит следующим образом.

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

Hi @Strixx, облегчите нам помощь. Большинство из нас не говорят по-шведски, поэтому мы не можем использовать ваши комментарии, чтобы быстрее добраться до места, и ваш код проклят долго, если кто-то ответит вам на месте. Вероятно, вы знаете, в каком методе принадлежит логика, или, по крайней мере, намекайте нам, куда вы его поместите. Может быть, извлечь этот метод в другом блоке кода? Чем легче нам помочь, тем быстрее вы получите ответы! –

+0

Это, я боюсь, подпадает под категорию tl; dr для большинства людей, следуя отличным советам ТимБургиньона, улучшит ваш вопрос. – 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 else if length == 1? – n1ff

+0

@ Ник вы правы :) – daryal

Смежные вопросы