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

Trädvy Permalänk
Medlem
Registrerad
Maj 2003

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;

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2004

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.

| i5 2500k@4.2ghz | msi p67a-g45 | gigabyte r9 280x | 8gb ddr3 | FD Integra r2 750w | samsung 840 evo | bitfenix comrade |

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004

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.

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

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.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2010

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
Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2010

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

// LZ

Trädvy Permalänk
Medlem
Registrerad
Maj 2003

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

Trädvy Permalänk
Medlem
Plats
SweClockers forum
Registrerad
Aug 2012
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

Guide: Roota din HTC - BB-Kod-knappar på Prisjakt

              Min burk - Kvävekyld till 80%
Phenom II X4 965@3900MHz (Sommarklock)
GTX 760@1111MHz

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2010

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

Trädvy Permalänk
Medlem
Registrerad
Apr 2013
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?

Trädvy Permalänk
Medlem
Registrerad
Jul 2003
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

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2010
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

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Dec 2003
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.

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

Trädvy Permalänk
Medlem
Registrerad
Apr 2013
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.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2010

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

Trädvy Permalänk
Medlem
Plats
Rymden
Registrerad
Maj 2013

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.

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
¯\_(ツ)_/¯

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
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