Permalänk

Hjälp med HangMan i C#

Hej allihopa!
Jag behöver er hjälp med spelet HangMan. Det är en projekt som jag måste lämna in så fort jag kan.

programmet är nästan färdig och det som jag behöver hjälp med är:
Lägga till ord
Lista alla ord

Jag är väldigt tacksam för er hjälp!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication6 { class Projektarbete { static void Main(string[] args) { Random random = new Random((int)DateTime.Now.Ticks); string[] gissat = { "projektarbete" }; Console.WriteLine(" ************************ "); Console.WriteLine(" * HÄNGA GUMMA! * "); Console.WriteLine(" ************************ "); Console.WriteLine("\n1 Lägg till ord "); Console.WriteLine("\n2 Lista alla ord "); Console.WriteLine("\n3 Spela "); Console.WriteLine("\n4 Avsluta "); Start: Console.WriteLine("\n Välj 1-4:"); String välja = Convert.ToString(Console.ReadLine()); Console.WriteLine("\n\n"); // Nu har vi lagt menyLista switch (välja) { case "1": Console.WriteLine(" Lägg till ord "); break; case "2": Console.WriteLine(" Lista alla ord "); Console.WriteLine(); string word = Convert.ToString(Console.ReadLine()); List<string> lista = new List<string>(); lista.Add(""); //foreach (string i in lista) break; case "3": Console.WriteLine(" Spela "); { Console.WriteLine(" Du får två försök! "); } break; case "4": Console.WriteLine(" Avsluta "); goto Avsluta; default: goto Start; } string ordAttGissa = gissat[random.Next(0, gissat.Length)]; string ordAttGissaUppercase = ordAttGissa.ToUpper(); StringBuilder displayToPlayer = new StringBuilder(ordAttGissa.Length); for (int i = 0; i < ordAttGissa.Length; i++) displayToPlayer.Append('_'); List<char> correctGuesses = new List<char>(); List<char> incorrectGuesses = new List<char>(); int chans = 2; bool van = false; int upptäktabokstav = 0; string input; char gissa; while (!van && chans > 0) { Console.Write("Gissa ett ord: "); input = Console.ReadLine().ToUpper(); gissa = input[0]; if (correctGuesses.Contains(gissa)) { Console.WriteLine("Du har redan försökt '{0}', och det var rätt!", gissa); continue; } else if (incorrectGuesses.Contains(gissa)) { Console.WriteLine("Du har redan försökt '{0}', och det var fel!", gissa); continue; } if (ordAttGissaUppercase.Contains(gissa)) { correctGuesses.Add(gissa); for (int i = 0; i < ordAttGissa.Length; i++) { if (ordAttGissaUppercase[i] == gissa) { displayToPlayer[i] = ordAttGissa[i]; upptäktabokstav++; } } if (upptäktabokstav == ordAttGissa.Length) van = true; } else { incorrectGuesses.Add(gissa); Console.WriteLine("Nope, det är ingent '{0}' i det!", gissa); Console.WriteLine("Det är ett försök kvar"); chans--; } Console.WriteLine(displayToPlayer.ToString()); } if (van) Console.WriteLine("Du van!"); else Console.WriteLine("Vad är det här för spel! Gissat ord var '{0}'", ordAttGissa); Avsluta: Console.Write("\nTryck på ENTER för att avsluta..."); Console.ReadLine(); } } }

Dold text
Redigerat in [code]-taggar
Permalänk
Medlem

Jag byggde en för inte alltför länge sen, ska se om jag har source när jag kommer hem ikväll
Det mesta ser iaf ut att vara användbart.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem
Skrivet av Donald-IT:

Hej allihopa!
Jag behöver er hjälp med spelet HangMan. Det är en projekt som jag måste lämna in så fort jag kan.

programmet är nästan färdig och det som jag behöver hjälp med är:
Lägga till ord
Lista alla ord

Jag är väldigt tacksam för er hjälp!

Indenterad och CODE-ad kod

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication6 { class Projektarbete { static void Main(string[] args) { Random random = new Random((int) DateTime.Now.Ticks); string[] gissat = { "projektarbete" }; Console.WriteLine(" ************************ "); Console.WriteLine(" * HÄNGA GUMMA! * "); Console.WriteLine(" ************************ "); Console.WriteLine("\n1 Lägg till ord "); Console.WriteLine("\n2 Lista alla ord "); Console.WriteLine("\n3 Spela "); Console.WriteLine("\n4 Avsluta "); Start: Console.WriteLine("\n Välj 1-4:"); String välja = Convert.ToString(Console.ReadLine()); Console.WriteLine("\n\n"); // Nu har vi lagt menyLista switch (välja) { case "1": Console.WriteLine(" Lägg till ord "); break; case "2": Console.WriteLine(" Lista alla ord "); Console.WriteLine(); string word = Convert.ToString(Console.ReadLine()); List < string > lista = new List < string > (); lista.Add(""); //foreach (string i in lista) break; case "3": Console.WriteLine(" Spela "); { Console.WriteLine(" Du får två försök! "); } break; case "4": Console.WriteLine(" Avsluta "); goto Avsluta; default: goto Start; } string ordAttGissa = gissat[random.Next(0, gissat.Length)]; string ordAttGissaUppercase = ordAttGissa.ToUpper(); StringBuilder displayToPlayer = new StringBuilder(ordAttGissa.Length); for (int i = 0; i < ordAttGissa.Length; i++) displayToPlayer.Append('_'); List < char > correctGuesses = new List < char > (); List < char > incorrectGuesses = new List < char > (); int chans = 2; bool van = false; int upptäktabokstav = 0; string input; char gissa; while (!van && chans > 0) { Console.Write("Gissa ett ord: "); input = Console.ReadLine().ToUpper(); gissa = input[0]; if (correctGuesses.Contains(gissa)) { Console.WriteLine("Du har redan försökt '{0}', och det var rätt!", gissa); continue; } else if (incorrectGuesses.Contains(gissa)) { Console.WriteLine("Du har redan försökt '{0}', och det var fel!", gissa); continue; } if (ordAttGissaUppercase.Contains(gissa)) { correctGuesses.Add(gissa); for (int i = 0; i < ordAttGissa.Length; i++) { if (ordAttGissaUppercase[i] == gissa) { displayToPlayer[i] = ordAttGissa[i]; upptäktabokstav++; } } if (upptäktabokstav == ordAttGissa.Length) van = true; } else { incorrectGuesses.Add(gissa); Console.WriteLine("Nope, det är ingent '{0}' i det!", gissa); Console.WriteLine("Det är ett försök kvar"); chans--; } Console.WriteLine(displayToPlayer.ToString()); } if (van) Console.WriteLine("Du van!"); else Console.WriteLine("Vad är det här för spel! Gissat ord var '{0}'", ordAttGissa); Avsluta: Console.Write("\nTryck på ENTER för att avsluta..."); Console.ReadLine(); } } }

Dold text

Har ni börjat använda metoder i kursen? Jag vet inte vad kraven är för uppgiften men klassen skriker efter metoder. Har du någon specifikation på vad uppgiften ska klara?

För att lägga till ett ord i listan
Du verkar redan ha en array av ord som spelet kan utföra. I dagsläget har du hårdkodat in ordet "projektarbete". Problemet med att använda en array är att den har en fast storlek. Det är hög tid att ändra variabeln "gissat" till en List av strängar.
För att faktiskt genomföra logiken som hämtar in tecken från konsolen och stoppar in det i listan så skriver du det i case "1" i switch-satsen.
Du har redan gjort koden tidigare för att göra detta förutom att du nu ska stoppa in resultatet i en array/lista av något slag.
Där spelaren får gissa ett ord så hämtar du in en sträng från konsolen och då man tydligen endast får gissa ett tecken i taget så har du gjort så att endast första tecknet i denna sträng används. Denna rad kan du återanvända. Om du sedan har gissat som en lista av strängar så kan du lägga till det ordet genom att använda dig av Add()-metoden på List.

För att skriva ut alla ord
Gör en foreach-loop (eller valfri variant) på gissat-variabeln. För varje element i listan så skriver du ut i konsolen.

Vidare till kritik av din kod
Att använda "goto" i fallet du gör är helt meningslöst (det ska praktiskt taget aldrig användas) då du kan använda en while-loop istället.
Du borde inte använda svenska namn på variabler. Om du känner att du måste så ska du inte blanda svenska och engelska.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

Hej och tack för ni kommenterade min inlägg.
kravet till programmet är

Jag ska fundera på den Leedow.

Jag uppskattar för mer hjälp om programmet..
Tack så mycket!

Permalänk
Skrivet av Donald-IT:

file:///C:/Users/Sarah%20and%20Zack/Downloads/Praktiskt-prov.pdf%20(5).pdf

Kan inte öppna länken

Permalänk
Permalänk

@Leedow: kan du vara mer tydlig på något exempel ?

Permalänk

HangMan C#

Hej allihopa,
jag kom fram med den och vill ha riktig hjälp innan inlämningen..
det jag vill ha är att kunna lista alla ord.. tack

er hjälp är uppskattad!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace projectarbete { class HangMan { static void Main(string[] args) { Console.WriteLine(" ************************ "); Console.WriteLine(" * HÄNGA GUMMA! * "); Console.WriteLine(" ************************ "); Console.WriteLine("\n1 Lägg till ord "); Console.WriteLine("\n2 Lista alla ord "); Console.WriteLine("\n3 Spela "); Console.WriteLine("\n4 Avsluta "); Console.WriteLine(" Välj 1-4: "); string val = Console.ReadLine(); if (val == "1") { string secreteWord = "träd"; //have a dash array equal to the number of the letters of the secret word char[] a = new char[secreteWord.Length]; // a= secretWord for (int i = 0; i < a.Length; i++) { a[i] = '_'; } // Tell the user the number of letters through the dashes for (int i = 0; i < a.Length; i++) { Console.Write(a[i] + " "); } // ask the user to guess Console.WriteLine(); int count = 0; do { Console.WriteLine("Enter your guess letter"); char input = Console.ReadLine().ToCharArray()[0]; for (int i = 0; i < secreteWord.Length; i++) { //if the user guessed right, replace the correct dash and display to the user if (secreteWord[i] == input) { count++; //update the count to check when to exit a[i] = input; //here if the user guess correct, we replace the dash with the input //now we display the dash array after it is modified for (int j = 0; j < a.Length; j++) { Console.Write(a[j] + " "); } } } Console.WriteLine("\t\t"); } while (count < a.Length); Console.WriteLine("You guessed it right"); Console.ReadLine(); } else if (val == "2") { List<string> lista = new List<string>(3); lista.Add ("lägenhet"); lista.Add("hus"); lista.Add("vila"); for(int i = 0; i < lista.Count; i++) { lista[i] = "_"; } for(int i = 0; i < lista.Count; i++) { Console.WriteLine(lista[i] + " "); } Console.WriteLine(); int count = 0; do{ Console.WriteLine("Enter your guess word"); string input = Console.ReadLine().ToString(); for(int i = 0; i < lista.Count; i++) if(lista[i] == input) { count++; lista[i] = input; for(int j = 0; j < lista.Count; i++) { Console.WriteLine(lista[j] + " "); } }Console.WriteLine(); }while(count < lista.Count); Console.WriteLine("You guessed it right!"); Console.ReadLine(); } } } }

Dold text
Permalänk
Medlem
Skrivet av Donald-IT:

Hej allihopa,
jag kom fram med den och vill ha riktig hjälp innan inlämningen..
det jag vill ha är att kunna lista alla ord.. tack

er hjälp är uppskattad!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace projectarbete { class HangMan { static void Main(string[] args) { Console.WriteLine(" ************************ "); Console.WriteLine(" * HÄNGA GUMMA! * "); Console.WriteLine(" ************************ "); Console.WriteLine("\n1 Lägg till ord "); Console.WriteLine("\n2 Lista alla ord "); Console.WriteLine("\n3 Spela "); Console.WriteLine("\n4 Avsluta "); Console.WriteLine(" Välj 1-4: "); string val = Console.ReadLine(); if (val == "1") { string secreteWord = "träd"; //have a dash array equal to the number of the letters of the secret word char[] a = new char[secreteWord.Length]; // a= secretWord for (int i = 0; i < a.Length; i++) { a[i] = '_'; } // Tell the user the number of letters through the dashes for (int i = 0; i < a.Length; i++) { Console.Write(a[i] + " "); } // ask the user to guess Console.WriteLine(); int count = 0; do { Console.WriteLine("Enter your guess letter"); char input = Console.ReadLine().ToCharArray()[0]; for (int i = 0; i < secreteWord.Length; i++) { //if the user guessed right, replace the correct dash and display to the user if (secreteWord[i] == input) { count++; //update the count to check when to exit a[i] = input; //here if the user guess correct, we replace the dash with the input //now we display the dash array after it is modified for (int j = 0; j < a.Length; j++) { Console.Write(a[j] + " "); } } } Console.WriteLine("\t\t"); } while (count < a.Length); Console.WriteLine("You guessed it right"); Console.ReadLine(); } else if (val == "2") { List < string > lista = new List < string > (3); lista.Add("lägenhet"); lista.Add("hus"); lista.Add("vila"); for (int i = 0; i < lista.Count; i++) { lista[i] = "_"; } for (int i = 0; i < lista.Count; i++) { Console.WriteLine(lista[i] + " "); } Console.WriteLine(); int count = 0; do { Console.WriteLine("Enter your guess word"); string input = Console.ReadLine().ToString(); for (int i = 0; i < lista.Count; i++) if (lista[i] == input) { count++; lista[i] = input; for (int j = 0; j < lista.Count; i++) { Console.WriteLine(lista[j] + " "); } } Console.WriteLine(); } while (count < lista.Count); Console.WriteLine("You guessed it right!"); Console.ReadLine(); } } } }

Dold text

Helt plötsligt har du helt annan kod.
Den koden du hade innan var mer korrekt rent uppgiftsmässigt än denna.

Enligt kraven på uppgiften så är det inte ens halvklart. Att bara lista ord räcker väl inte?
För att lista ord så behöver du ju även en lista av ord?
I din kod för case "2" så gör du magiska saker med listan. Du fyller den med tre element, sen ersätter du alla element med "_" istället och till sist skriver du ut dessa. Flytta upp "lista" så att du definierar den som en klassvariabel alternativt en lokal variabel exempelvis högst upp i Main-metoden. På så sätt så kommer "lista" att behålla sina värden oavsett hur många hopp som koden gör. I dagsläget så lever din lista endast i scopet av case "2".

Ta bort koden som ersätter elementen i listan med "_" så är du en bra bit på vägen och ser nog vad som kanske måste ändras för att mer ska fungera.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Känns som ett uppenbart fall av "Copy paste" från någon annans kod. Nu är alla kommentarer helt plötsligt på engelska.

Visa signatur

"I know not with what weapons World War III will be fought, but World War IV will be fought with sticks and stones."
Albert Einstein (1879 - 1955)

Permalänk

@Leedow: Hej,

tack för ditt kommentar. Nu pratar du säkert om första inlägg,,, jag provade allt men kom inte ens närmare...

Permalänk
Medlem

Jag har förstått hela ditt projekt utom en grej, vad är meningen med 1 och 2?
Är det ord man ska gissa på eller ord man kan välja istället för tecken?

Som t.ex. t--t, jag gissar ordet test.
Eller är det mer att man ska fortsätta gissa på dem orden i den listan när man gissat rätt på ett av dem?

Insåg att ladda upp källkoden för detta projektet vore dumt, du skulle inte lära dig något.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk

@freddyfresh: kära vän,
juste jag glömde förklara det, användaren ska kunna skriva in ett helt ord och detta ska sedan jämföras med de ord som finns i programmets lista,, det om man väljer "2".
Annars ska man gissa på bokstäver om man väljer "1".

Permalänk
Medlem
Skrivet av Donald-IT:

@freddyfresh: kära vän,
juste jag glömde förklara det, användaren ska kunna skriva in ett helt ord och detta ska sedan jämföras med de ord som finns i programmets lista,, det om man väljer "2".
Annars ska man gissa på bokstäver om man väljer "1".

Nej, där beskrev du kanske fel.
Enligt programmet ska du gissa bokstäver om du väljer 3 (spela traditionellt), inte 1 som är att lägga till ord.
Kan du antingen beskriva lite mer utförligt eller kontrollera exakt vad läraren har för avsikt med dem funktionerna i spelet.

Eftersom ingen av 1 eller 2 har anrop möjliga efter man valt 3 borde därför inte dem ha någon större inverkan i spelet i sig, mer än om man måste gissa innan spelet börjar, vilket inte låter troligt. Programmets lista, som du nämner, är detta en lista med ord som valts via programmeringen eller som någon ska ha valt vid något tillfälle som inte är beskrivet i din beskrivning? För ärligt talat, i den beskrivs aldrig 1 och 2.

Jag har själv lyckats göra allt som din uppgift beskriver så jag ska kunna svara eller se vad som kan va fel i eventuell kod du skickar, men det är svårt att hjälpa dig med fel eller saknad information.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk

@freddyfresh: hej igen,
Ja, allt du sa var rätt. själv blev förvånad efter din fråga igår och därför läste jag om texten och vad det var för krav, eftersom var jag mycket stressad att jag inte skulle hinna med programmet missade jag mycket.
programmet är så här:
val 1- ska användaren lägga till ord och sen ska ordet sorteras i med l LISTAN.
val 2- kan användaren se alla listade ord även ordet som var inmatad.
val 3- användaren kan ange hur många gissningsfel vill ha, och där efter börjar spelet med att gissa bokstäver...

jag fick hjälp med detta och vill ha mer hjälp vänner så att komplettera programmet..
Tack för er hjälp!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hängaGumman { static class program { static Random r; static List<string> words; static program() { words = new List<string>(); r = new Random(); } static void Main(string[] args) { VissaMeny(""); } private static void VissaMeny() { VissaMeny(""); } private static void VissaMeny(string meddelande) { Console.Clear(); Console.WriteLine(" ************************ "); Console.WriteLine(" * HÄNGA GUMMA! * "); Console.WriteLine(" ************************ "); Console.WriteLine("\n1 Lägg till ord "); // Add word Console.WriteLine("\n2 Lista alla ord "); // Add words list Console.WriteLine("\n3 Spela "); // Plag Game Console.WriteLine("\n4 Avsluta "); if(!String.IsNullOrEmpty(meddelande)) { Console.WriteLine(meddelande); } Console.WriteLine("Vlj 1-4:"); var välj= Console.ReadKey(); switch(välj.Key) { case ConsoleKey.D1: LäggTillOrd(); break; case ConsoleKey.D2: ListaAllaOrd(); break; case ConsoleKey.D3: Spela(); break; default: Console.WriteLine("Hej Då"); break; } } private static void Spela() { if(words.Count == 0) VissaMeny("ingea ord finns i listan"); else { Console.WriteLine("Ange antal felgissning:"); int antal = Convert.ToInt32(Console.ReadLine()); bool vann = false; var försök = 0; char gissa; var gissatBokstäver = 0; do{ if(antal >= 0) for(int i =0; i < antal; i--) Console.WriteLine("försök igen!"); var ordAttGissa = words[r.Next(0, words.Count)].ToUpper(); var al = new StringBuilder(ordAttGissa.Length); al.Append("_"); var rättGiss = new List<char>(); var ejRättGiss = new List<char>(); if(!vann || försök == antal) Console.WriteLine("Gissa ett ord"); gissa = Console.ReadKey().KeyChar; if(rättGiss.Contains(gissa)) { Console.WriteLine("Du har redan försökt {} och det var rätt", gissa); continue; } if(ejRättGiss.Contains(gissa)) { Console.WriteLine("Du har har försökt {} och det var fel", gissa); continue; } if(ordAttGissa.Contains(Char.ToUpper(gissa))) { rättGiss.Add(gissa); var indx = ordAttGissa.IndexOf(Char.ToUpper(gissa)); al[indx] = gissa; gissatBokstäver++; if (gissatBokstäver == ordAttGissa.Length) { vann = true; break; } } else { ejRättGiss.Add(gissa); försök--; } Console.WriteLine(al.ToString()); if(vann) { Console.WriteLine("Du vann!"); } else { Console.WriteLine("Du vann inte!"); } }while (!vann || försök == antal); } } private static void ListaAllaOrd() { Console.WriteLine("Alla ord i listan"); { foreach(var prime in words) { Console.WriteLine(prime); VissaMeny(""); } } } static void LäggTillOrd() { Console.WriteLine("Lägg till ord"); var ord = Console.ReadLine(); words.Add(ord); VissaMeny(""); } } }

Dold text
Redigerat in [code]-taggar
Permalänk

@freddyfresh: hej igen,
Ja, allt du sa var rätt. själv blev förvånad efter din fråga igår och därför läste jag om texten och vad det var för krav, eftersom var jag mycket stressad att jag inte skulle hinna med programmet missade jag mycket.
programmet är så här:
val 1- ska användaren lägga till ord och sen ska ordet sorteras i med l LISTAN.
val 2- kan användaren se alla listade ord även ordet som var inmatad.
val 3- användaren kan ange hur många gissningsfel vill ha, och där efter börjar spelet med att gissa bokstäver...

jag fick hjälp med detta och vill ha mer hjälp vänner så att komplettera programmet..
Tack för er hjälp!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hängaGumman { static class program { static Random r; static List<string> words; static program() { words = new List<string>(); r = new Random(); } static void Main(string[] args) { VissaMeny(""); } private static void VissaMeny() { VissaMeny(""); } private static void VissaMeny(string meddelande) { Console.Clear(); Console.WriteLine(" ************************ "); Console.WriteLine(" * HÄNGA GUMMA! * "); Console.WriteLine(" ************************ "); Console.WriteLine("\n1 Lägg till ord "); Console.WriteLine("\n2 Lista alla ord "); Console.WriteLine("\n3 Spela "); Console.WriteLine("\n4 Avsluta "); if(!String.IsNullOrEmpty(meddelande)) { Console.WriteLine(meddelande); } Console.WriteLine("Vlj 1-4:"); var välj= Console.ReadKey(); switch(välj.Key) { case ConsoleKey.D1: LäggTillOrd(); break; case ConsoleKey.D2: ListaAllaOrd(); break; case ConsoleKey.D3: Spela(); break; default: Console.WriteLine("Hej Då"); break; } } private static void Spela() { if(words.Count == 0) VissaMeny("ingea ord finns i listan"); else { Console.WriteLine("Ange antal felgissning:"); int antal = Convert.ToInt32(Console.ReadLine()); bool vann = false; var försök = 0; char gissa; var gissatBokstäver = 0; do{ if(antal >= 0) for(int i =0; i < antal; i--) Console.WriteLine("försök igen!"); var ordAttGissa = words[r.Next(0, words.Count)].ToUpper(); var al = new StringBuilder(ordAttGissa.Length); al.Append("_"); var rättGiss = new List<char>(); var ejRättGiss = new List<char>(); if(!vann || försök == antal) Console.WriteLine("Gissa ett ord"); gissa = Console.ReadKey().KeyChar; if(rättGiss.Contains(gissa)) { Console.WriteLine("Du har redan försökt {} och det var rätt", gissa); continue; } if(ejRättGiss.Contains(gissa)) { Console.WriteLine("Du har har försökt {} och det var fel", gissa); continue; } if(ordAttGissa.Contains(Char.ToUpper(gissa))) { rättGiss.Add(gissa); var indx = ordAttGissa.IndexOf(Char.ToUpper(gissa)); al[indx] = gissa; gissatBokstäver++; if (gissatBokstäver == ordAttGissa.Length) { vann = true; break; } } else { ejRättGiss.Add(gissa); försök--; } Console.WriteLine(al.ToString()); if(vann) { Console.WriteLine("Du vann!"); } else { Console.WriteLine("Du vann inte!"); } }while (!vann || försök == antal); } } private static void ListaAllaOrd() { Console.WriteLine("\nAlla ord i listan"); { List<string> words = new List<string>(); words.Add("hus"); words.Add("lägenhet"); words.Add("blommor"); words.Add("träd"); words.Add("gård"); foreach(var prime in words) { Console.WriteLine(prime); } } } static void LäggTillOrd() { Console.WriteLine("Lägg till ord"); var ord = Console.ReadLine(); words.Add(ord); VissaMeny(""); } } }

Redigerat in [code]-taggar
Permalänk
Medlem
Skrivet av Donald-IT:

@freddyfresh: hej igen,
Ja, allt du sa var rätt. själv blev förvånad efter din fråga igår och därför läste jag om texten och vad det var för krav, eftersom var jag mycket stressad att jag inte skulle hinna med programmet missade jag mycket.
programmet är så här:
val 1- ska användaren lägga till ord och sen ska ordet sorteras i med l LISTAN.
val 2- kan användaren se alla listade ord även ordet som var inmatad.
val 3- användaren kan ange hur många gissningsfel vill ha, och där efter börjar spelet med att gissa bokstäver...

jag fick hjälp med detta och vill ha mer hjälp vänner så att komplettera programmet..
Tack för er hjälp!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace hängaGumman
{
static class program
{
static Random r;
static List<string> words;

static program()
{
words = new List<string>();
r = new Random();
}
static void Main(string[] args)
{
VissaMeny("");
}
private static void VissaMeny()
{
VissaMeny("");
}
private static void VissaMeny(string meddelande)
{
Console.Clear();
Console.WriteLine(" ************************ ");
Console.WriteLine(" * HÄNGA GUMMA! * ");
Console.WriteLine(" ************************ ");

Console.WriteLine("\n1 Lägg till ord ");
Console.WriteLine("\n2 Lista alla ord ");
Console.WriteLine("\n3 Spela ");
Console.WriteLine("\n4 Avsluta ");

if(!String.IsNullOrEmpty(meddelande))
{
Console.WriteLine(meddelande);
}
Console.WriteLine("Vlj 1-4:");
var välj= Console.ReadKey();
switch(välj.Key)
{
case ConsoleKey.D1:
LäggTillOrd();
break;
case ConsoleKey.D2:
ListaAllaOrd();
break;
case ConsoleKey.D3:
Spela();
break;
default:
Console.WriteLine("Hej Då");
break;
}
}
private static void Spela()
{
if(words.Count == 0)
VissaMeny("ingea ord finns i listan");
else
{
Console.WriteLine("Ange antal felgissning:");
int antal = Convert.ToInt32(Console.ReadLine());
bool vann = false;
var försök = 0;
char gissa;
var gissatBokstäver = 0;
do{
if(antal >= 0)
for(int i =0; i < antal; i--)
Console.WriteLine("försök igen!");

var ordAttGissa = words[r.Next(0, words.Count)].ToUpper();
var al = new StringBuilder(ordAttGissa.Length);
al.Append("_");
var rättGiss = new List<char>();
var ejRättGiss = new List<char>();

if(!vann || försök == antal)
Console.WriteLine("Gissa ett ord");
gissa = Console.ReadKey().KeyChar;
if(rättGiss.Contains(gissa))
{
Console.WriteLine("Du har redan försökt {} och det var rätt", gissa);
continue;
}
if(ejRättGiss.Contains(gissa))
{
Console.WriteLine("Du har har försökt {} och det var fel", gissa);
continue;
}
if(ordAttGissa.Contains(Char.ToUpper(gissa)))
{
rättGiss.Add(gissa);
var indx = ordAttGissa.IndexOf(Char.ToUpper(gissa));
al[indx] = gissa;
gissatBokstäver++;
if (gissatBokstäver == ordAttGissa.Length)
{
vann = true;
break;
}
}
else
{
ejRättGiss.Add(gissa);
försök--;
}
Console.WriteLine(al.ToString());

if(vann)
{
Console.WriteLine("Du vann!");
}
else
{
Console.WriteLine("Du vann inte!");
}
}while (!vann || försök == antal);
}
}
private static void ListaAllaOrd()
{
Console.WriteLine("\nAlla ord i listan");
{
List<string> words = new List<string>();
words.Add("hus");
words.Add("lägenhet");
words.Add("blommor");
words.Add("träd");
words.Add("gård");
foreach(var prime in words)
{
Console.WriteLine(prime);
}
}
}
static void LäggTillOrd()
{
Console.WriteLine("Lägg till ord");
var ord = Console.ReadLine();
words.Add(ord);
VissaMeny("");
}
}
}

Dold text

Okej, jag ser lite problem med koden.

  • Alternativ 1
    du kan lägga till tomma ord (inget innehåll)

  • Alternativ 2
    du visar alla ord men programmet stänger av sig här, kapsulering i en loop verkar saknas

  • Alternativ 3
    spelet går inte spela, du spammas av försök igen.

Det enda som verkar fungera korrekt i nuläget är att stänga av spelet, val 4.

Vi börjar därför med att bryta ner felen, en och en.
Första funktionen i spelet, lägga till ord, här nedan är all din kod:

Console.WriteLine("Lägg till ord"); var ord = Console.ReadLine(); words.Add(ord); VissaMeny("");

Dold text

Vad jag ser här är att det saknas någon form av felhantering, tomma ord exempelvis. Vi kommer inte gå så djupt att förbjuda siffror, men vi kan iaf kontrollera om ord är längre än noll.
Så jag föreslår iaf den här modifieringen:

Console.Write("\n\nLägg till ord: "); var ord = Console.ReadLine(); if (ord.Length > 0) { words.Add(ord); VissaMeny(string.Format("Ordet \"{0}\" blev tillagt", ord)); } else { VissaMeny(string.Format("Ordet \"{0}\" blev inte tillagt, för kort.", ord)); }

Dold text

Inget märkvärdigt, bara felkontroller.

Om vi går vidare till nästa steg, vi vill kunna se värdena ur listan och vi vill även kunna fortsätta använda programmet utan att det stängs av.

Console.WriteLine("\nAlla ord i listan"); { List<string> words = new List<string>(); words.Add("hus"); words.Add("lägenhet"); words.Add("blommor"); words.Add("träd"); words.Add("gård"); foreach (var prime in words) { Console.WriteLine(prime); } }

Dold text

¨
Problemet jag först och främst ser här, varför använder vi fördefinierade ord? Är inte poängen att användaren ska ange dem? Och varför, skapar vi en ny lista, vilket tar bort allt vi lagt till redan i funktion 1? För demo-syfte fattar jag självklart detta men i ett faktiskt spel är detta väldigt redundant.

Console.WriteLine("\nAlla ord i listan"); string resultFromList = "Innehåll i lista:\n"; foreach (var prime in words) { resultFromList += prime + "\n"; } VissaMeny(resultFromList);

Dold text

Vi kan återanvända din kod mycket här, vi lagrar innehållet i forloopen till en sträng, detta kan vi sedan skicka som argument i din VissaMeny-funktion. Det gör att vi får se menyn igen, men vi får även se resultaten från listan. Med denna kod fortsätter även programmet fungera. Men ett problem, som du säkert ser är att ingen varning kommer ske om listan är tom, det är för att resultFromList redan innehåller text, vilket inte kommer returnera ett fel, för vi kan alltid returnera "vägledningen" av vad vi ser. Men inget innehåll är ett krav.

Men nu till ditt slutgiltiga problem. Även om man väljer nummer "1", lägger till ordet "test", listar alla ord och det ordet dyker upp, så får man oavsett vad i "3" spammat "försök igen". Det känns därför som om du har något som matar fel information i en loop.

Låt oss fördjupa oss i din kod.

if (words.Count == 0) VissaMeny("Inga ord finns i listan"); else { Console.WriteLine("Ange antal felgissning:"); int antal = Convert.ToInt32(Console.ReadLine()); bool vann = false; var försök = 0; char gissa; var gissatBokstäver = 0; do { if (antal >= 0) for (int i = 0; i < antal; i--) Console.WriteLine("försök igen!"); var ordAttGissa = words[r.Next(0, words.Count)].ToUpper(); var al = new StringBuilder(ordAttGissa.Length); al.Append("_"); var rättGiss = new List<char>(); var ejRättGiss = new List<char>(); if (!vann || försök == antal) Console.WriteLine("Gissa ett ord"); gissa = Console.ReadKey().KeyChar; if (rättGiss.Contains(gissa)) { Console.WriteLine("Du har redan försökt {0} och det var rätt", gissa); continue; } if (ejRättGiss.Contains(gissa)) { Console.WriteLine("Du har har försökt {0} och det var fel", gissa); continue; } if (ordAttGissa.Contains(Char.ToUpper(gissa))) { rättGiss.Add(gissa); var indx = ordAttGissa.IndexOf(Char.ToUpper(gissa)); al[indx] = gissa; gissatBokstäver++; if (gissatBokstäver == ordAttGissa.Length) { vann = true; break; } } else { ejRättGiss.Add(gissa); försök--; } Console.WriteLine(al.ToString()); if (vann) { Console.WriteLine("Du vann!"); } else { Console.WriteLine("Du vann inte!"); } } while (!vann || försök == antal); }

Dold text

Här förstår jag inte riktigt varför du valt att använda var, för vi vet redan vilket datatyp vi ska använda. Jag själv, vet inte varför, undviker var så mycket jag kan. Tycker själv det ser lite slarvigt ut och onödigt i enkla situationer.

if (antal >= 0) for (int i = 0; i < antal; i--) Console.WriteLine("försök igen!");

Dold text

Den här koden förstör för dig, jag tar därför bort den för den verkar inte tjäna mycket till syfte.

Sen ändrade jag även "Gissa ett ord" för det var vilseledande då man bara får gissa en bokstav. Det ändrade jag till "Gissa en bokstav".
Sen bytte jag ut en mängd andra saker som alla var till sina typer.

var ordAttGissa = words[r.Next(0, words.Count)].ToUpper(); var al = new StringBuilder(ordAttGissa.Length); al.Append("-"); Console.WriteLine(al);

Dold text

Det här skriver ut ett (1) bindestreck. Inte vad som jag antar är tanken att vara hela ordet som ersätts med bindestreck i sina tecken. Ordet är däremot korrekt valt. Ordet blir "TEST". Append lägger till, lite som al += "-", det är ungefär samma sak.

Du har inte heller följt den bild du hade fått om hur programmets struktur skulle vara.
Jag har omstrukturerat lite, det var lite svårt att jobba med den så jag gjorde den här istället:

if (words.Count == 0) VissaMeny("Inga ord finns i listan"); else { //Vi startar spelet med standardvärden och saker som ska presenteras oavsett Console.WriteLine("Ange antal felgissning:"); antal = Convert.ToInt32(Console.ReadLine()); //sätt dessa värden till lägsta eller värden som bör va där vann = false; försök = 0; var gissatBokstäver = 0; maskedWord = ""; originalWord = words[r.Next(0, words.Count)]; List<char> rättGiss = new List<char>(); List<char> ejRättGiss = new List<char>(); //ge det maskerade ordet sina bindestreck för att hålla de man gissat rätt for (int i = 0; i < originalWord.Length; i++) { maskedWord += "-"; } do { //skriv ut det ord man ska gissa på Console.WriteLine("\n" + maskedWord); //när vi gjort det, skriv ut att välja en bokstav Console.Write("Gissa en bokstav: "); //läs in den gissa = Console.ReadKey().KeyChar; //kolla här om vi redan har läst in den, isåfall kör continue för att starta om loopen if (rättGiss.Contains(gissa)) { Console.WriteLine("Du har redan försökt {0} och det var rätt", gissa); continue; } if (ejRättGiss.Contains(gissa)) { Console.WriteLine("Du har försökt {0} och det var fel", gissa); continue; } //om det ord vi ska gissa på innehåller bokstaven, gå vidare if (originalWord.Contains(gissa)) { //lägg till i statistiken rättGiss.Add(gissa); gissatBokstäver++; //loopa igenom ordet för att hitta rätt ställen att ersätta på for (int i = 0; i < originalWord.Length; i++) { //vi använder den orörda "mallen" för att identifiera vart if (originalWord[i] == gissa) { //läs in det maskerade ordet så vi kan ersätta bokstaven StringBuilder sb = new StringBuilder(maskedWord); sb[i] = gissa; maskedWord = sb.ToString(); } } } else { ejRättGiss.Add(gissa); försök++; } if (maskedWord.ToString() == originalWord.ToString()) { vann = true; } //här satt ett av dina fel, || skulle vara && eftersom vi vill kolla att båda påståenden är falska innan vi går vidare } while (!vann && försök < antal); } //utanför loopen, presentera meddelandet att vi vunnit eller förlorat if (vann) { Console.WriteLine("\n\nDu vann, ordet var {0}", originalWord); Console.ReadKey(); } else { Console.WriteLine("\n\nDu förlorade, ordet var {0}", originalWord); Console.ReadKey(); }

Dold text
Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem
Skrivet av Donald-IT:

Hjälpte detta?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk

@freddyfresh: Hej igen, det enda jag kan göra just nu är att säga tack så hemskt mycket. Du hjälpte mig mycket. tack vännen.
programmet fungerade som det ska..
förresten du använde flera inbyggda metoder och mycket Static metoder i programmet. Ditt sätt att skriva programmet var mycket intressant och mycket bättre än mitt . kan du förklare kort varför använde du de?

Permalänk
Medlem

Grejen, störst och först, är att jag hade inget behov av att instansiera objekt eller metoder här, för behovet fanns inte i storleken av projektet. Utifrån den tolkning jag gjort, uppfylldes behoven av inbyggda hjälpmedel snarare än att återuppfinna hjulet. Därför kändes inte heller att det fanns behov för att komplicera ett simpelt motiv, det ska va hänga gubbe, inte mer, inte mindre. Därför också vi inte körde med klasser, trots att en objektorienterad variant, vilket säkert hade varit en bra idé om man vill bygga vidare, hade gjort läsbarhet enklare. Där exempelstrukturen i pseudo för gissningen kunde varit något i stil med:

class Guess{ public Guess (string originalword){ etc } public bool Eval(char gissning){ hitta i originalet } public string Replace (bool utvärdering) { if (Eval) { /../ } } public void GenerateMaskedString(){ etc } public void Add(string word) { lägger till i listan } ... }

Som senare kunnat bli mer:

Guess G = new Guess("Test"); if(!G.Eval('Q')) { Console.WriteLine("FEL!"); }

TL;DR
För att inte återuppfinna funktion som redan finns, valde jag att göra det enkelt med det som redan finns i C#. Med uppgiften som utgångspunkt.

Vad hade kunnat gjorts bättre?
Dela upp koden i klasser för att göra projektet mer skalbart, lättläst och objektorienterat. Däremot kändes inte detta som en grundsten för att projektet skulle bli klart.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
I mitt fall, om jag hade byggt detta från grunden hade jag skapat objekt av allt, det är inte bara enklare, det ger bättre struktur, mer utrymme för anteckningar. Det blir lättare för nästa person, lärare eller annan att rätta, hjälpa, vidareutveckla etc. Sen blir programmet mer "modulärt", lättare att ta bort och redigera.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40