Hjälp med C# "ett hemligt tal"

Permalänk
Medlem

Hjälp med C# "ett hemligt tal"

Jag har en uppgift i skolan och har kört fast helt och hållet.
Jag ska låta användaren gissa ett tal mellan 1 till 100 som programmet slumpat fram och om användaren gissar för lågt ska det skrivas ut att det var en för låg gissning och så vidare.
Problemet jag har är att jag inte vet hur jag skall återkalla "gissningen" igen när det gissats fel, såhär långt har jag kommit:

namespace DetHemligaTaletDel1M1
{
class Program
{
static void Main(string[] args)
{
string str;
int number;

Random randomerare = new Random();
int slump_tal = randomerare.Next(1, 100); //Slumpar ett tal mellan 1 och 100

Console.WriteLine("Gissa på ett tal mellan 1 till 100 och ange det i siffror : ");
str = Console.ReadLine();
number = int.Parse(str);

while (number != slump_tal)
{
if (number < slump_tal)
{
Console.WriteLine("Du gissade för lågt!");
Console.WriteLine("Gissa igen : ");

}
else if (number > slump_tal)
{
Console.WriteLine("Du gissade för högt");
}

}

Permalänk
Medlem
Skrivet av hexakon:

Jag har en uppgift i skolan och har kört fast helt och hållet.
Jag ska låta användaren gissa ett tal mellan 1 till 100 som programmet slumpat fram och om användaren gissar för lågt ska det skrivas ut att det var en för låg gissning och så vidare.
Problemet jag har är att jag inte vet hur jag skall återkalla "gissningen" igen när det gissats fel, såhär långt har jag kommit:

Kika vart du har din while loop nu och vart du matar in talet från användaren.

Permalänk
Medlem

Ska kodblocket där dem matar in talet ligga inom while loopen? Har total hjärnsläpp :s

Permalänk
Medlem
Skrivet av hexakon:

Ska kodblocket där dem matar in talet ligga inom while loopen? Har total hjärnsläpp :s

Om du vill fortsätta mata in tal så bör din readline ligga innanför loopen.

Vet inte hur kinkig din lärare är, skriver du något nu som inte är ett heltal så kommer programmet crasha.
Sen om du tar random 1,100 så kommer den slumpa ett tal mellan 1 och 100, alltså är 100 inte räknat med.
Vill du ha 1-100 inkl 100 får du köra 1,101 eller 1,100 + 1.

Permalänk
Medlem
Skrivet av hexakon:

Ska kodblocket där dem matar in talet ligga inom while loopen? Har total hjärnsläpp :s

Testa! Man ska ju kunna gissa igen om man gissat fel, annars så loopar loopen vidare på samma tal tills du stänger ner programmet

Visa signatur

🖥 → Ryzen 5 1600 • Asus GTX 1060 6GB • 16GB 3200Mhz
💻 → Macbook Pro Core i5 8GB 128GB SSD 13.3"

Permalänk
Medlem

Lyckades få det att fungera
Är det något ni tycker jag ska tänka på eller göra annorlunda?

Citat:

namespace DetHemligaTaletDel1M1
{
class Program
{
static void Main(string[] args)
{
string str;
int number;

Random randomerare = new Random();
int slump_tal = randomerare.Next(1, 100); //Slumpar ett tal mellan 1 och 100

Console.WriteLine("Gissa på ett tal mellan 1 till 100 och ange det i siffror : ");
str = Console.ReadLine();
number = int.Parse(str);

while (number != slump_tal)
{
if (number < slump_tal)
{
Console.WriteLine("Du gissade för lågt!");
Console.WriteLine("Gissa igen : ");
str = Console.ReadLine();
number = int.Parse(str);
}
else if (number > slump_tal)
{
Console.WriteLine("Du gissade för högt");
Console.WriteLine("Gissa igen : ");
str = Console.ReadLine();
number = int.Parse(str);
}

}
if (number == slump_tal)
{
Console.WriteLine("Grattis! Du gissade rätt!");
}
Console.ReadLine();

}

}
}

Permalänk
Medlem
Skrivet av Waup:

Testa! Man ska ju kunna gissa igen om man gissat fel, annars så loopar loopen vidare på samma tal tills du stänger ner programmet

hur skriver jag en sådan box?

Edit: Kom på hur man gjorde

Permalänk
Medlem
Skrivet av hexakon:

Lyckades få det att fungera
Är det något ni tycker jag ska tänka på eller göra annorlunda?

Nu duplicerar du koden i varje if/else-block, något du absolut ska undvika. Om något i programmet behöver ändras så kommer du behöva ändra samma sak på alla ställen. Det finns ingen anledning att skriva samma kod på flera ställen i detta fall, du kan lösa det genom att flytta upp din while-loop bara. Nu är detta ett litet program och det är ingen big deal, men vid större projekt är detta vanligaste sättet buggar uppstår

Jag hade skrivit koden på engelska, svenska variabler är usch.
Deklarera variablerna direkt där de ska används, finns ingen mening att deklarera de längst upp och sen instansiera de längre ner.
Undantaget är variabler som behöver existera utanför kodblock då värdet kan komma att ändras beroende på koden i blocken.
Då bör du deklarera variabeln precis utanför det kodblocket det berör.

Din Random som jag skrev ovan nu kommer endast ge tal 1 - 99 då Random min,max inte ger inkl max värdet. Vill du ha med 100 i slumptalen får du skriva 1,101 alternativt (1,100) + 1;

Istället för en while loop kan du använda en do-while.
do-while kommer garanterat att köra 1 gång, gissar användaren då rätt på första försöket kommer loopen inte behöva gå tillbaka till början för att kolla conditional statement för loopen.

Du har ingen fail-safe för inmatningen. Skriver användaren in något annat än heltal kommer programmet att krascha.

Permalänk
Medlem

@hexakon: Jag vet inte vad du menar med box, men testa ha med Console.ReadLine() i loopen

Visa signatur

🖥 → Ryzen 5 1600 • Asus GTX 1060 6GB • 16GB 3200Mhz
💻 → Macbook Pro Core i5 8GB 128GB SSD 13.3"

Permalänk
Skrivet av hexakon:

Lyckades få det att fungera
Är det något ni tycker jag ska tänka på eller göra annorlunda?

Du kan ju göra det lite mer lättläst kanske?

Console.WriteLine("Gissa igen : ");
str = Console.ReadLine();
number = int.Parse(str);

kommer att exekveras oavsett om gissningen var för hög eller för låg, så du kan ju flytta de raderna till efter jämförelsen. Programet blir då kortare och mer lättläst.

När du har kommit ur ur while loopen, som bara kan ske om number == slump_tal, så behöver du inte testa det igen.

Om man ska vara super duper petig så ska man också hålla sig till samma (människo)språk, du har ju variablerna number(engelska) och slump_tal(svenska). Man måste inte koda på engelska, men att byta språk mitt i kan göra det svårläst.

EDIT: fan, du han före:-P @zaibuf

Visa signatur

AMD Ryzen 5 3600 | Sapphire R9 280

Permalänk
Medlem

Ni är grymma! Vilken respons! <3
Tack

Permalänk
Medlem
Skrivet av hexakon:

Ni är grymma! Vilken respons! <3
Tack

Lugnt, säg till om det strular

Permalänk
Medlem
Skrivet av zaibuf:

Lugnt, säg till om det strular

Försöker mig på do while loopen, men får det inte att gå ihop.
Vad borde jag tänka på att jag ska ändra? Efter första gissningen nu så skriver den ut "Du gissade fel", hur får jag den att säga efter första gissningen att användaren gissade för lågt kontra högt?

namespace DetHemligaTaletDel1M1 { class Program { static void Main(string[] args) { Random randomerare = new Random(); int slump_tal = randomerare.Next(1, 100); //Slumpar ett tal mellan 1 och 100 Console.WriteLine("Hej och välkommen till gissa rätt nummer!"); Console.WriteLine("---------------------------------------------"); Console.WriteLine("Gissa på ett tal mellan 1 - 100 : "); string str = Console.ReadLine(); int number = Convert.ToInt32(str); do { Console.WriteLine("Fel, Gissa igen!"); str = Console.ReadLine(); number = Convert.ToInt32(str); if (number > slump_tal) { Console.WriteLine("Du gissade för lågt! Gissa igen : "); } else if (number < slump_tal) { Console.WriteLine("Du gissade för högt! Gissa igen : "); } } while (number == slump_tal); Console.WriteLine("Grattis! Du gissade rätt"); Console.ReadLine(); } } }

Permalänk
Medlem

@hexakon: Poängen med att använda en do-while-loop är att du då kan ha all inläsning på ett ställe inne i loopen, istället för att ha inläsning både utanför och inne i loopen som du har nu. Ett tips är att ersätta dessa två rader som du har innan loopen:

string str = Console.ReadLine(); int number = Convert.ToInt32(str);

med detta:

int number;

Du behöver alltså deklarera number före loopen, annars kan du inte använda den i jämförelsen i while-satsen. str kan du däremot deklarera inne i loopen istället. Sen behöver du flytta runt koden inne i loopen för att det ska bli rätt, men det låter jag dig klura ut själv

Permalänk
Medlem
Skrivet av hexakon:

Försöker mig på do while loopen, men får det inte att gå ihop.
Vad borde jag tänka på att jag ska ändra? Efter första gissningen nu så skriver den ut "Du gissade fel", hur får jag den att säga efter första gissningen att användaren gissade för lågt kontra högt?

namespace DetHemligaTaletDel1M1 { class Program { static void Main(string[] args) { Random randomerare = new Random(); int slump_tal = randomerare.Next(1, 100); //Slumpar ett tal mellan 1 och 100 Console.WriteLine("Hej och välkommen till gissa rätt nummer!"); Console.WriteLine("---------------------------------------------"); Console.WriteLine("Gissa på ett tal mellan 1 - 100 : "); string str = Console.ReadLine(); int number = Convert.ToInt32(str); do { Console.WriteLine("Fel, Gissa igen!"); str = Console.ReadLine(); number = Convert.ToInt32(str); if (number > slump_tal) { Console.WriteLine("Du gissade för lågt! Gissa igen : "); } else if (number < slump_tal) { Console.WriteLine("Du gissade för högt! Gissa igen : "); } } while (number == slump_tal); Console.WriteLine("Grattis! Du gissade rätt"); Console.ReadLine(); } } }

Detta är ett perfekt tillfälle för att använda debuggern om du inte har gjort det.
Sätt en breakpoint vid do-while loopens början, du gör detta genom att klicka bredvid kodlinjen, vilket då markerar en röd cirkel.

Kör sedan programmet med F5 som vanligt, programmet kommer då att stanna där du satt breakpointen och du kan gå igenom koden steg för steg genom att använda F11. Du har även möjlighet att se värden på variabler genom att ha musen över.

En do-while loop är för övrigt likt en while loop, skillnaden är att i while loopen kommer boolean expressionet först. Vilket innebär att när loopen når slutet så kommer den gå tillbaka till början för att kontrollera att värdet fortfarande stämmer.

do-while loopen kommer gå in i loopen via do och och utföra allt minst en gång, den kollar sedan booleanska värdet i slutet av loopen (där while står) och om det booleanska värdet stämmer för att avsluta loopen så fortsätter den direkt till nästa kodrad, den går alltså inte tillbaka till toppen av loopen om det inte behövs.

Det är viktigt att själv försöka hitta lösningen, kör du fast så ta en 30 min paus och tänk på annat. Ofta kan man komma på något när man inte sitter och stirrar på blint på koden i sig Men kör du helt fast kan jag hjälpa dig på traven.

Permalänk
Medlem

Jag blir tokig.. förstår absolut inte vad jag gör för fel.. Försökte mig på med en while loop istället men får det inte att fungera. Vad gör jag för fel?

namespace DetHemligaTaletDel1M1 { class Program { static void Main(string[] args) { Random randomerare = new Random(); int randomNumber = randomerare.Next(1, 100); //Slumpar ett tal mellan 1 och 100 Console.WriteLine("Hej och välkommen till gissa rätt nummer!"); Console.WriteLine("---------------------------------------------"); int guessNumber; Console.WriteLine("Gissa på ett tal ellan 1 - 100 : "); string stringNumber = Console.ReadLine(); guessNumber = Convert.ToInt32(stringNumber); while (guessNumber != randomNumber) { if (guessNumber > randomNumber) { Console.WriteLine("Du gissade tyvärr för högt, försök igen!"); Console.ReadLine(); } else if (guessNumber < randomNumber) { Console.WriteLine("Du gissade tyvärr för lågt, försök igen!"); Console.ReadLine(); } else if (guessNumber == randomNumber) { Console.WriteLine("GRATTIS! Du gissade rätt!"); Console.ReadKey(); } } Console.ReadKey(); } } }

Permalänk
Medlem

@hexakon: Du ska inte hoppa fram och tillbaka mellan olika lösningar för du får uppenbarligen inte ordning på något utan välj en lösning och försök få ordning på just den lösningen. Vilken av de olika vill du ha hjälp med?

Permalänk
Medlem

@hexakon: Du gör inget med strängen som du läser in inne i loopen, d.v.s:

Console.ReadLine();

kommer bara läsa in en rad och sen slänga bort den inlästa strängen. Men som jag skrev i mitt förra inlägg så bör du ha inläsningen på endast ett enda ställe i koden, nu har du istället gjort det motsatta och gått från två ställen till tre. Ditt mål bör vara att förenkla så att du bara har en inläsning i koden, och den måste av nödvändighet då ligga inne i loopen.

Ett litet tips är att du för den här uppgiften aldrig bör upprepa samma rad kod någonstans, då har du bara krånglat till det. En do-while-loop passar också bättre än en while-do här.

Permalänk
Medlem
Skrivet av hexakon:

Jag blir tokig.. förstår absolut inte vad jag gör för fel.. Försökte mig på med en while loop istället men får det inte att fungera. Vad gör jag för fel?

namespace DetHemligaTaletDel1M1 { class Program { static void Main(string[] args) { Random randomerare = new Random(); int randomNumber = randomerare.Next(1, 100); //Slumpar ett tal mellan 1 och 100 Console.WriteLine("Hej och välkommen till gissa rätt nummer!"); Console.WriteLine("---------------------------------------------"); int guessNumber; Console.WriteLine("Gissa på ett tal ellan 1 - 100 : "); string stringNumber = Console.ReadLine(); guessNumber = Convert.ToInt32(stringNumber); while (guessNumber != randomNumber) { if (guessNumber > randomNumber) { Console.WriteLine("Du gissade tyvärr för högt, försök igen!"); Console.ReadLine(); } else if (guessNumber < randomNumber) { Console.WriteLine("Du gissade tyvärr för lågt, försök igen!"); Console.ReadLine(); } else if (guessNumber == randomNumber) { Console.WriteLine("GRATTIS! Du gissade rätt!"); Console.ReadKey(); } } Console.ReadKey(); } } }

Det som är i while loopens kodblock kommer att repeteras tills att boleanska värdet för loopen inte längre matchar.
Just nu är din input endast före loopen, när du går in i loopen kommer du inte kunna ändra värdet för gissningen.

Kommer du inte på det tills senare ikväll så ska jag posta ett sätt att lösa det på

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av zaibuf:

Det som är i while loopens kodblock kommer att repeteras tills att boleanska värdet för loopen inte längre matchar.
Just nu är din input endast före loopen, när du går in i loopen kommer du inte kunna ändra värdet för gissningen.

Kommer du inte på det tills senare ikväll så ska jag posta ett sätt att lösa det på

Skickades från m.sweclockers.com

Så alltså så ska jag lägga

Console.WriteLine("Gissa på ett tal ellan 1 - 100 : "); string stringNumber = Console.ReadLine(); guessNumber = Convert.ToInt32(stringNumber);

inne i loopen innanför måsvingarna innan if satserna?
När jag gör detta så får jag ett felmeddelande att "Use of unassigned local variable 'guessNumber'".

Edit: Jag tar gärna inte en hel lösning i första hand, diskuterar gärna istället och försöker lösa det själv Känner mig oerhört dum när de är så många förslag men jag inte förstår, haha!

Permalänk
Medlem
Skrivet av hexakon:

Så alltså så ska jag lägga

Console.WriteLine("Gissa på ett tal ellan 1 - 100 : "); string stringNumber = Console.ReadLine(); guessNumber = Convert.ToInt32(stringNumber);

inne i loopen innanför måsvingarna innan if satserna?
När jag gör detta så får jag ett felmeddelande att "Use of unassigned local variable 'guessNumber'".

Edit: Jag tar gärna inte en hel lösning i första hand, diskuterar gärna istället och försöker lösa det själv Känner mig oerhört dum när de är så många förslag men jag inte förstår, haha!

Självklart.

Flyttar du deklarationen av guessNumber innanför loopen så kan du ju inte använda variabeln i din booleanska statement i while loopen, för variabeln finns ju inte innan loopen, eller hur?
Kom ihåg det jag sa tidigare om att variabler du behöver innanför och utanför kodblock och som kan komma att ändra i värden bör deklareras utanför loopen, men kan sedan assignas innanför loopen/if-satserna.

Kan skriva det i psuedokod så kan du försöka tyda det och göra om till kod.

START Slumpa ett tal mellan 1 och 100 spara i variabel för slumpatTal Skapa variabel för gissning GÖR DETTA Skriv ut "Gissa på ett tal mellan 1 och 100: " Mata in gissning OM gissning < slumpatTal Skriv ut "Du gissade för lågt!" ANNARS OM gissning > slumpatTal Skriv ut "Du gissade för högt!" MEDANS (gissning INTE ÄR LIKA MED slumpatTal) Skriv ut "Grattis du gissade rätt!" SLUT

Permalänk
Medlem
Skrivet av zaibuf:

Självklart.

Flyttar du deklarationen av guessNumber innanför loopen så kan du ju inte använda variabeln i din booleanska statement i while loopen, för variabeln finns ju inte innan loopen, eller hur?
Kom ihåg det jag sa tidigare om att variabler du behöver innanför och utanför kodblock och som kan komma att ändra i värden bör deklareras utanför loopen, men kan sedan assignas innanför loopen/if-satserna.

Kan skriva det i psuedokod så kan du försöka tyda det och göra om till kod.

START Slumpa ett tal mellan 1 och 100 spara i variabel för slumpatTal Skapa variabel för gissning GÖR DETTA Skriv ut "Gissa på ett tal mellan 1 och 100: " Mata in gissning OM gissning < slumpatTal Skriv ut "Du gissade för lågt!" ANNARS OM gissning > slumpatTal Skriv ut "Du gissade för högt!" MEDANS (gissning INTE ÄR LIKA MED slumpatTal) Skriv ut "Grattis du gissade rätt!" SLUT

DONE Tack så hemskt mycket för hjälpen Nu fungerar det, psuedokod kommer jag garanterat använda mig av framöver