Hjälp med C#, dubletter av siffror.

Permalänk
Medlem

Hjälp med C#, dubletter av siffror.

Hej,
jag håller precis nu att koda ett "bingo". Det verkar vara relativt återkommande på detta forum och kallas även lotto ibland.
Det jag vill ha hjälp med är att skriva koden när användaren själv skriver in sina siffror.
Jag vill inte att det ska gå att skriva in dubbletter av siffror utan bara nya siffror. Jag har testat på flera olika men får inte till det, inte ens i närheten av att lyckas, vanligtvis förstör det hela loopen.

Såhär ser koden ut:

//Deklarera bingoraden i en array int[] bingorad = new int[10]; //Deklarera användarens bingorad i en array int[] spelarnummer = new int[10]; //skapa slumptalsgenerator int[] vinst = new int[1]; Random random = new Random(); int Bingo = random.Next(1, 26); for (int i = 0; i < bingorad.Length; i++) //Lägger in slumptal i Bingorad { var value = random.Next(1, 26); if (bingorad.Contains(value)) { i--; continue; } bingorad[i] = value; } Array.Sort(bingorad); // Sorterar bingoraden i ordning. for (int i = 0; i < spelarnummer.Length; i++)//Låter användaren bestämma sin bingorad { Console.Write("Nummer " + (i + 1) + " "); spelarnummer[i] = Convert.ToInt32(Console.ReadLine()); if (spelarnummer[i] < 1 || spelarnummer[i] > 25) { Console.BackgroundColor = ConsoleColor.Red; Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("Välj endast tal mellan 1 och 25"); i--; Console.ResetColor(); } } Array.Sort(spelarnummer); Console.Clear(); // Rensar allt från skärmen Console.WriteLine("Talen du valde var dessa: "); Console.ForegroundColor = ConsoleColor.Blue; for (int i = 0; i < spelarnummer.Length; i++) { Console.Write(spelarnummer[i]); Console.Write(", "); } Console.WriteLine(); Console.ResetColor(); Console.WriteLine("Bingoraden var: "); // Tar fram bingoraden för spelaren Console.ForegroundColor= ConsoleColor.Yellow; for (int i = 0; i < bingorad.Length; i++) { Console.Write(bingorad[i]); Console.Write(", "); } int lyckotal = 0; // skapar en variabel för att ha koll på antal rätt Console.WriteLine(); Console.ResetColor(); Console.WriteLine("Vinst på nummer: "); Console.ForegroundColor = ConsoleColor.Green; for (int i = 0; i < spelarnummer.Length; i++) // tar reda på antal rätt mellan spelarens nummer och slumpade nummer { Thread.Sleep(500); for (int j = 0; j < bingorad.Length; j++) { if (bingorad[i] == spelarnummer[j]) { lyckotal++; Console.Write(bingorad[i]); Console.Write(", "); } } } Console.WriteLine(); Console.WriteLine("Antal rätt: " + lyckotal); // visar antal rätt för spelaren Console.ResetColor(); Console.WriteLine("Bra spelat!"); Console.WriteLine("Tryck på valfri knapp för att avsluta programmet"); Console.ReadKey();

Permalänk
Medlem

När du läst in siffran får du helt enkelt söka igenom arrayen efter siffran och agerar på det.

Tips, spara den inte i arrayen innan du har kontrollerat den.

Jag har inte alls koll på C#, men om inte arrayer är "zero-initialized" så måste du sätta alla element till 0 innan du börjar.

En annan grej, verkar lite konstigt med dubbla loopar för att kontrollera antal rätt, man ska väl bara jämföra bingorad[i] med spelarnummer[i]? Eller ska detta bingosystem inte funka som lottorader? Bingo och lotto är olika saker för mig, koden ser helt klart mer ut som Lotto.

Permalänk
Medlem

Jag är inte paff på programmering, men
Kanske en lösning är att definiera varje siffra t.ex.:
X1, X2,... Osv
Och efter att man väljer/matar en siffra (X1), då skall göras en kontroll, att andra siffror får inte vara lika med den (X1)
Och så skall göras med alla siffror.

Permalänk
Medlem

Spar gissningen i en egen variabel.

Ändra så din if-sats kollar mot gissnings-variabel istället och lägg till en if-else sats efter, typ nått sånt här:

if ( ej inom godkända nummer) { gör lämplig åtgärd } else if( kolla om den finns i arrayen) { du kan göra på samma sätt som när du la in slumptal i bingoraden. gör lämplig åtgärd om man redan gissat } else{ en godkänd gissning, lägg in den i arrayen }

Permalänk
Medlem

jag skulle göra kollen såhär:

if (spelarnummer.Distinct().Count() != spelarnummer.Count()) { Console.WriteLine("Raden har duplicerade nummer"); }

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Medlem
Skrivet av dlq84:

När du läst in siffran får du helt enkelt söka igenom arrayen efter siffran och agerar på det.

Tips, spara den inte i arrayen innan du har kontrollerat den.

Jag har inte alls koll på C#, men om inte arrayer är "zero-initialized" så måste du sätta alla element till 0 innan du börjar.

En annan grej, verkar lite konstigt med dubbla loopar för att kontrollera antal rätt, man ska väl bara jämföra bingorad[i] med spelarnummer[i]? Eller ska detta bingosystem inte funka som lottorader? Bingo och lotto är olika saker för mig, koden ser helt klart mer ut som Lotto.

Du har helt rätt, det är mer som Lotto än Bingo. Uppgiften handlar om att skapa 10 slumpade tal, sedan ska användaren välja 10 slumpade tal sen ska man se hur många rätt man fick.
"a-nivå" på den här uppgiften är mer som bingo, då ska man skapa en bingobricka som de slumpade talen ska slumpas mot, men det har jag tyvärr inte tid.

Förstår dock inte riktigt hur jag kan skriva loopen för att kontrollera antal rätt? Testade att skriva i en loop men den vill inte fungera då. Hur ska jag skriva loopen utan att nestla in en annan? Om du har ork och tid att svara på det dvs:)

Skrivet av Mr.W:

Spar gissningen i en egen variabel.

Ändra så din if-sats kollar mot gissnings-variabel istället och lägg till en if-else sats efter, typ nått sånt här:

if ( ej inom godkända nummer) { gör lämplig åtgärd } else if( kolla om den finns i arrayen) { du kan göra på samma sätt som när du la in slumptal i bingoraden. gör lämplig åtgärd om man redan gissat } else{ en godkänd gissning, lägg in den i arrayen }

Tack! Det funkade, ännu mer imponerade var att jag kunde skriva koden efter din kommentar också. Lite har man lärt sig

Skrivet av Haptic:

jag skulle göra kollen såhär:

if (spelarnummer.Distinct().Count() != spelarnummer.Count()) { Console.WriteLine("Raden har duplicerade nummer"); }

Visste inte riktigt vad "distinct" eller "count" gjorde så vågade inte använda den riktigt, testade dock i inlärningssyfte men blev inte smartare där heller Tack ändå!

Permalänk
Medlem
Skrivet av MrHejgen:

Visste inte riktigt vad "distinct" eller "count" gjorde så vågade inte använda den riktigt, testade dock i inlärningssyfte men blev inte smartare där heller Tack ändå!

Perfekt tillfälle att kika vad dom gör så du har nytta av dom längre fram!

Distinct: Returnerar en ny lista med alla distinkta(unika) värden från källan
https://learn.microsoft.com/en-us/dotnet/api/system.linq.enum...

Count: Returnerar antalet element i en lista
https://learn.microsoft.com/en-us/dotnet/api/system.linq.enum...

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.