Hjälp mig med mitt tärningsprogram! [C#]

Permalänk

Hjälp mig med mitt tärningsprogram! [C#]

Hur gör jag för att fixa fram ett random tal i min funktion?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ThrowTheDice { class Program { static void Main(string[] args) { Console.Title = "Throw The Dice"; Console.ForegroundColor = ConsoleColor.Green; Welcome(); AskNumberOfDice(); int repeat; repeat = Convert.ToInt32(Console.ReadLine()); RollTheDice(repeat); Instructions(); } static void RollTheDice(int repeat) { Random random = new Random(); int dice = random.Next(1, 6); for (int i = 0; i < repeat; i++) { Console.WriteLine("Rolling the dice..."); System.Threading.Thread.Sleep(500); } } static void Welcome() { Console.WriteLine("Welcome to Throw The Dice!"); } static void Instructions() { Console.WriteLine("\r\nWrite 'roll' or 'rtd' to roll the dice!"); } static void AskNumberOfDice() { Console.WriteLine("\r\nType in how many pair of dice you want to be rolled."); } } }

Dold text
Permalänk
Medlem

När du kallar RollTheDice så slumpar du fram ett nummer 1 till 6 endast en gång. Det du vill göra är att slumpa fram ett nytt tall 1 till 6 för varje iteration av din for loop

Permalänk
Skrivet av eaan:

När du kallar RollTheDice så slumpar du fram ett nummer 1 till 6 endast en gång. Det du vill göra är att slumpa fram ett nytt tall 1 till 6 för varje iteration av din for loop

Yes det har jag fixat! Men hur gör jag så att den skriver totala summan? Har skrivit:

static void RollTheDice(int repeat) { Random random = new Random(); for (int i = 0; i < repeat; i++) { Console.WriteLine("Rolling the dice..."); System.Threading.Thread.Sleep(500); int dice = random.Next(1, 6); Console.WriteLine(dice); int sum = sum + dice; }

Men det står att sum är en oförklarad variabel D:

Permalänk
Hedersmedlem
Skrivet av LinusNeuman:

Men det står att sum är en oförklarad variabel D:

Fundera på var sum är definierad.

Permalänk

Spontant känner jag att det är bättre att deklarera "dice" och "sum" en gång, snarare än "i" gånger.

Visa signatur

Phanteks P600S Grå - Ryzen 9 3900X - Phanteks PH-TC14PE Black - ASUS ROG Strix X570-F Gaming - G.Skill Trident Z Neo 32GB (2x16GB) 3600MHz CL16 - HD7970 - Seasonic Focus+ 650W Platinum

Permalänk
Skrivet av Elgot:

Fundera på var sum är definierad.

Ahh! Nuså!

int sum = 0; sum = sum + dice;

Nytt problem:
Hur gör jag så att den skriver den totala summan efter att alla tärningar har blivit slagna?

static void RollTheDice(int repeat) { Random random = new Random(); for (int i = 0; i < repeat; i++) { System.Threading.Thread.Sleep(1000); Console.WriteLine("Rolling the dice..."); System.Threading.Thread.Sleep(1500); int dice = random.Next(1, 6); Console.WriteLine(dice); int sum = 0; sum = sum + dice; } Console.WriteLine("Total value: " + sum); }

Men den vill inte veta vad sum är eftersom den är skriven utanför for loopen? För om jag skriver den innanför for loopen så kommer den skriva det varje gång tärningen slår?

Permalänk
Medlem
Skrivet av LinusNeuman:

Ahh! Nuså!

int sum = 0; sum = sum + dice;

Hoppas du har lärt dig av det här

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Hoppas du har lärt dig av det här

Jag försöker, men jag hittar inte något som skrivits som har med detta problemet att göra?

Permalänk
Medlem

Tänk på var du deklarerar dina variabler. Du skapare ny int sum för VARJE iteration i din loop, det du vill är ju att deklarera en sum och sedan addera ditt slumpade tal för varje iteration (din sum är bara definerad i for loopen så du kan inte nå den någon annanstans ifrån)

Skickades från m.sweclockers.com

Permalänk
Medlem

Definiera sum under class Program då

Permalänk
Medlem
Skrivet av vajjan:

Definiera sum under class Program då

Nu är väl en bättre lösning att definera sum innan for loopen inne i DiceRoll metoden eftersom det bara är där variabeln behövs

Skickades från m.sweclockers.com

Permalänk
Skrivet av eaan:

Nu är väl en bättre lösning att definera sum innan for loopen inne i DiceRoll metoden eftersom det bara är där variabeln behövs

Skickades från m.sweclockers.com

Summan nollställs ju varje gång?

Visa signatur

Bal-Sagoth | Ensiferum | Windir | Finntroll | Wintersun | Amon Amarth | Moonsorrow | Nazgûl

Permalänk

Nuni!
Nu funkar den, men tack för hjälpen!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ThrowTheDice { class Program { static void Main(string[] args) { Console.Title = "Throw The Dice"; Size(); Console.ForegroundColor = ConsoleColor.Green; Welcome(); while (true) { AskNumberOfDice(); int repeat; repeat = Convert.ToInt32(Console.ReadLine()); Console.Clear(); Console.WriteLine(repeat + " Pair of dice selected.\r\n"); System.Threading.Thread.Sleep(1500); Console.Clear(); RollTheDice(repeat); continue; } } static void RollTheDice(int repeat) { Random random = new Random(); int sum = 0; for (int i = 0; i < repeat; i++) { Console.WriteLine("Rolling the dice..."); System.Threading.Thread.Sleep(1000); int dice = random.Next(1, 6); Console.WriteLine(dice); System.Threading.Thread.Sleep(1000); sum = sum + dice; Console.Clear(); Console.WriteLine("Total value: " + sum); } } static void Welcome() { Console.WriteLine("Welcome to Throw The Dice!"); } static void Instructions() { Console.WriteLine("\r\nWrite 'roll' or 'rtd' to roll the dice!"); } static void AskNumberOfDice() { Console.WriteLine("\r\nType in how many pair of dice you want to be rolled."); } static void Size() { Console.WindowWidth = 55; Console.WindowHeight = 50; } } }

Dold text
Permalänk
Medlem
Skrivet av LinusNeuman:

Nuni!
Nu funkar den, men tack för hjälpen!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ThrowTheDice { class Program { static void Main(string[] args) { Console.Title = "Throw The Dice"; Size(); Console.ForegroundColor = ConsoleColor.Green; Welcome(); while (true) { AskNumberOfDice(); int repeat; repeat = Convert.ToInt32(Console.ReadLine()); Console.Clear(); Console.WriteLine(repeat + " Pair of dice selected.\r\n"); System.Threading.Thread.Sleep(1500); Console.Clear(); RollTheDice(repeat); continue; } } static void RollTheDice(int repeat) { Random random = new Random(); int sum = 0; for (int i = 0; i < repeat; i++) { Console.WriteLine("Rolling the dice..."); System.Threading.Thread.Sleep(1000); int dice = random.Next(1, 6); Console.WriteLine(dice); System.Threading.Thread.Sleep(1000); sum = sum + dice; Console.Clear(); Console.WriteLine("Total value: " + sum); } } static void Welcome() { Console.WriteLine("Welcome to Throw The Dice!"); } static void Instructions() { Console.WriteLine("\r\nWrite 'roll' or 'rtd' to roll the dice!"); } static void AskNumberOfDice() { Console.WriteLine("\r\nType in how many pair of dice you want to be rolled."); } static void Size() { Console.WindowWidth = 55; Console.WindowHeight = 50; } } }

Dold text

Den kanske fungerar, men inte som du har tänkt dig... Ta en titt på din random.Next() och läs på lite om hur denna slumpar talen. Lite överraskad att ingen har påpekat detta tidigare...

Permalänk
Skrivet av Mempatch:

Den kanske fungerar, men inte som du har tänkt dig... Ta en titt på din random.Next() och läs på lite om hur denna slumpar talen. Lite överraskad att ingen har påpekat detta förrän nu...

Hmm :S Jag hittar inget fel på den. Dock så kan jag hålla med om att den slumpar väldigt dåligt!

Permalänk
Medlem
Skrivet av LinusNeuman:

Hmm :S Jag hittar inget fel på den. Dock så kan jag hålla med om att den slumpar väldigt dåligt!

Slumpar dåligt får man leva med skulle jag tro, men har du inte tänkt på att du aldrig får några 6: or?

http://msdn.microsoft.com/en-us/library/2dx6wyd4.aspx

Citat:

Parameters

minValue
Type: System.Int32
The inclusive lower bound of the random number returned.

maxValue
Type: System.Int32
The exclusive upper bound of the random number returned. maxValue must be greater than or equal to minValue.

Permalänk
Hedersmedlem
Skrivet av Mempatch:

Slumpar dåligt får man leva med skulle jag tro, men har du inte tänkt på att du aldrig får några 6: or?

Det kan också vara lämpligt att ha random som en klassmedlem (då två i tiden näraliggande anrop av funktionen annars riskerar att få samma utfall).

Permalänk
Medlem

typ såhär

public int RandomNumber(int min, int max)
{
lock(lock) //sync
{
return random.Next(min, max);
}
}

Permalänk
Medlem
Skrivet av vajjan:

typ såhär

public int RandomNumber(int min, int max)
{
lock(lock) //sync
{
return random.Next(min, max);
}
}

Varför kör du lock på den?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Varför kör du lock på den?

Därför att Next ändrar tillståndet på Random instansen och synkar då för att inte få samma tid i trådarna (om det är flera) = ännu mera random

Permalänk
Medlem
Skrivet av vajjan:

Därför att Next ändrar tillståndet på Random instansen och synkar då för att inte få samma tid i trådarna (om det är flera) = ännu mera random

Det är en väldigt bra idé om programmet är flertrådat men lite overkill för just detta exemplet kanske.. Trådning kan vara ganska komplicerat.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Det är en väldigt bra idé om programmet är flertrådat men lite overkill för just detta exemplet kanske.. Trådning kan vara ganska komplicerat.

Fortsätt prata, har absolut 100% koll på vad ni snackar om..
..
..
..
o.O

Permalänk
Festpilot 2020, Antiallo

Du kan inte köra en slumptals generator i stil med x^(12611^31)-1 Mod 11?

Den slumpar väl varje tal mellan 12611^31-1 och 0 om man följer it-säkerheten i världen.
Ska se om jag har det antecknat sen när jag kommer hem om du vill kunna slumpa många tal

Visa signatur

 | PM:a Moderatorerna | Kontaktformuläret | Geeks Discord |
Testpilot, Skribent, Moderator & Geeks Gaming Huvudadmin

Permalänk
Skrivet av DavidtheDoom:

Du kan inte köra en slumptals generator i stil med x^(12611^31)-1 Mod 11?

Den slumpar väl varje tal mellan 12611^31-1 och 0 om man följer it-säkerheten i världen.
Ska se om jag har det antecknat sen när jag kommer hem om du vill kunna slumpa många tal

Jag uppskattar att du vill hjälpa, men det där är rena kinesiskan, vi har alltså bara haft en 6-7 lektioner än, och ska precis börja med XNA, så jag har inte riktigt kommit dit med det där du nyss skrev. (En programmerings lektion i veckan är seeeegt xD)

Permalänk
Medlem
Skrivet av LinusNeuman:

Fortsätt prata, har absolut 100% koll på vad ni snackar om..
..
..
..
o.O

Om du är nyfiken handlar sidospåret om trådhantering och synkronisering av access till metoder.
Jag tycker inte du ska bry dig om detta för tillfället, det är något du kommer komma i kontakt med en bra bit längre fram

Visa signatur

Kom-pa-TI-bilitet