C# Hjälp med att Multiplicera random värden(Nybörjare)

Permalänk
Medlem

C# Hjälp med att Multiplicera random värden(Nybörjare)

Tjena alla swecare!
Jag har börjat så smått med C# programmering men har för tillfället kört fast vid en funktion som egentligen inte borde vara så svår.
Projektet är ett Yatze spel och tanken är att jag vill generera 6 slumpmässiga värden som jag sedan adderar och skriver ut.

Problemet är att den skriver ut 36 varje gång? dvs den tar högsta värdet som kan genereras och inte det aktuella värdet som faktiskt genererades. Vad gör jag för fel och hur kan jag lösa det?

Här är koden so far:

Random rnd1 = new Random(); int antalKast = 0; int summa = 0; Console.WriteLine("----Yatzy----"); Console.WriteLine("Tryck på Valfri knapp för att kasta tärningen"); Console.WriteLine(); kastet: Console.ReadKey(); while (antalKast <= 5) { antalKast++; Console.WriteLine("Du Kastade:" + rnd1.Next(1, 6)); summa = (antalKast * 6); } Console.WriteLine(); Console.WriteLine("Summan blev: " + summa); Console.WriteLine("Kasta igen?"); antalKast = 0; goto kastet;

Permalänk
Medlem

summa = (antalKast * 6);

två problem:

1. Det du är intresserad av att spara är det slumpade talet, inte antal kast. lagra förslagsvis talet du får ut från rnd.next() i en variabel.

2. summa skrivs över varje gång du tilldelar den ett värde. för att addera med sitt befintliga värde skriv summa = summa + ditt_slumpade_tal. Alternativt: summa += ditt_slumpade_tal.

Eftersom du också vet hur många gånger du vill iterera (dvs, hur många varv i loopen) så lämpar sig en for loop bättre än en while loop. Ex: for(int i = 0; i<6; i++), då slipper du antalKast variabeln.

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | Dell S2721DGFA | Asus MG279Q |

Permalänk
Medlem

Du använder ju inte det slumptal du får till annat än att skriva ut det.
Summan blir samma eftersom ingenting förändras.

Permalänk
Medlem

Du vill generera 6st slumpmässiga tal, det gör du, men du gör ingenting med det för tillfället.
1. Spara värdet du generar.
2. Lägg till det i summan, just nu skriver du över ditt gamla värde varje gång. += fixar biffen.

Permalänk
Medlem

Hade inget o göra :-)

using System; namespace conTärning { class Program { static Random rnd; static void Main(string[] args) { rnd = new Random(42); RollTheDice(); } static void RollTheDice() { int antal = 0; int summa = 0; Console.Clear(); Console.WriteLine("Hur många tärningar skall kastas(1-6):"); string intal = Console.ReadLine(); if (int.TryParse(intal, out antal)) { if (antal > 0 && antal < 7) { for (int x = 1; x <= antal; x++) { int slag = rnd.Next(1, 6); Console.WriteLine("Tärning: " + x + " Värde:" + slag); summa += slag; } Console.WriteLine(""); Console.WriteLine("Summa av slagen: " + summa); Console.ReadLine(); RollTheDice(); } else { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } } else { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } } } }

Redigerat in code-taggar //mod
Permalänk
Medlem

Verkar inte gå att få till kodformatering här i forumet, om intresse finns, så kan jag maila koden

// LZ

Permalänk
Medlem

Tack för all respons och hjälp! Mycket vänligt och uppskattat. Det löste sig nu.

Permalänk
Medlem
Skrivet av Tea42BBS:

Verkar inte gå att få till kodformatering här i forumet, om intresse finns, så kan jag maila koden

// LZ

Man använder [code][/code]-taggar för att posta kodstycken med bibehållen indentering.

using System; namespace conTärning { class Program { static Random rnd; static void Main(string[] args) { rnd = new Random(42); RollTheDice(); } static void RollTheDice() { int antal = 0; int summa = 0; Console.Clear(); Console.WriteLine("Hur många tärningar skall kastas(1-6):"); string intal = Console.ReadLine(); if (int.TryParse(intal, out antal)) { if (antal > 0 && antal < 7) { for (int x = 1; x <= antal; x++) { int slag = rnd.Next(1, 6); Console.WriteLine("Tärning: " + x + " Värde:" + slag); summa += slag; } Console.WriteLine(""); Console.WriteLine("Summa av slagen: " + summa); Console.ReadLine(); RollTheDice(); } else { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } } else { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } } } }

Dold text
Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem

Tack för code-tag-tipset

int slag = rnd.Next(1, 6); skall vara int slag = rnd.Next(1, 7);

Med vänlig hälsning Lazze

Permalänk
Medlem
Skrivet av Tea42BBS:

using System; namespace conTärning { class Program { static Random rnd; static void Main(string[] args) { rnd = new Random(42); RollTheDice(); } static void RollTheDice() { int antal = 0; int summa = 0; Console.Clear(); Console.WriteLine("Hur många tärningar skall kastas(1-6):"); string intal = Console.ReadLine(); if (int.TryParse(intal, out antal)) { if (antal > 0 && antal < 7) { for (int x = 1; x <= antal; x++) { int slag = rnd.Next(1, 6); Console.WriteLine("Tärning: " + x + " Värde:" + slag); summa += slag; } Console.WriteLine(""); Console.WriteLine("Summa av slagen: " + summa); Console.ReadLine(); RollTheDice(); } else { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } } else { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } } } }

Hur avslutar man med all den rekursionen och varför rekursion överhuvudtaget?

Permalänk
Skrivet av Tea42BBS:

using System; namespace conTärning { class Program { static Random rnd; static void Main(string[] args) { rnd = new Random(42); RollTheDice(); } static void RollTheDice() { int antal = 0; int summa = 0; Console.Clear(); Console.WriteLine("Hur många tärningar skall kastas(1-6):"); string intal = Console.ReadLine(); if (!int.TryParse(intal, out antal)) { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } if (antal < 1 && antal > 6) { Console.WriteLine("Ogiltigt antal: " + antal); Console.ReadLine(); RollTheDice(); } for (int x = 1; x <= antal; x++) { int slag = rnd.Next(1, 6); Console.WriteLine("Tärning: " + x + " Värde:" + slag); summa += slag; } Console.WriteLine(""); Console.WriteLine("Summa av slagen: " + summa); Console.ReadLine(); RollTheDice(); } } }

Vänder man på villkoret i if-satserna blir det mycket trevligare kod; den blir inte alls lika svår att läsa

Visa signatur

Citera, tack!
Har du läst tråden om strandhögtalare och andra musiklådor?

Permalänk
Medlem
Skrivet av aluser:

Hur avslutar man med all den rekursionen och varför rekursion överhuvudtaget?

Det är ingen rekursion, utan den kollar om den fick in giltiga värden att jobba med, annars så frågar den om. När den är klar, så startar programmet om....

// LZ

Permalänk
Medlem
Skrivet av Tea42BBS:

Det är ingen rekursion, utan den kollar om den fick in giltiga värden att jobba med, annars så frågar den om. När den är klar, så startar programmet om....

// LZ

Njae, jag får nog hålla med @aluser.
Definitionen av rekursion är en självkallande metod vilket helt klart sker i RollTheDice()-metoden.
Om man skulle sätta en counting breakpoint (x) så kommer man klart och tydligt se i stacktracen att RollTheDice() har kallats x gånger.
Kör man en för lång rekursion så får man till slut StackOverflowException.

Citat:

StackOverflowException is thrown for execution stack overflow errors, typically in case of a very deep or unbounded recursion.

Men generellt ser jag inga problem med denna kod. Helt ok att köra med rekursion i dessa fall. Jag kommenterade bara av tekniska skäl.

Visa signatur

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

Permalänk
Medlem
Skrivet av Leedow:

Njae, jag får nog hålla med @aluser.
Definitionen av rekursion är en självkallande metod vilket helt klart sker i RollTheDice()-metoden.
Om man skulle sätta en counting breakpoint (x) så kommer man klart och tydligt se i stacktracen att RollTheDice() har kallats x gånger.
Kör man en för lång rekursion så får man till slut StackOverflowException.
Men generellt ser jag inga problem med denna kod. Helt ok att köra med rekursion i dessa fall. Jag kommenterade bara av tekniska skäl.

Förutom att samma sak går att utföra med en do while eller while som inte anropar funktionen igen.

Permalänk
Medlem

Jag uppskattar er dissektion av koden. Meningen var inte att skriva den perfekta rollthedice, utan ett stycke kod som en nybörjare som TS kan förstå o dra nytta av.

Finns säkert minst 5 andra sätt att strukturera koden på - men troligen skulle nivån på koden ökats så att istället för att ge en "aha" upplevelse så skulle det bli en "hmm jasså", upplevelse.

Jag är dock mäkta förvånad över att ni inte nämnt kodens största svagheter. 1) Man kan bara avsluta med ctrl+c samt att jag utelämnade try/Catch

// LZ

Permalänk

Ett annat tips, det är sällan(om någonsin) man bör använda goto, det kan resultera i väldigt ful kod som är svår att följa("Spaghettikod"). Använd istället if-satser och funktioner för att fördela koden.

Visa signatur

CPU: Intel Core i5 4670k 3.4GHz MB: Asus Z87-A GPU: Radeon R9 280X RAM: Corsair Vengeance LP 16GB HDD: WD Blue 1TB PSU: be quiet! Pure Power 630w Låda: Fractal Design Define R4 Arctic White OS: Windows 7 Home Premium 64bit KB: Ducky G2PRO Grey PBT MX Clear
¯\_(ツ)_/¯

Permalänk
Inaktiv
Skrivet av Tea42BBS:

Jag uppskattar er dissektion av koden. Meningen var inte att skriva den perfekta rollthedice, utan ett stycke kod som en nybörjare som TS kan förstå o dra nytta av.

Finns säkert minst 5 andra sätt att strukturera koden på - men troligen skulle nivån på koden ökats så att istället för att ge en "aha" upplevelse så skulle det bli en "hmm jasså", upplevelse.

Jag är dock mäkta förvånad över att ni inte nämnt kodens största svagheter. 1) Man kan bara avsluta med ctrl+c samt att jag utelämnade try/Catch

// LZ

Man brukar (jag iaf) inte skriva något sätt att avsluta på när jag skrev simpla cmd program. Try/catch låter man ju debuggern leta efter