Dom här jävla lottobollarna.. C#

Permalänk

Dom här jävla lottobollarna.. C#

Hej! Sitter fast på (förhoppningsvis) en sista sak i min skoluppgift om lottobollar.. Skriver i C#.
Jag vill i min första for-loop se till att man inte kan skriva in tecken, alltså att ett felmeddelande isåfall ska dyka upp: detta utan att hela loopen går "sönder". Har testat en try catch på alla möjliga sätt. Helst av allt skulle jag vilja hitta ett sätt utan try catch, typ en if-sats som bestämmer att det blir ett felmeddelande på ALLT som inte är 1-25.
Nu är jag dock för mycket av en nybörjare för att veta hur detta ska lösas. Skulle någon kunna ge mig en knuff i rätt riktning, eller en vettig hemsida som förklarar hur jag kan göra (har letat och letat)?
Finns det för övrigt annan input på hur jag förbättrar/snyggar till koden så tas det tacksamt emot.

Koden:

using System; namespace Lottobollar { class Program { public static void Main(string[] args) { int[] usersWorth = new int[9]; //Skapar vektor med namn usersWorth där programmet ska lagra användarens tal //Hälsar användare välkommen och ger användaren instruktioner till spelet Console.WriteLine("Hi and welcome to The Lottery-game!\n"); Console.WriteLine("Instructions to the game:\nYou will be asked to write in " + "9 diffrent lottery-ball numers between 1-25 into your board: "); //Skapar en tvådimensionell vektor som är 3x3 stor för att ge spelaren en bild av hur spelet ser ut. int[,] gameBoard = new int[,]{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; printBoard(gameBoard); Console.WriteLine("If any of your choices matches the random lottery-ball " + "number in todays lottery, you'll win.\nGood luck, champ!\n"); Console.WriteLine("Please enter you 9 lottery numbers: \n"); //Ber användaren skriva in sina lottonummer for (int i = 0; i < usersWorth.Length; i++) //Loop som låter användaren skriva in sina 9 lottotal { Console.Write("Your lottery number " + (i + 1) + " : "); string str = Console.ReadLine(); int number = Convert.ToInt32(str); //Omvandlar användarens string till int while (number < 1 || number > 25) { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.BackgroundColor = ConsoleColor.Black; //Ändrar tillbaka färgerna till normalt Console.ForegroundColor = ConsoleColor.White; Console.Write("Please enter a new lotterynumber:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str); } usersWorth[i] = number; //Sparar användarens valda tal som int } Random randomerare = new Random(); //Slumpar fram ett tal till spelet int winningNr = randomerare.Next(1, 26); //Vinnande lottotal: winningNr Console.Write("Your chosen lottery-balls i : \n"); bool foundNumber = false; //Skapar en bool för att kontrollera ifall användaren skrivit in vinnande siffra i lotteriet. for (int i = 0; i < usersWorth.Length; i++) { Console.WriteLine(usersWorth[i]); //Skriver ut användarens tal. if (usersWorth[i] == winningNr) { foundNumber = true; //Sätter bool-värde till true om rightNr finns bland användarens olika element i array } } Console.ReadLine(); Console.WriteLine("TODAYS WINNING LOTTERY-NUMBER IS...."); Console.ReadLine(); Console.WriteLine("----->> " + winningNr + " <<-----"); //Visar dagens vinnande lottoNr Console.ReadLine(); if (foundNumber == true) //Om användaren angivit det framslumpade winningNr i sin array kommer följande string ut. { Console.WriteLine("One of the numbers lottery-balls you've selected, " + winningNr + ", matches the winning bingo-ball! Congratulations!"); } else //Om användaren inte skrivit in rätt Nr i sin array skrivs denna string ut. { Console.WriteLine ("None of your lottery-balls was a match to the winning ball, better luck next time!"); } Console.ReadLine(); Console.Write("Press any key to exit the game."); Console.ReadKey(true); } static void printBoard(int[,] board) { for (int i = 0; i < board.GetLength(0); i++) // For-loop som går igenom vektorn nerifrån och upp { Console.WriteLine(" -------------"); Console.Write(" | "); for (int j = 0; j < board.GetLength(1); j++) //For-loop som går igenom vektorn från vänster till höger { Console.Write(board[i, j] + " | "); //Skriver ut en tom lottobricka } Console.WriteLine(""); } Console.WriteLine(" -------------"); } } }

Glömde skriva vilket språk jag skrev i
Permalänk
Medlem

Ett problem du har är att du läser in tal på två ställen i loopen, först i början och sen i while-loopen om den första inläsningen var fel. Det innebär att du även måste ha felhantering på två ställen. Fundera istället hur du kan strukturera koden så att du bara behöver ha inläsning på ett ställe. Vad du egentligen vill göra är ju:

{ läs in tal om talet är fel: skriv ut felmeddelande } upprepa tills talet är giltigt

Tips: en do-while-loop kan vara mer passande än en while-loop i det här fallet.

Permalänk
Skrivet av perost:

Ett problem du har är att du läser in tal på två ställen i loopen, först i början och sen i while-loopen om den första inläsningen var fel. Det innebär att du även måste ha felhantering på två ställen. Fundera istället hur du kan strukturera koden så att du bara behöver ha inläsning på ett ställe. Vad du egentligen vill göra är ju:

{ läs in tal om talet är fel: skriv ut felmeddelande } upprepa tills talet är giltigt

Tips: en do-while-loop kan vara mer passande än en while-loop i det här fallet.

Jag måste enligt uppgiften använda mig av en for-loop, vilket också blivit anledningen till att jag sitter fast så mycket. Problemet ligger i att jag inte hittar en kod som kan säga att just string inte får gå, antar att detta är pga

int number = Convert.ToInt32(str); //Omvandlar användarens string till int

men vet ändå inte hur jag löser det? hjälp mig gärna förstå!

Permalänk
Medlem

Du kan alltid subtrahera värdet på 'i' inne i din for-loop:

for (int i = 0; i < length; i++) { läs in värde if(error) { felmeddelande i--; } else gör något }

Nackdelen är att 'i' kan vara lika med -1 vid ett tillfälle.

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Jag måste enligt uppgiften använda mig av en for-loop, vilket också blivit anledningen till att jag sitter fast så mycket. Problemet ligger i att jag inte hittar en kod som kan säga att just string inte får gå, antar att detta är pga

int number = Convert.ToInt32(str); //Omvandlar användarens string till int

men vet ändå inte hur jag löser det? hjälp mig gärna förstå!

Jag menade inte att du ska ersätta din for-loop utan det du har inne i den.

Om du vill använda Convert.ToInt32 så bör du ha det anropet i en try-catch-sats eftersom den kommer kasta ett exception om strängen inte går att konvertera till int. Ett annat alternativ är att använda Int32.TryParse som istället returnerar true eller false. Men troligtvis ingår det i uppgiften att lära sig hur try-catch fungerar.

Permalänk
Skrivet av perost:

Jag menade inte att du ska ersätta din for-loop utan det du har inne i den.

Om du vill använda Convert.ToInt32 så bör du ha det anropet i en try-catch-sats eftersom den kommer kasta ett exception om strängen inte går att konvertera till int. Ett annat alternativ är att använda Int32.TryParse som istället returnerar true eller false. Men troligtvis ingår det i uppgiften att lära sig hur try-catch fungerar.

Det ingår inte i denna uppgiften med try-catch, utan har lärt mig detta innan och kört try catch koden i ett tidigare program jag byggt..
Vart menar du att do ska starta isåfall? Har trixat lite med det nu men den bråkar rejält då jag inte förstår vilka villkor jag ska sätta + att jag inte förstår om den ska sitta före hela

Console.Write("Your lottery number " + (i + 1) + " : "); string str = Console.ReadLine(); int number = Convert.ToInt32(str); //Omvandlar användarens string till int

eller inte.

Permalänk
Skrivet av Kimortal:

Du kan alltid subtrahera värdet på 'i' inne i din for-loop:

for (int i = 0; i < length; i++) { läs in värde if(error) { felmeddelande i--; } else gör något }

Nackdelen är att 'i' kan vara lika med -1 vid ett tillfälle.

Största problemet är att jag inte vet vad errorkoden är.

Permalänk

Vad har jag gjort för fel nu då?? Nu kan man inte skriva tecken (SUPERKUL!!) men man får helt plötsligt skriva vilken siffra man vill. Förstår att det är för att jag tagit bort "if (number < 1 || number > 25)"

Koden-snutten nu

for (int i = 0; i < usersWorth.Length; i++) //Loop som låter användaren skriva in sina 9 lottotal { Console.Write("Your lottery number " + (i + 1) + " : "); string str = Console.ReadLine(); int number; bool intResultTryParse = int.TryParse(str,out number); if (intResultTryParse == true) { Console.WriteLine(number); } else { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.BackgroundColor = ConsoleColor.Black; //Ändrar tillbaka färgerna till normalt Console.ForegroundColor = ConsoleColor.White; Console.Write("Please enter a new lottery-number:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str); } usersWorth[i] = number; //Sparar användarens valda tal som int }

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Största problemet är att jag inte vet vad errorkoden är.

Det är i detta fallet siffran du vill kontrollera. Det vill säga:

if(number < 1 || number > 25) { felmeddelande i-- }

Ännu bättre lösning för att kontrollera att en siffra är korrekt är, som perost nämnde, att använda int.TryParse() där du först kan kontrollera ifall användaren har matat in en siffra överhuvudtaget och sen kontrollera att siffran har ett korrekt värde.

string userInput = Console.ReadLine(); if(int.TryParse(userInput, int out number)) // Returnerar true ifall strängen från ReadLine() är omvandlingsbar till ett heltal { // 'number' är en variabel som skapas i TryParse() och är det omvandlade värdet av strängen från 'userInput' if(number < 1 || number > 25) { Felmeddelande: Siffran måste vara mellan 1 och 25 } else { Korrekt } } else { Felmeddelande: Förväntar ett heltal. }

https://docs.microsoft.com/en-us/dotnet/api/system.int32.tryp...

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Vart menar du att do ska starta isåfall? Har trixat lite med det nu men den bråkar rejält då jag inte förstår vilka villkor jag ska sätta + att jag inte förstår om den ska sitta före hela

Console.Write("Your lottery number " + (i + 1) + " : "); string str = Console.ReadLine(); int number = Convert.ToInt32(str); //Omvandlar användarens string till int

eller inte.

Du har en for-loop som går igenom arrayen du vill fylla. Du har då två alternativ när ett fel inträffar: antingen backa en iteration och gör om den (som Kimortal föreslår) eller kör inläsningen i en loop tills du får ett giltigt värde att lägga in i arrayen. Oavsett vad du väljer så måste du ha en try-catch-sats runt Convert.ToInt32 för att hantera när användaren matar in något som inte är ett tal.

Men om du väljer att gå på mitt förslag (som inte är bättre än Kimortals förslag, bara annorlunda) så vill du loopa tills användaren matar in ett giltigt tal. Detta innebär förstås att du måste ha inläsning inne i loopen som du hade i din första lösning, misstaget du gjorde där var att även ha inläsning före loopen vilket krånglar till det. Kolla på mitt första inlägg igen och se hur jag strukturerade pseudokoden där.

Orsaken till att jag rekommenderade do-while istället för while är för att med en while-loop så måste du kolla om talet är giltigt redan när du går in i loopen, men det blir ju lite krångligt om du inte läser in något tal förrän inne i loopen. En do-while är då mer lämplig eftersom den alltid kör minst en iteration och istället kontrollerar villkoret i slutet av varje iteration.

Det kan eventuellt hjälpa att implementera en metod för att läsa in ett tal från användaren, som du sen använder i loopen för att fylla arrayen. Det blir lite mer kod, men det kanske är enklare att förstå hur det fungerar om du separerar uppgiften att läsa in ett tal från uppgiften att fylla arrayen.

Permalänk

Nu verkar allting fungera med er hjälp!! Herregud vad jag är tacksam.

Tycker ni att det ser bra ut eller är det något jag borde ändra på? Just den kod-biten nu:

for (int i = 0; i < usersWorth.Length; i++) //Loop som låter användaren skriva in sina 9 lottotal { Console.Write("Your lottery number " + (i + 1) + " : "); string str = Console.ReadLine(); int number; bool intResultTryParse = int.TryParse(str,out number); if (intResultTryParse == true) { if (number < 1 || number > 25) { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.BackgroundColor = ConsoleColor.Black; //Ändrar tillbaka färgerna till normalt Console.ForegroundColor = ConsoleColor.White; Console.Write("Please enter a new lottery-number:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str); } else { Console.WriteLine(number); } } else { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.BackgroundColor = ConsoleColor.Black; //Ändrar tillbaka färgerna till normalt Console.ForegroundColor = ConsoleColor.White; Console.Write("Please enter a new lottery-number:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str); } usersWorth[i] = number; //Sparar användarens valda tal som int }

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Tycker ni att det ser bra ut eller är det något jag borde ändra på? Just den kod-biten nu:

Vad händer om användaren matar in ett felaktigt tal när det första var fel och du ber om ett nytt?

Permalänk
Skrivet av perost:

Vad händer om användaren matar in ett felaktigt tal när det första var fel och du ber om ett nytt?

Jaha.. Nu såg jag den kraschen, det var alltså inte bullet-proof. Detta då pga "number = Convert.ToInt32(str);" antar jag.
Fan! Jag som började göra en metod för allting att anropa istället.

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Nu verkar allting fungera med er hjälp!! Herregud vad jag är tacksam.

Tycker ni att det ser bra ut eller är det något jag borde ändra på? Just den kod-biten nu:

for (int i = 0; i < usersWorth.Length; i++) //Loop som låter användaren skriva in sina 9 lottotal { Console.Write("Your lottery number " + (i + 1) + " : "); string str = Console.ReadLine(); int number; bool intResultTryParse = int.TryParse(str,out number); if (intResultTryParse == true) { if (number < 1 || number > 25) { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.BackgroundColor = ConsoleColor.Black; //Ändrar tillbaka färgerna till normalt Console.ForegroundColor = ConsoleColor.White; Console.Write("Please enter a new lottery-number:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str); } else { Console.WriteLine(number); } } else { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.BackgroundColor = ConsoleColor.Black; //Ändrar tillbaka färgerna till normalt Console.ForegroundColor = ConsoleColor.White; Console.Write("Please enter a new lottery-number:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str); } usersWorth[i] = number; //Sparar användarens valda tal som int }

Du bör kontrollera användarens input när du ber om en ny siffra i dina if-satser. Nu försöker du att konvertera strängen direkt efter input. Ett tips är att låta iterationen återgå till början av loopen efter felmeddelandena, där har du redan en kontroll av input-strängarna med hjälp av int.TryParse(). Och eftersom du måste använda en for-loop så behöver du också subtrahera i för att du ska kunna nå det antal siffror du efterfrågar.

EDIT: Jag var visst lite slö där, såg att perost fick dig att se problemet
Men jag vill också tillägga att du kan också använda Console.ResetColor() som återställer färgerna till default automatiskt. För du kan inte vara säker på att alla har ett konsolfönster med vita bokstäver och svart bakgrund.

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Finns det för övrigt annan input på hur jag förbättrar/snyggar till koden så tas det tacksamt emot.

Ja, det finns en del saker man kan förbättra.
Som till exempel istället för att skriva:

string str = Console.ReadLine(); int number; bool intResultTryParse = int.TryParse(str,out number);

Så kan du skriva:

bool intResultTryParse = int.TryParse(Console.ReadLine(), out int number);

Man kan även istället för att skriva if(intResultTryParse == true) så skriv bara if(intResultTryParse)
Dessutom så kan man istället för att skriva:

Console.Write("Please enter a new lottery-number:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str);

Så kan du skriva:

Console.Write("Please enter a new lottery-number:\n"); bool nyttNummer = int.TryParse(Console.ReadLine(), out number) while(!nyttNummer || number < 1 || number > 25) { Console.Write("Please enter a new lottery-number:\n"); nyttNummer = int.TryParse(Console.ReadLine(), out number); }

While-satsen kommer att fortsätta fråga så länge du inte skriver en siffra eller om siffran är mindre än 1 eller större än 25. Man lär sig som bäst när man försöker klura ut lite saker själv och tänka sig igenom det. Men här ett exempel på hur man kan skriva det på ett annat sätt.

Permalänk
Skrivet av Alec1337:

Ja, det finns en del saker man kan förbättra.
Som till exempel istället för att skriva:

string str = Console.ReadLine(); int number; bool intResultTryParse = int.TryParse(str,out number);

Så kan du skriva:

bool intResultTryParse = int.TryParse(Console.ReadLine(), out int number);

Man kan även istället för att skriva if(intResultTryParse == true) så skriv bara if(intResultTryParse)
Dessutom så kan man istället för att skriva:

Console.Write("Please enter a new lottery-number:\n"); str = Console.ReadLine(); number = Convert.ToInt32(str);

Så kan du skriva:

Console.Write("Please enter a new lottery-number:\n"); bool nyttNummer = int.TryParse(Console.ReadLine(), out number) while(!nyttNummer || number < 1 || number > 25) { Console.Write("Please enter a new lottery-number:\n"); nyttNummer = int.TryParse(Console.ReadLine(), out number); }

While-satsen kommer att fortsätta fråga så länge du inte skriver en siffra eller om siffran är mindre än 1 eller större än 25. Man lär sig som bäst när man försöker klura ut lite saker själv och tänka sig igenom det. Men här ett exempel på hur man kan skriva det på ett annat sätt.

Har efter ditt inlägg bestämt mig för att inte byta ut

string str = Console.ReadLine(); int number; bool intResultTryParse = int.TryParse(str,out number);

då koden du skickade inte verkar fungera för mig.. Och framförallt vill jag gärna förstå vad jag gör vilket jag isåfall inte gör, du får gärna förklara! Jag vill ju lära mig inte bara få det serverat..

Med while inuti if vill jag verkligen tacka för och dubbelkolla en sak! Visst är utropstecknet (!nyttNummer) till för att kolla om boolen är sann? Alltså sålänge det är sant att användaren skriver in vilket värde som helst som inte är 1-25 så kommer loopen att fortsätta?

Förlåt att jag är så korkad, uppskattar all hjälp från er alla!

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Har efter ditt inlägg bestämt mig för att inte byta ut

string str = Console.ReadLine(); int number; bool intResultTryParse = int.TryParse(str,out number);

då koden du skickade inte verkar fungera för mig.. Och framförallt vill jag gärna förstå vad jag gör vilket jag isåfall inte gör, du får gärna förklara! Jag vill ju lära mig inte bara få det serverat..

Med while inuti if vill jag verkligen tacka för och dubbelkolla en sak! Visst är utropstecknet (!nyttNummer) till för att kolla om boolen är sann? Alltså sålänge det är sant att användaren skriver in vilket värde som helst som inte är 1-25 så kommer loopen att fortsätta?

Förlåt att jag är så korkad, uppskattar all hjälp från er alla!

Om det är någon kod som inte fungerar så kan det ha att göra med variablers livslängd eller något annat, svårt för mig att se eftersom jag inte har provat din kod !

Det stämmer att !nyttNummer betyder att om nyttNummer är falsk så gå in i while-satsen. Om boolvariabeln nyttNummer är sann så kommer den hoppa över while-satsen. Skriver du till exempel asdf så blir nyttNummer falsk och du hamnar i while-satsen, skriver du 123 så hamnar du också i while-satsen.

Permalänk

Hela koden nu:

using System; namespace Lottobollar { class Program { static void problemSolver() { } public static void Main(string[] args) { int[] usersWorth = new int[9]; //Skapar vektor med namn usersWorth där programmet ska lagra användarens tal //Hälsar användare välkommen och ger användaren instruktioner till spelet Console.WriteLine("Hi and welcome to The Lottery-game!\n"); Console.WriteLine("Instructions to the game:\nYou will be asked to write in " + "9 diffrent lottery-ball numers between 1-25 into your board: "); //Skapar en tvådimensionell vektor som är 3x3 stor för att ge spelaren en bild av hur spelet ser ut. int[,] gameBoard = new int[,]{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; printBoard(gameBoard); Console.WriteLine("If any of your choices matches the random lottery-ball " + "number in todays lottery, you'll win.\nGood luck, champ!\n"); Console.WriteLine("Please enter you 9 lottery numbers: \n"); //Ber användaren skriva in sina lottonummer for (int i = 0; i < usersWorth.Length; i++) //Loop som låter användaren skriva in sina 9 lottotal { Console.Write("Your lottery number " + (i + 1) + " : "); string str = Console.ReadLine(); int number; bool TryParse = int.TryParse(str,out number); //Skapar en bool som gör om string till int(number) if (TryParse) { if (number < 1 || number > 25) { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.ResetColor(); //Ändrar tillbaka färg till default Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); bool validNumber = int.TryParse(Console.ReadLine(), out number); //Läser in nytt värde och kollar så det är en int mellan 1-25 while(!validNumber || number < 1 || number > 25) //While-sats som körs sålänge användare inte matar in ett giltigt värde (1-25) { Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); } } } else { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.ResetColor(); //Ändrar tillbaka färg till default Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); bool validNumber = int.TryParse(Console.ReadLine(), out number); while(!validNumber || number < 1 || number > 25) { Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); } } usersWorth[i] = number; //Sparar användarens valda tal som int } Random randomerare = new Random(); //Slumpar fram ett tal till spelet int winningNr = randomerare.Next(1, 26); //Vinnande lottotal: winningNr Console.Write("Your chosen lottery-balls is : \n"); bool foundNumber = false; //Skapar en bool för att kontrollera ifall användaren skrivit in vinnande siffra i lotteriet. for (int i = 0; i < usersWorth.Length; i++) { Console.WriteLine(usersWorth[i]); //Skriver ut användarens tal. if (usersWorth[i] == winningNr) { foundNumber = true; //Sätter bool-värde till true om rightNr finns bland användarens olika element i array } } Console.ReadLine(); Console.WriteLine("TODAYS WINNING LOTTERY-NUMBER IS...."); Console.ReadLine(); Console.WriteLine("----->> " + winningNr + " <<-----"); //Visar dagens vinnande lottoNr Console.ReadLine(); if (foundNumber == true) //Om användaren angivit det framslumpade winningNr i sin array kommer följande string ut. { Console.WriteLine("One of the numbers lottery-balls you've selected, " + winningNr + ", matches the winning bingo-ball! Congratulations!"); } else //Om användaren inte skrivit in rätt Nr i sin array skrivs denna string ut. { Console.WriteLine ("None of your lottery-balls was a match to the winning ball, better luck next time!"); } Console.ReadLine(); Console.Write("Press any key to exit the game."); Console.ReadKey(true); } static void printBoard(int[,] board) { for (int i = 0; i < board.GetLength(0); i++) // For-loop som går igenom vektorn nerifrån och upp { Console.WriteLine(" -------------"); Console.Write(" | "); for (int j = 0; j < board.GetLength(1); j++) //For-loop som går igenom vektorn från vänster till höger { Console.Write(board[i, j] + " | "); //Skriver ut en tom lottobricka } Console.WriteLine(""); } Console.WriteLine(" -------------"); } } }

Detta måste väl fungera? Är ju inte på någon hög nivå, det är programmering 1 bara. Hade önskat sätta hela felmeddelandet i en egen metod att anropa när det behövs med då hoppar den över första siffran som kommer in (eller snarare sparar värdet i userWorth[0]. Får se om jag blir klokare imorgon, ca. 9 timmar utan paus vid en dator kan driva vem som helst till vansinne..

Permalänk
Medlem

@Hjälplös nybörjare: Eftersom du faktiskt knåpat ihop en lösning som ser någorlunda funktionell ut så kan jag visa varför jag tjatade om att undvika inläsning på flera ställen. Ungefär så här hade jag själv löst det (med varning för att jag inte testat koden och egentligen inte kan C# heller ):

for (int i = 0; i < usersWorth.Length; i++) { Console.Write("Your lottery number " + (i + 1) + " : "); int number; bool valid; do { string str = Console.ReadLine(); valid = int.TryParse(str, out number); valid = valid && number >= 1 && number <= 25; if (!valid) { Console.BackgroundColor = ConsoleColor.Red; Console.ForegroundColor = ConsoleColor.Black; Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.ResetColor(); Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); } } while (!valid); usersWorth[i] = number; }

Som du ser går det att lösa uppgiften med inläsning på endast ett ställe i koden, och det blir då mycket mindre kod eftersom du inte behöver upprepa felhanteringen på flera ställen heller. Som nybörjare är det lätt hänt att man fokuserar för mycket på detaljerna och tappar bort sig, det kan vara bra att ta ett steg tillbaka ibland och fundera på vad det egentligen är man vill att koden ska göra.

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Detta måste väl fungera? Är ju inte på någon hög nivå, det är programmering 1 bara. Hade önskat sätta hela felmeddelandet i en egen metod att anropa när det behövs med då hoppar den över första siffran som kommer in (eller snarare sparar värdet i userWorth[0]. Får se om jag blir klokare imorgon, ca. 9 timmar utan paus vid en dator kan driva vem som helst till vansinne..

Du sade innan att bool TryParse = int.TryParse(Console.ReadLine(), out int number); inte fungerade men när jag testade lite snabbt i Visual Studio så fungerar det. Det var säkert ett logiskt fel. Jag vill inte peta för mycket i din kod men jag förkortade en bit av din kod till detta:

Console.Write("Your lottery number " + (i + 1) + " : "); bool validNumber = int.TryParse(Console.ReadLine(), out int number); //Skapar en bool som gör om string till int(number) if (!validNumber || number < 1 || number > 25) { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.ResetColor(); //Ändrar tillbaka färg till default Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); //Läser in nytt värde och kollar så det är en int mellan 1-25 while (!validNumber || number < 1 || number > 25) //While-sats som körs sålänge användare inte matar in ett giltigt värde (1-25) { Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); } }

Din else-sats är lite onödig
Sen tycker jag du kan ändra foundNumber == true till bara foundNumber, man lär sig så det är bara att fortsätta

Permalänk
Skrivet av Alec1337:

Du sade innan att bool TryParse = int.TryParse(Console.ReadLine(), out int number); inte fungerade men när jag testade lite snabbt i Visual Studio så fungerar det. Det var säkert ett logiskt fel. Jag vill inte peta för mycket i din kod men jag förkortade en bit av din kod till detta:

Console.Write("Your lottery number " + (i + 1) + " : "); bool validNumber = int.TryParse(Console.ReadLine(), out int number); //Skapar en bool som gör om string till int(number) if (!validNumber || number < 1 || number > 25) { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.ResetColor(); //Ändrar tillbaka färg till default Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); //Läser in nytt värde och kollar så det är en int mellan 1-25 while (!validNumber || number < 1 || number > 25) //While-sats som körs sålänge användare inte matar in ett giltigt värde (1-25) { Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); } }

Din else-sats är lite onödig
Sen tycker jag du kan ändra foundNumber == true till bara foundNumber, man lär sig så det är bara att fortsätta

Jag förstår vad du menar och har testat båda bredvid varandra nu och jämfört, fattar hela grejen men är så ny på bool att jag tror det är det som ställer till det mest för mig.
Dock klagar den på denna raden

bool validNumber = int.TryParse(Console.ReadLine(), out int number); //Skapar bool som gör om stingt till int(number)

Klagerierna: "Ogiltig uttrycksterm: int"
"Ogiltig uttrycksterm: )"
"";" förväntas"

Permalänk
Skrivet av Hjälplös nybörjare:

Jag förstår vad du menar och har testat båda bredvid varandra nu och jämfört, fattar hela grejen men är så ny på bool att jag tror det är det som ställer till det mest för mig.
Dock klagar den på denna raden

bool validNumber = int.TryParse(Console.ReadLine(), out int number); //Skapar bool som gör om stingt till int(number)

Klagerierna: "Ogiltig uttrycksterm: int"
"Ogiltig uttrycksterm: )"
"";" förväntas"

Update: tog bort själva int number och deklarerade number till int på en rad över istället och tog bort INT i boolen. Nu funkar allting jättebra! Tack så mycket för hjälpen och framförallt för att jag blivit klokare!!

Permalänk
Medlem

Bra kämpat må jag säga, lätt att man fastnar bland alla loopar och conditions. Keep it up!

Visa signatur

"Happiness is only real when shared"

Permalänk
Medlem
Skrivet av Hjälplös nybörjare:

Update: tog bort själva int number och deklarerade number till int på en rad över istället och tog bort INT i boolen. Nu funkar allting jättebra! Tack så mycket för hjälpen och framförallt för att jag blivit klokare!!

Märkligt, man skall inte behöva göra så. Jag ser att din IDE klagar över syntaxfel. För mig så fungerar allt korrekt.
Så för att förtydliga allt så är hela koden nedan:

using System; namespace Lottobollar { class Program { static int MetodensNamn() { bool validNumber = int.TryParse(Console.ReadLine(), out int number); //Skapar en bool som gör om string till int(number) if (!validNumber || number < 1 || number > 25) { Console.BackgroundColor = ConsoleColor.Red; //Gör bakgrund till röd under error-meddelande Console.ForegroundColor = ConsoleColor.Black; //Gör text svart under error-meddelande Console.Write("ERROR!!! This program only accept numbers between 1-25..\n"); Console.ResetColor(); //Ändrar tillbaka färg till default Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); //Läser in nytt värde och kollar så det är en int mellan 1-25 while (!validNumber || number < 1 || number > 25) //While-sats som körs sålänge användare inte matar in ett giltigt värde (1-25) { Console.Write("Please enter a new lottery-number, between the numbers 1-25:\n"); validNumber = int.TryParse(Console.ReadLine(), out number); } } return number; } public static void Main(string[] args) { int[] usersWorth = new int[9]; //Skapar vektor med namn usersWorth där programmet ska lagra användarens tal //Hälsar användare välkommen och ger användaren instruktioner till spelet Console.WriteLine("Hi and welcome to The Lottery-game!\n"); Console.WriteLine("Instructions to the game:\nYou will be asked to write in " + "9 diffrent lottery-ball numers between 1-25 into your board: "); //Skapar en tvådimensionell vektor som är 3x3 stor för att ge spelaren en bild av hur spelet ser ut. int[,] gameBoard = new int[,]{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; printBoard(gameBoard); Console.WriteLine("If any of your choices matches the random lottery-ball " + "number in todays lottery, you'll win.\nGood luck, champ!\n"); Console.WriteLine("Please enter you 9 lottery numbers: \n"); //Ber användaren skriva in sina lottonummer for (int i = 0; i < usersWorth.Length; i++) //Loop som låter användaren skriva in sina 9 lottotal { Console.Write("Your lottery number " + (i + 1) + " : "); usersWorth[i] = MetodensNamn(); //Sparar användarens valda tal som int } Random randomerare = new Random(); //Slumpar fram ett tal till spelet int winningNr = randomerare.Next(1, 26); //Vinnande lottotal: winningNr Console.Write("Your chosen lottery-balls is : \n"); bool foundNumber = false; //Skapar en bool för att kontrollera ifall användaren skrivit in vinnande siffra i lotteriet. for (int i = 0; i < usersWorth.Length; i++) { Console.WriteLine(usersWorth[i]); //Skriver ut användarens tal. if (usersWorth[i] == winningNr) { foundNumber = true; //Sätter bool-värde till true om rightNr finns bland användarens olika element i array } } Console.ReadLine(); Console.WriteLine("TODAYS WINNING LOTTERY-NUMBER IS...."); Console.ReadLine(); Console.WriteLine("----->> " + winningNr + " <<-----"); //Visar dagens vinnande lottoNr Console.ReadLine(); if (foundNumber) //Om användaren angivit det framslumpade winningNr i sin array kommer följande string ut. { Console.WriteLine("One of the numbers lottery-balls you've selected, " + winningNr + ", matches the winning bingo-ball! Congratulations!"); } else //Om användaren inte skrivit in rätt Nr i sin array skrivs denna string ut. { Console.WriteLine("None of your lottery-balls was a match to the winning ball, better luck next time!"); } Console.ReadLine(); Console.Write("Press any key to exit the game."); Console.ReadKey(true); } static void printBoard(int[,] board) { for (int i = 0; i < board.GetLength(0); i++) // For-loop som går igenom vektorn nerifrån och upp { Console.WriteLine(" -------------"); Console.Write(" | "); for (int j = 0; j < board.GetLength(1); j++) //For-loop som går igenom vektorn från vänster till höger { Console.Write(board[i, j] + " | "); //Skriver ut en tom lottobricka } Console.WriteLine(""); } Console.WriteLine(" -------------"); } } }

Permalänk
Medlem
Skrivet av Alec1337:

Märkligt, man skall inte behöva göra så. Jag ser att din IDE klagar över syntaxfel. För mig så fungerar allt korrekt.

Det verkar vara en nyhet i C# 7 att man kan göra så, så en förklaring skulle vara att TS använder en äldre version vs C#. Kanske dags att uppgradera i så fall, men det spelar troligtvis ingen större roll för en sån här kurs.

Permalänk
Medlem

Tips om du kör C#9, vet inte vilken version det kom i så kanske funkar i 8 eller 7 också.

if (int.TryParse(input, out var number)) { //variablen number är nu skapad och kan användas som en int Console.WriteLine($"{number}+5 = {number+5}"); } else { Console.WriteLine("Inget nummer ju!"); }