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