Permalänk

Lotto Bollar

Hej uppgiften lyder
(Betyg E):I uppgiften ska besökaren få skriva in 10 stycken talsom lagras i en vektor.När användaren skrivit in 10 stycken tal börjar spelet.Nu ska etttal 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.Ytterligare funktionalitet (Betyg C)Ni ska nu kontrollera så att användaren bara skriver in ett tal mellan 1 och 25. Detta lösas enklast genom att man styr inmatning till respektive position i vektorn meden for-loop. I for-loopen finns en variabel (förändring, exempelvis i) som kontrollerar vilken position man förnärvarande ”pekar på”i vektorn.Om talet som användaren skriver in är under 1 eller över 25 kan man minska värdet i variabeln (i)somstyr positionenmed ett (1) enligt figuren nedan.Då ”backar”vi ett steg i vektorn.Alltså –för varje varv som for-loopen itererar så kommervärdet på variabeln som styrförändring att öka med ett (1). Men om vi skriver in ett ”olämpligt”värde så kommer värdet att minska med ett (1) i koden inuti loopen.Alternativet är att ni sparar det inmatade talet i en temporär variabel och lagrar det i vektorn om det uppnår kraven (det vill sägaär mellan ett och tjugofem).

detta är min kod:Problemet med koden är att om jag till exempel skriver hej skrivs felmedelandet ut men också att det inte blev bingo. Det är problemet är när jag har matat in mina 10 värden så loopar koden bara.

Kan ni ge mig lite ledtrådar

stort tack william

namespace Lottobollar { class MainClass { public static void Main(string[] args) { Console.WriteLine("Hello and welcome to Bingo!"); int[] Bingonumber = new int[10]; Console.WriteLine("Please enter 10 diffrerent values, between 1 and 25"); Random randomare = new Random(); int Slumptal = randomare.Next(0, 26); try { for (int x = 0; x < Bingonumber.Length; x++) { string StrNr = Console.ReadLine(); int numb = Convert.ToInt32(StrNr); Bingonumber[x] = numb; } } catch (FormatException ex) { Console.WriteLine("You can only enter variables not words"); } while (true) { for (int x = 0; x < Bingonumber.Length; x++) if (Bingonumber[x] == Slumptal) { Console.WriteLine("Bingo"); } else { Console.WriteLine("Sorry no Bingo,Please guess new bingo numbers"); } Console.ReadKey(); }

Permalänk
Medlem

Jag kan absolut inget om kodning, men jag får en känsla av att problemet ligger i slutet. Jag tror att din formulering gör så att den alltid kommer att börja om från toppen tills du får bingo.

Permalänk
Medlem

Din kod är sjukt svår att läsa men while (true) är ju en oändlig loop och du verkar inte göra något för att hoppa ur den.

Permalänk
Medlem

while (true) skapar en evig loop fundera/googla hur du ska breaka ur loopen eller om du behöver ett condition som kan starta om spelet.

Permalänk
Hedersmedlem

Som första steg rekommenderar jag starkt att du fixar indenteringen. Kör du något IDE så bör det gå att bara markera den och välja auto-indent i någon meny.
Det är rätt bökigt att hålla ordning på var blocken börjar och slutar som det är nu, vilket också gör det mycket lättare att råka få in buggar.

Permalänk

okey har ändrat den nu men den funkar fortfarande inte
Console.WriteLine("Hello and welcome to Bingo!");

Console.WriteLine("Please enter 10 diffrerent values, between 1 and 25");

int[] GuessedBingonumber = new int[10];
Random randomare = new Random();
int Slumptal = randomare.Next(1, 25);
int MaxNum = 25;
int MinNum = 1;

int UserNum = 0;

for (int i = 0; i < 10; i++)
{
bool BingoNumber = false;
do
{
try

{

UserNum = Convert.ToInt32(Console.ReadLine());
BingoNumber = true;

}

catch (FormatException)

{
Console.WriteLine("You can only enter variables not words");

}

} while (BingoNumber == false);

for (int x = 0; x < 10; x++)
{

if (GuessedBingonumber[x] == UserNum)
{

Console.WriteLine("This number has already been entered");

}
else if (UserNum < 1 && UserNum > MinNum)

{
Console.WriteLine("Your guess must be higher then 1!!");
i--;

}
else if (UserNum < 1 && UserNum > MaxNum)

{
Console.WriteLine("Your guess cant be higher then 25!!");
i--;

}

Console.WriteLine("These are your bingo numbers");

for (int J = 0; J < 10; J ++)
{

if (GuessedBingonumber[J] == Slumptal)

{

Console.Write(GuessedBingonumber[J] + " ");

}

else if (GuessedBingonumber[J] != Slumptal)

{
Console.WriteLine("Please try again");

}
else
{

Console.WriteLine("Unlucky no bingo this time");

}

Console.ReadKey();

}
}
}

}

}

}

Permalänk
Medlem

Lär dig att indexera kod och använd sedan code-taggarna. Alldeles för jobbigt att försöka läsa din kod för att ge en hjälpande hand just nu.

Permalänk
Hedersmedlem

Ja, som ovan. Kör du något IDE? Det borde som sagt gå att fixa till det helt automatiskt.

Jag tror inte att läraren gillar att koden ser ut som den gör heller. Vet inte om sånt ingår i betygskriterierna, men det bör det göra iom att det inte lär gå att få jobb med så svårläst kod.

Permalänk
Medlem

jag kan inte C men det är något snett med felhanteringen för min max nummer:

else if (UserNum < 1 && UserNum > MinNum) { Console.WriteLine("Your guess must be higher then 1!!"); i--;

Du har ju variabler för min och max så varför kontrollerar du "mindre än 1" hårdkodat alls?
Du borde väl bara kontrollera MinNum i ena if-satsen och Maxnum i andra ifsatsen?

Dvs tex:

if (UserNum < MinNum) Console.WriteLine("Your guess must be higher then 1!!"); i--; else if (UserNum > MaxNum) { Console.WriteLine("Your guess cant be higher then 25!!"); i--;

Dessutom borde du i writeLine meddelandet inte skriva 1 och 25 hårdkodat. De borde också använda dina variabler MinNum och MaxNum

...

Jag tror inte ovan kommer räcka speciellt långt dock för att lösa problemet
Jag fattar tex inte riktigt hur resten av loopen är tänkt att funka, men det ser snett ut med den inre X-loopen: Är den enbart till för kontroll mot om du matat in ett gammalt nummer? Isåfall ska ju inte kontrollen på om talet är för högt eller för lågt vara inbakad i den loopen, vilket den verkar vara nu? Men jag kanske läser fel då koden är svår att följa som nämnts redan.

Permalänk
Medlem

Du borde som sagt använda code-taggar som du gjorde i ditt första inlägg, men viktigare för dig själv är att du indenterar din kod korrekt. Jag formaterade koden åt dig här och skrev lite kommentarer på saker som är fel:

Console.WriteLine("Hello and welcome to Bingo!"); Console.WriteLine("Please enter 10 diffrerent values, between 1 and 25"); int[] GuessedBingonumber = new int[10]; Random randomare = new Random(); int Slumptal = randomare.Next(1, 25); int MaxNum = 25; int MinNum = 1; int UserNum = 0; for (int i = 0; i < 10; i++) { bool BingoNumber = false; do { try { UserNum = Convert.ToInt32(Console.ReadLine()); BingoNumber = true; } catch (FormatException) { Console.WriteLine("You can only enter variables not words"); } } while (BingoNumber == false); for (int x = 0; x < 10; x++) { if (GuessedBingonumber[x] == UserNum) { Console.WriteLine("This number has already been entered"); } else if (UserNum < 1 && UserNum > MinNum) { Console.WriteLine("Your guess must be higher then 1!!"); i--; } else if (UserNum < 1 && UserNum > MaxNum) { Console.WriteLine("Your guess cant be higher then 25!!"); i--; } Console.WriteLine("These are your bingo numbers"); for (int J = 0; J < 10; J ++) { if (GuessedBingonumber[J] == Slumptal) { Console.Write(GuessedBingonumber[J] + " "); } else if (GuessedBingonumber[J] != Slumptal) { Console.WriteLine("Please try again"); } else { Console.WriteLine("Unlucky no bingo this time"); } Console.ReadKey(); } } }

Din inläsning ser ok ut förutom att BingoNumber egentligen är onödig, du kan deklarera UserNum inne i loopen istället och loopa så länge som UserNum är 0 istället (eftersom 0 inte är en giltig inmatning).

Men efter det spårar det ur lite. Efter do-loopen har du en for-loop som dels försöker kolla om talet redan matats in och dels om det ligger i intervallet [1, 25]. Att kolla om det inmatade talet ligger inom [1, 25] behöver du ju dock inte göra 10 gånger för varje inmatning, så den biten behöver inte ligga inne i for-loopen. Eftersom all denna kod ligger utanför do-loopen så får användaren inte heller någon chans att mata in ett nytt värde här.

Efter det har du en loop som går igenom alla inmatade tal med det slumpade talet. Detta bör för det första inte ligga inne i for-loopen som läser in tal, jag antar att du råkat placera den där eftersom du inte indenterat din kod korrekt. För det andra så lagrar du aldrig de inmatade talen någonstans, så GuessedBingonumber kommer alltid innehålla nollor. Och för det tredje så kan du inte avgöra om användaren misslyckats med att gissa rätt förrän efter for-loopen, d.v.s. efter att du gått igenom hela arrayen.

Skrivet av Roger W:

jag kan inte C ...

Uppenbarligen inte, för det är C# och inte C Jag hoppas i alla fall att det är C#, annars är TS verkligen ute och cyklar...

Permalänk
Medlem

Vackert sammanfattat @perost
(men jag vill nog fortfarande tillägga att kontrollen av intervallet 1-25 ser suspekt ut som jag nämnde innan)

...

C eller C++ eller C# är alla ungefär samma rappakalja för mig ärligt talat
(jag kunde lite Basic en gång i tiden...)

Permalänk

har ändrat till dett nu:försöker få till try och catch med det funkar inte så bra,det stpr number 2 om man skriver in hello.min andfra fråga är om det stämmer med uppgiften för c nivå.
detta är uppgiften.
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.
Ytterligare funktionalitet (Betyg C)
Ni ska nu kontrollera så att användaren bara skriver in ett tal mellan 1 och 25.
Detta lösas enklast genom att man styr inmatning till respektive position i vektorn med en for-loop. I
for-loopen finns en variabel (förändring, exempelvis i) som kontrollerar vilken position man för
närvarande ”pekar på” i vektorn.
Om talet som användaren skriver in är under 1 eller över 25 kan man minska värdet i variabeln (i) som
styr positionen med ett (1) enligt figuren nedan. Då ”backar” vi ett steg i vektorn.
Alltså – för varje varv som for-loopen itererar så kommer värdet på variabeln som styr förändring att
öka med ett (1). Men om vi skriver in ett ”olämpligt” värde så kommer värdet att minska med ett (1) i
koden inuti loopen.
Alternativet är att ni sparar det inmatade talet i en temporär variabel och lagrar det i vektorn om det
uppnår kraven (det vill säga är mellan ett och tjugofem).

Random random = new Random();
int randomNum = random.Next(1, 26);
int[] BingoNum = new int[10];

Console.WriteLine("Hello and welcome to your very own bingo game");
Console.WriteLine("Enter 10 numbers between 1 and 25");
Console.WriteLine("Good luck");

for (int i = 0; i < BingoNum.Length; i++)
{

try

{
Console.Write("Guess " + (i + 1) + ": ");
string StrNr = Console.ReadLine();
int el = int.Parse(StrNr);
BingoNum[i] = el;

}

catch (FormatException)

{

Console.WriteLine("You can only enter bingo numbers,sorry these are the rules");
Console.WriteLine("You now get one less guess");

continue;

}

}

Console.WriteLine("these are your bingo numbers");
for (int i = 0; i < BingoNum.Length; i++)

{
Console.Write(BingoNum[i] + " ");
}

Console.WriteLine("\n\nThe winning Bingo number is....");
Console.ReadKey();
Console.WriteLine("=====> " + randomNum + " <=====");

for (int i = 0; i < BingoNum.Length; i++)

{

if (BingoNum[i] == randomNum)

{
Console.WriteLine("Congratulations you got BINGO!!!!!");
Console.WriteLine("Was it luck or pure genius");

}
else

{

Console.WriteLine("Sorry no Bingo this time please try again");

}

Console.ReadKey();

}

}
}
}

Permalänk
Medlem

Använd code-taggar när du klistrar in kod, det är helt hopplöst att läsa kod utan korrekt indentering.

[code]Din kod läggs mellan dessa[/code]

Permalänk

Random random = new Random(); int randomNum = random.Next(1, 26); int[] BingoNum = new int[10]; Console.WriteLine("Hello and welcome to your very own bingo game"); Console.WriteLine("Enter 10 numbers between 1 and 25"); Console.WriteLine("Good luck"); for (int i = 0; i < BingoNum.Length; i++) { try { Console.Write("Guess " + (i + 1) + ": "); string StrNr = Console.ReadLine(); int el = int.Parse(StrNr); BingoNum[i] = el; } catch (FormatException) { Console.WriteLine("You can only enter bingo numbers,sorry these are the rules"); Console.WriteLine("You now get one less guess"); continue; } } Console.WriteLine("these are your bingo numbers"); for (int i = 0; i < BingoNum.Length; i++) { Console.Write(BingoNum[i] + " "); } Console.WriteLine("\n\nThe winning Bingo number is...."); Console.ReadKey(); Console.WriteLine("=====> " + randomNum + " <====="); for (int i = 0; i < BingoNum.Length; i++) { if (BingoNum[i] == randomNum) { Console.WriteLine("Congratulations you got BINGO!!!!!"); Console.WriteLine("Was it luck or pure genius"); } else { Console.WriteLine("Sorry no Bingo this time please try again"); } Console.ReadKey(); } } } }

Permalänk
Medlem

Förlåt, men du måste ju också självfallet klistra in koden med indenteringen annars blir det ju ingen skillnad för läsbarheten...

Permalänk
Medlem

jag hade satt inmatningen i en while-loop istället som börjar på 0. sen hade jag endast ökat 0 med 1 (dinVariabel++), då en inmatning har lyckats. blir det en felaktig inmatning hoppar den in i catchen och sedan gör while-loopen en ny iteration. På detta sätt kan du fylla din array med 10 korrekta värden och programmet fortsätter inte förren 10 korrekta värden är ifyllda.

for-loopen kommer ju öka din variabel i for-loopen med 1 vid felaktig inmatning vilket känns konstigt.

Permalänk
Skrivet av professorsnö:

jag hade satt inmatningen i en while-loop istället som börjar på 0. sen hade jag endast ökat 0 med 1 (dinVariabel++), då en inmatning har lyckats. blir det en felaktig inmatning hoppar den in i catchen och sedan gör while-loopen en ny iteration. På detta sätt kan du fylla din array med 10 korrekta värden och programmet fortsätter inte förren 10 korrekta värden är ifyllda.

for-loopen kommer ju öka din variabel i for-loopen med 1 vid felaktig inmatning vilket känns konstigt.

okey tack läraren vill helst att vi ska använda for loops men ska kolla på en while loop. Men förstår inte varför jag måste trycka på enter för att se vad bingo nummret blir

Permalänk
Medlem
Skrivet av Will Sheza C:

Men förstår inte varför jag måste trycka på enter för att se vad bingo nummret blir

Efter "The winning Bingo number is..."-utskriften? Du har ju lagt en Console.ReadKey(); där just för att vänta tills användaren trycker på någon tangent.

Permalänk
Skrivet av perost:

Efter "The winning Bingo number is..."-utskriften? Du har ju lagt en Console.ReadKey(); där just för att vänta tills användaren trycker på någon tangent.

såg det förut efter jag hade skrivit inlägget. Det enda problemet jag har är att om man skriver in hello händer detta i terminalen.Jag har adderat så att det verkar som programet ska vara så med console writelines men känns ändå fel vill att den ska loopa tillbaka så att användaren kan skriva in nya gissningar.

Enter 10 numbers between 1 and 25
Good luck
Guess 1: hello
You can only enter bingo numbers,sorry these are the rules
You now get one less guess
Guess 2:

Permalänk
Medlem
Skrivet av Will Sheza C:

Det enda problemet jag har är att om man skriver in hello händer detta i terminalen.Jag har adderat så att det verkar som programet ska vara så med console writelines men känns ändå fel vill att den ska loopa tillbaka så att användaren kan skriva in nya gissningar.

Loopen fortsätter tills i < BingoNum.Length, men du kan ändra på i hur du vill inne i loopen.

Permalänk
Medlem

är det meningen att man ska bli av med en gissning om man anger något annat än ett nummer?

Permalänk
Skrivet av professorsnö:

är det meningen att man ska bli av med en gissning om man anger något annat än ett nummer?

Det är egentligen meningen med uppgiften men kommer inte på någon lösning

Permalänk
Skrivet av perost:

Loopen fortsätter tills i < BingoNum.Length, men du kan ändra på i hur du vill inne i loopen.

okey tack vad ska jag ändra den till ?

Permalänk
Medlem
Skrivet av Will Sheza C:

okey tack vad ska jag ändra den till ?

Det står ju till och med i beskrivningen du klippt in högst upp

Citat:

I for-loopen finns en variabel (förändring, exempelvis i) som kontrollerar vilken position man förnärvarande ”pekar på”i vektorn.Om talet som användaren skriver in är under 1 eller över 25 kan man minska värdet i variabeln (i)somstyr positionenmed ett (1) enligt figuren nedan.Då ”backar”vi ett steg i vektorn.Alltså –för varje varv som for-loopen itererar så kommervärdet på variabeln som styrförändring att öka med ett (1). Men om vi skriver in ett ”olämpligt”värde så kommer värdet att minska med ett (1) i koden inuti loopen.