Permalänk

Spel Lottobollar c#

Hej,

Jag är lite osäker på om jag förstått uppgiften rätt...

"Uppgiften handlar om lottobollar.
I denna uppgift kommer ni få arbeta med vektorer och slumptal.
Vidare kommer ni få visa att ni kan loopa (iterera) genom en vektor på ett lämpligt sätt, och för vektorer
används då ofta for- eller foreach.
Grund-funktionalitet (Betyg E):
I uppgiften ska besökaren få skriva in 10 stycken tal som lagras i en vektor.
När användaren skrivit in 10 stycken tal börjar spelet.
Nu ska ett tal slumpas fram.
Koden ska nu läsa alla tal som användaren skrivit in (i vektorn) och testa tal för
tal mot eventuella matchningar. Får man en matchning har man vunnit, d.v.s.
att talet i vektorn är lika med talet som slumpats fram."

Nu skriver ju min kod ut alla svar direkt... Kan man göra så att koden skriver ut ett svar och sen väntar en sekund innan nästa svar kommer osv?

Min kod ser ut såhär just nu, ni får gärna komma med tips och förbättringar.

using System; namespace Lotto { class Program { static void Main(string[] args) { Console.WriteLine("Hej och välkommen till Lotto, låt oss spela!\n"); // Skapar vektorn: int[] lottoBoll = new int[10]; // siffran 10 beskriver hur många element vi vill använda oss av for (int i = 0; i < lottoBoll.Length; i++) { Console.Write("Spela på din första lottoboll, välj ett nummer mellan 1-25 " + i + ": "); lottoBoll[i] = int.Parse(Console.ReadLine()); // Matar in värdet och konverterar från string till heltal. } Random randomerare = new Random(); //Här har jag skapat en randomerare som jag kan slumpa tal med int slumpTal = randomerare.Next(1, 26); //Slumpar tal mellan 1-100 for (int i = 0; i < lottoBoll.Length; i++) { if (lottoBoll[i] == slumpTal) { Console.WriteLine($"BINGO! rätt tal var {slumpTal}"); break; } else { Console.WriteLine($"Ingen bingo denna gång!"); } } Console.WriteLine($"\nBoll nummer {slumpTal} gav bingo!"); Console.WriteLine("Programmet avslutas."); } } }

Permalänk
Medlem
Skrivet av KodarPolle:

Kan man göra så att koden skriver ut ett svar och sen väntar en sekund innan nästa svar kommer osv?

Du kan använda Thread.Sleep för det, men det ingår inte i uppgiften så jag skulle inte rekommendera att göra så i koden du lämnar in (men experimentera gärna för din egen skull om du vill, det är så man lär sig ).

Du har för övrigt ett problem i din kod, den skriver ut "Ingen bingo denna gång!" för alla gissade tal som var fel innan man gissade rätt, istället för bara en gång om inget av gissningarna var rätt.

Permalänk
Medlem

När man vill att ens program inte ska göra någonting alls en viss tid så är ”sleep” det vedertagna begreppet i många programmeringsspråk. Sök på ”sleep c#” så borde du hitta hur man gör.

(Edit: Too slow )

Permalänk
Skrivet av perost:

Du kan använda Thread.Sleep för det, men det ingår inte i uppgiften så jag skulle inte rekommendera att göra så i koden du lämnar in (men experimentera gärna för din egen skull om du vill, det är så man lär sig ).

Du har för övrigt ett problem i din kod, den skriver ut "Ingen bingo denna gång!" för alla gissade tal som var fel innan man gissade rätt, istället för bara en gång om inget av gissningarna var rätt.

Då kanske jag ska undvika att göra så.. Tänkte att det hade blivit roligare med lite spänning. Ja precis den säger det efter varje omgång... vet inte riktigt hur jag ändrar det...

Permalänk
Skrivet av lydell:

När man vill att ens program inte ska göra någonting alls en viss tid så är ”sleep” det vedertagna begreppet i många programmeringsspråk. Sök på ”sleep c#” så borde du hitta hur man gör.

(Edit: Too slow )

Tack för svaret men som användaren ovan sa, så efterfrågas det inte i uppgiften så kanske ska skita i det. Har även försökt få så man bara får ett svar "Ingen bingo denna gång" eller "bingo!" Men när jag har gjort så, så har endast första numret avgjort... Så måste ha gjort något fel..

Förstår du hur jag menar?

Permalänk
Medlem

Tricket är att först gå igenom listan med tal enbart för att ta reda på om det blev bingo eller inte, och efter det köra Console.WriteLine med olika texter beroende på om det blev bingo eller inte.

Permalänk
Medlem
Skrivet av KodarPolle:

Då kanske jag ska undvika att göra så.. Tänkte att det hade blivit roligare med lite spänning.

Problemet är att den som ska rätta uppgiften kanske inte uppskattar att du hittar på egna saker, eftersom det gör det svårare att rätta uppgiften. Så lös först och främst uppgiften enligt instruktionerna och lämna in, därefter kan du experimentera bäst du vill med koden.

Permalänk
Skrivet av perost:

Problemet är att den som ska rätta uppgiften kanske inte uppskattar att du hittar på egna saker, eftersom det gör det svårare att rätta uppgiften. Så lös först och främst uppgiften enligt instruktionerna och lämna in, därefter kan du experimentera bäst du vill med koden.

Det har du rätt i. Dock är alla uppgifter väldigt svårtolkade. Så det är lite svårt att veta vad som faktiskt ska göras..

Permalänk
Skrivet av lydell:

Tricket är att först gå igenom listan med tal enbart för att ta reda på om det blev bingo eller inte, och efter det köra Console.WriteLine med olika texter beroende på om det blev bingo eller inte.

Har försökt göra det som du skrev, men det går inte jättebra.
Nu lyckas jag bara få en rad med text, dock blir det alltid att jag inte har bingo.. fast jag ibland träffat rätt.. Vad gör jag för fel?

using System; namespace Lotto { class Program { static void Main(string[] args) { Console.WriteLine("Hej och välkommen till Lotto, låt oss spela! Välj nummer mellan 1-25\n"); Random randomerare = new Random(); //Här har jag skapat en randomerare som jag kan slumpa tal med int slumpTal = randomerare.Next(1, 26); //Slumpar tal mellan 1-25 // Skapar vektorn: int[] lottoBoll = new int[10]; // siffran 10 beskriver hur många element vi vill använda oss av int användarensSvar = 0; for (int i = 0; i < lottoBoll.Length; i++) { Console.Write("Spela på ett nummer för index " + i + ": "); lottoBoll[i] = användarensSvar; try { användarensSvar = int.Parse(Console.ReadLine()); // Matar in värdet och konverterar från string till heltal. } catch { Console.WriteLine("Vänligen ange ett heltal"); i--; } } if (användarensSvar == slumpTal) { Console.WriteLine($"BINGO! rätt tal var {slumpTal}"); } else { Console.WriteLine($"\nIngen bingo denna gång, det slumpade talet var {slumpTal}!"); } Console.WriteLine("\nSpelet är slut!"); Console.ReadKey(); } } }

Permalänk
Skrivet av KodarPolle:

Det har du rätt i. Dock är alla uppgifter väldigt svårtolkade. Så det är lite svårt att veta vad som faktiskt ska göras..

Har kommit lite längre i koden nu, kolla gärna på mitt svar med ny kod stort tack på förhand, skulle verkligen uppskattas!!

Permalänk
Hedersmedlem

Du sätter lottoBoll[i] innan du läser in värdet som ska användas där.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Thomas:

Du sätter lottoBoll[i] innan du läser in värdet som ska användas där.

Hmm menar du att jag ska lägga den under inmatning, alltså såhär? - det funkar dock inte heller.

using System; namespace Lotto { class Program { static void Main(string[] args) { Console.WriteLine("Hej och välkommen till Lotto, låt oss spela! Välj nummer mellan 1-25\n"); Random randomerare = new Random(); //Här har jag skapat en randomerare som jag kan slumpa tal med int slumpTal = randomerare.Next(1, 26); //Slumpar tal mellan 1-25 // Skapar vektorn: int[] lottoBoll = new int[10]; // siffran 10 beskriver hur många element vi vill använda oss av int användarensSvar = 0; for (int i = 0; i < lottoBoll.Length; i++) { Console.Write("Spela på ett nummer för index " + i + ": "); try { användarensSvar = int.Parse(Console.ReadLine()); // Matar in värdet och konverterar från string till heltal. lottoBoll[i] = användarensSvar; } catch { Console.WriteLine("Vänligen ange ett heltal"); i--; } } if (användarensSvar == slumpTal) { Console.WriteLine($"BINGO! rätt tal var {slumpTal}"); } else { Console.WriteLine($"\nIngen bingo denna gång, det slumpade talet var {slumpTal}!"); } Console.WriteLine("\nSpelet är slut!"); Console.ReadKey(); } } }

Permalänk
Medlem

Dagens tips: du är inte den första i Swec:s historia som fått den här uppgiften
Prova sök på "lottobollar" på swec så lär du se ett par trådar till som handlar om samma problem... Ev kanske du kan fnula ut lösning på ditt problem från dem?

Visa signatur

A modest man is usually admired, if people ever hear of him.

Permalänk
Medlem

@KodarPolle: Nu kollar du endast om spelarens sista gissning var rätt. Första halvan av ditt första program var bra, d.v.s. inläsningen, så den behöver du inte ändra på.

Försök att tänka hur det fungerar rent logiskt att "rätta" spelarens gissningar. Spelet har två utfall: antingen har spelaren gissat rätt och vinner, eller så är alla gissningar fel och spelaren förlorar. Om du går igenom alla gissningar och spelaren inte har vunnit så har spelaren alltså förlorat. Så fundera på hur du kan hålla reda på om spelaren har vunnit eller ej, så att du vet vilket meddelande du ska skriva ut i slutet (ledtråd: bool).

Permalänk
Hedersmedlem

Nu ser den biten bra ut, men tänk igenom när/hur ofta koden if (användarensSvar == slumpTal) körs.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av perost:

@KodarPolle: Nu kollar du endast om spelarens sista gissning var rätt. Första halvan av ditt första program var bra, d.v.s. inläsningen, så den behöver du inte ändra på.

Försök att tänka hur det fungerar rent logiskt att "rätta" spelarens gissningar. Spelet har två utfall: antingen har spelaren gissat rätt och vinner, eller så är alla gissningar fel och spelaren förlorar. Om du går igenom alla gissningar och spelaren inte har vunnit så har spelaren alltså förlorat. Så fundera på hur du kan hålla reda på om spelaren har vunnit eller ej, så att du vet vilket meddelande du ska skriva ut i slutet (ledtråd: bool).

Måste man använda sig av bool?... Får inte till det. Eller kan man göra på något annat sätt?

Permalänk
Skrivet av Thomas:

Nu ser den biten bra ut, men tänk igenom när/hur ofta koden if (användarensSvar == slumpTal) körs.

Hmm ja den körs väl bara första rundan? Kan man göra så den körs alla rundor UTAN att göra en bool...eller måste man använda sig av bool då?

Permalänk
Hedersmedlem

Du behöver en loop till -- tänk på:

Citat:

I uppgiften ska besökaren få skriva in 10 stycken tal som lagras i en vektor.
När användaren skrivit in 10 stycken tal börjar spelet.
Nu ska ett tal slumpas fram.
Koden ska nu läsa alla tal som användaren skrivit in (i vektorn) och testa tal för
tal mot eventuella matchningar.

Och den biten är efter inmatningen. Så du måste loopa för inmatningen, och sen loopa för att kolla om svaret finns.

Det går utan en bool också, om du avbryter programmet vid vinst.
I pseudokod

for (...) { if (användaren har gissat rätt) { print ("Grattis, du vann!"); return; } } print("Tyvärr, ingen vinst denna gång.")

Då printas förlustmeddelandet enbart om man hade fel på alla gissningar.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Thomas:

Du behöver en loop till -- tänk på:
Och den biten är efter inmatningen. Så du måste loopa för inmatningen, och sen loopa för att kolla om svaret finns.

Det går utan en bool också, om du avbryter programmet vid vinst.
I pseudokod

for (...) { if (användaren har gissat rätt) { print ("Grattis, du vann!"); return; } } print("Tyvärr, ingen vinst denna gång.")

Då printas förlustmeddelandet enbart om man hade fel på alla gissningar.

Menar du såhär? -för det funkar inte.. det står att jag ALLTID får "ingen vinst" trots att jag får bingo..?

Jag har suttit och försökt mig på en bool och det verkar fungera men jag förstår inte RIKTIGT vad jag gjort heller så jag vill helst undvika att använda något som jag inte förstår till 100%... Därav jag helst kör utan boolen.

using System; namespace Lotto { class Program { static void Main(string[] args) { Console.WriteLine("Hej och välkommen till Lotto, låt oss spela! Välj nummer mellan 1-25\n"); Random randomerare = new Random(); //Här har jag skapat en randomerare som jag kan slumpa tal med int slumpTal = randomerare.Next(1, 26); //Slumpar tal mellan 1-25 // Skapar vektorn: int[] lottoBoll = new int[10]; // siffran 10 beskriver hur många element vi vill använda oss av int användarensSvar = 0; for (int i = 0; i < lottoBoll.Length; i++) { Console.Write("Spela på ett nummer för index " + i + ": "); try { användarensSvar = int.Parse(Console.ReadLine()); // Matar in värdet och konverterar från string till heltal. lottoBoll[i] = användarensSvar; } catch { Console.WriteLine("Vänligen ange ett heltal"); i--; } } for (int i = 0; i < lottoBoll.Length; i++) { if (användarensSvar == slumpTal) { Console.WriteLine("Grattis, du vann!"); return; } } Console.WriteLine($"\nIngen bingo denna gång, det slumpade talet var {slumpTal}!"); Console.WriteLine("\nSpelet är slut!"); Console.ReadKey(); } } }

Permalänk
Hedersmedlem

Nästan -- nu jämför du med användarensSvar, som fortfarande har värdet av det sista talet användaren skrev in. Om du ändrar så att du kollar igenom i listan med [i] istället så bör det funka.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Thomas:

Nästan -- nu jämför du med användarensSvar, som fortfarande har värdet av det sista talet användaren skrev in. Om du ändrar så att du kollar igenom i listan med [i] istället så bör det funka.

Jag tog bort "användarensSvar" helt... den kändes meningslös.. Hoppas jag inte gjorde något tokigt nu.
Men nu tror jag att det funkar!! DOCK efter bingo så slutas hela programmet ju, kan man göra så att den endast slutar loopen? Så att "Spelet är slut" kommer med? Skickar min nya kod nedan.

using System; namespace Lotto { class Program { static void Main(string[] args) { Console.WriteLine("Hej och välkommen till Lotto, låt oss spela! Välj nummer mellan 1-25\n"); Random randomerare = new Random(); //Här har jag skapat en randomerare som jag kan slumpa tal med int slumpTal = randomerare.Next(1, 26); //Slumpar tal mellan 1-25 // Skapar vektorn: int[] lottoBoll = new int[10]; // siffran 10 beskriver hur många element vi vill använda oss av for (int i = 0; i < lottoBoll.Length; i++) { Console.Write("Spela på ett nummer för index " + i + ": "); try { lottoBoll[i] = int.Parse(Console.ReadLine()); // Matar in värdet och konverterar från string till heltal. } catch { Console.WriteLine("Vänligen ange ett heltal"); i--; } } for (int i = 0; i < lottoBoll.Length; i++) { if (lottoBoll[i] == slumpTal) { Console.WriteLine($"\nBINGO! Det rätta talet var {slumpTal}"); return; } } Console.WriteLine($"\nIngen bingo denna gång, det slumpade talet var {slumpTal}!"); Console.WriteLine("\nSpelet är slut!"); Console.ReadKey(); } } }

Permalänk
Hedersmedlem

Just det, den tänkte jag inte på. My bad.

Isåfall är det nog lättast att ha en bool (typ bool spelarenVann = false) ändå. Skapa den före andra loopen. Det enda du egentligen behöver ändra sen är att sätta boolen till true istället för att skriva ut "BINGO!" och returnera, och sen *efter* loopen kolla om den är true eller false och skriva baserat på det. Då körs koden i slutet alltid.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Thomas:

Just det, den tänkte jag inte på. My bad.

Isåfall är det nog lättast att ha en bool (typ bool spelarenVann = false) ändå. Skapa den före andra loopen. Det enda du egentligen behöver ändra sen är att sätta boolen till true istället för att skriva ut "BINGO!" och returnera, och sen *efter* loopen kolla om den är true eller false och skriva baserat på det. Då körs koden i slutet alltid.

Så det mest rätta kanske är att ha en bool ändå alltså? .. Ser min kod rätt ut nu tycker du?

using System; namespace Lotto { class Program { static void Main(string[] args) { Console.WriteLine("Hej och välkommen till Lotto, låt oss spela! Välj nummer mellan 1-25\n"); Random randomerare = new Random(); //Här har jag skapat en randomerare som jag kan slumpa tal med int slumpTal = randomerare.Next(1, 26); //Slumpar tal mellan 1-25 // Skapar vektorn: int[] lottoBoll = new int[10]; // siffran 10 beskriver hur många element vi vill använda oss av for (int i = 0; i < lottoBoll.Length; i++) { Console.Write("Spela på ett nummer för index " + i + ": "); try { lottoBoll[i] = int.Parse(Console.ReadLine()); // Matar in värdet och konverterar från string till heltal. } catch { Console.WriteLine("Vänligen ange ett heltal"); i--; } } bool spelarenVann = false; for (int i = 0; i < lottoBoll.Length; i++) { if (lottoBoll[i] == slumpTal) { spelarenVann = true; } } if (spelarenVann) { Console.WriteLine($"\nBINGO! Det rätta talet var {slumpTal}"); } else { Console.WriteLine($"\nIngen bingo denna gång, det slumpade talet var {slumpTal}!"); } Console.WriteLine("\nSpelet är slut!"); Console.ReadKey(); } } }

Permalänk
Medlem

Snyggt! Nu har du kommit fram till precis den kod som flera av oss hintat om 👍

Permalänk
Skrivet av lydell:

Snyggt! Nu har du kommit fram till precis den kod som flera av oss hintat om 👍

Tack! Uppskattar eran hjälp otroligt mycket! Nu har jag en till fråga, den kanske är dum. Men jag tänker fråga den ändå.
Jag skulle vilja ha något liknande

if (lottoBoll[i] < 1 && lottoBoll[i] > 25) { Skriv " Vänligen ange ett tal mellan 1-25: } Låt användaren skriva ett nytt tal

Alltså om användaren skriver ett för högt tal eller talet 0 så ska programmet säga ifrån och man får göra om.
Kan jag lägga till detta i min try catch som jag redan har? - vore väldigt smidigt men får det inte att fungera.

Eller borde jag göra en if-sats för det - och då måste jag deklarera en ny variabel och ge värde 0? - Stämmer det?
Är jag helt ute och cyklar nu?

Permalänk
Medlem

@KodarPolle: Du skulle tekniskt sett kunna lägga if-satsen inne i try-satsen, men man brukar normalt försöka undvika att ha onödig kod inne i try-satser.

I det här fallet kan du bara lägga if-satsen efter try-catch istället. Ett problem som då uppstår är att om användaren matar in ett felaktigt värde så kastas ett exception som din catch-sats fångar upp, men därefter fortsätter loopen. Din if-sats kommer då kontrollera det föregående talet eftersom du kör i-- i catch-satsen, vilket då orsakar ett fel när du försöker hämta värdet på lottoBoll[i] (eftersom i kommer bli -1 i den första iterationen). Lösningen på det är att använda continue; för att direkt hoppa vidare till nästa iteration av loopen när något går fel.

Permalänk
Medlem

Hej!
Sorry för trådkapning men jag sitter fast med samma uppgift. Har dock ett annat problem.
När användaren anger ett tal som redan angetts så skrivs följande string ut: Talet har redan använts! och användaren får fylla i ett nytt tal. När användarens input är i string format så skrivs följande string ut: Fel format, enbart heltal tillåtna! OCH stringen som skrivs ut vid upprepat tal. Hur gör jag för att det inte ska bli så? jag vill ju inte att användaren ska få meddelande att talet redan använts när hen har skrivit bokstäver.
Någon som har lust att titta på min kod?

{ class Program { static void Main(string[] args) { // Nedan kod skapar en randomerare och bestämmer att talet som slumpas är mellan 1-30. Random randomerare = new Random(); int slumptal = randomerare.Next(1, 30); int userInput = 0; // Lagrar användarens input int[] tal = new int[10];// Skapar utrymme i minnet för att kunna lagra en vektor med 10 element bool rightAnswer = false; // för att kolla om användaren skrivit in rätt tal Console.WriteLine("Hej och välkommen till Lottobollen! du ska nu skriva in 10 heltal mellan 1-30.\n" + "Lyckas du pricka rätt på ett slumpat tal så får du BINGO! "); // Nedan for-loop körs tills användare lämnat input 10 ggr. Loopen innehåller en try-catch som fångar potentiella felaktiga format på svar från användaren. for (int i = 0; i < tal.Length; i++) { if (i == 0) // Första vändan i loopen skriver ut detta: { Console.Write("Skriv ut det första talet för indexplats " + i + " här: "); } else // Resterande vändor skrivet ut detta: { Console.Write("Skriv nästa tal för indexplats " + i + " här:"); } try { userInput = int.Parse(Console.ReadLine());// återanvänder variabeln userInput och konverterar användarens input från string till int. } catch { Console.WriteLine("Fel format, enbart heltal tillåtna! "); } // Kollar om inputen är större än 0 och lika med eller mindre än 30 if (userInput > 1 && userInput <= 30) { if (tal.Contains(userInput)) // Om talet redan skrivits in så uppmärksammans användaren om detta // Index hoppar tillbaka ett steg så att det inte blir en tom plats i vektorn pga detta. { Console.WriteLine("Siffran har redan använts! "); i--; } else {// Om talet är unikt så lagras det i vektorn tal[i] = userInput; } } else if (userInput > 30) // Om användaren skriver in ett tal högre än 30 skrivs denna string ut { Console.Write("Detta tal är för högt. \n");// om användaren skriver ett tal högre än 30 skrivs denna string ut i--; } } // Om användarens input är lika med det slumptalet så kommer bool lopen sättas till true. for (int i = 0; i < tal.Length; i++) { if (tal[i] == slumptal) { rightAnswer = true; } } // Denna if-satsen kommer att triggas om användaren skrivit in rätt tal if (rightAnswer) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"BINGO, du gissade rätt! Det slumpade talet var {slumptal}"); }// om input endast är felaktiga tal så triggas istället denna string else { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine($"Ingen vinst idag, det slumpade talet var {slumptal} Bättre lycka nästa gång! \n \n Programmet avslutas."); } Console.ReadKey(); } } }

Permalänk
Medlem

I if (lottoBoll[i] < 1 && lottoBoll[i] > 25) verkar du har blandat ihop && (and) och || (or). Ett tal kan inte vara både mindre än 1 och större än 25 på samma gång

Permalänk
Medlem

@evelinan: Se mitt svar ovanför ditt inlägg

Permalänk
Skrivet av perost:

@KodarPolle: Du skulle tekniskt sett kunna lägga if-satsen inne i try-satsen, men man brukar normalt försöka undvika att ha onödig kod inne i try-satser.

I det här fallet kan du bara lägga if-satsen efter try-catch istället. Ett problem som då uppstår är att om användaren matar in ett felaktigt värde så kastas ett exception som din catch-sats fångar upp, men därefter fortsätter loopen. Din if-sats kommer då kontrollera det föregående talet eftersom du kör i-- i catch-satsen, vilket då orsakar ett fel när du försöker hämta värdet på lottoBoll[i] (eftersom i kommer bli -1 i den första iterationen). Lösningen på det är att använda continue; för att direkt hoppa vidare till nästa iteration av loopen när något går fel.

Har försökt lägga en if-sats, men det händer liksom ingenting... tänkte även lägga en else sats som läste in lottoBollar[i] = användarensSvar; men det gick inte.. Vad gör jag för fel.. ?

using System; namespace Lotto { class Program { static void Main(string[] args) { Console.WriteLine("Hej och välkommen till Lotto, låt oss spela!\nVälj 10st nummer mellan 1-25\n"); Random randomerare = new Random(); //Här har jag skapat en randomerare som jag kan slumpa tal med int slumpTal = randomerare.Next(1, 26); //Slumpar tal mellan 1-25 int användarensSvar = 0; // Skapar vektorn: int[] lottoBoll = new int[10]; // siffran 10 beskriver hur många element vi vill använda oss av for (int i = 0; i < lottoBoll.Length; i++) { int nummer = i + 1; Console.Write("Spela på nummer " + nummer + ": "); try { lottoBoll[i] = int.Parse(Console.ReadLine()); // Matar in värdet och konverterar från string till heltal. lottoBoll[i] = användarensSvar; } catch { Console.WriteLine("Vänligen ange ett heltal"); i--; } } if (användarensSvar < 1 || användarensSvar > 25) { Console.WriteLine("Vänligen ange ett heltal mellan 1-25"); } bool spelarenVann = false; for (int i = 0; i < lottoBoll.Length; i++) { if (lottoBoll[i] == slumpTal) { spelarenVann = true; } } if (spelarenVann) { Console.WriteLine($"\nBINGO! Det rätta talet var {slumpTal}"); } else { Console.WriteLine($"\nIngen bingo denna gång, det slumpade talet var {slumpTal}!"); } Console.WriteLine("\nSpelet är slut, välkommen åter!"); Console.ReadKey(); } } }