初学者在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();
}
}
答案 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