4 svar
409 visningar
Vetten 6 – Fd. Medlem
Postad: 13 nov 2020 10:49

Vill inte få upp samma slumpade tal igen - vad har jag gjort för fel?

Uppgiften var att skapa ett program som fungerar som en lottodragning. Användaren ska ange tio egna tal som lagras i en vektor. Sedan ska ett (frivilligt) antal tal slumpas fram och jämföras med användarens tal och antalet rätt ska anges. 

Är nästan klar med koden, men får problem med de slumpade talen. Jag vill ju bara att ett tal ska kunna komma upp en gång, men när jag skriver ut listan med vinnande tal i slutet så visar den ibland samma tal flera gånger. Hur ändrar jag detta? 

 

namespace Uppgift_5
{
class Program
{

public static int HämtaGissning()
{
int gissning = 0;
bool tal = false;

while(!tal)
{
Console.Write("Ange ett heltal mellan 1 och 25 ");
tal = int.TryParse(Console.ReadLine(), out gissning);

if (!tal)
Console.WriteLine("Du angav ett ogiltigt svar. Försök igen.");

}

return gissning;
}


static void Main(string[] args)

{
Console.WriteLine(":::::::: BINGOLOTTO :::::::");
Console.WriteLine("|| Välkommen till spelet ||");
Console.WriteLine("Du kommer att få ange 10 stycken tal. Om något/några av talen matchar de dragna talen så har du vunnit!");
Console.WriteLine("LYCKA TILL!");
Console.ReadLine();


int[] myArray = new int[10];
int gissning;

for (int i = 0; i < myArray.Length; i++)
{
bool redanLagrad = false;
gissning = HämtaGissning(); //anropar metod, vilket gör att variabeln gissning tilldelas värden
if (gissning > 0 && gissning < 26)
{
foreach (int gissningsVärde in myArray)
{
if (gissningsVärde == gissning)
{
Console.Write("Du har redan angett detta nummer. Försök igen. ");
i--;
redanLagrad = true;

}
}
if (redanLagrad == false)

myArray[i] = gissning;
}


else
{
Console.WriteLine("Du angav ej ett nummer mellan 1 och 25. Försök igen. ");
i--;
}


}

Random random = new Random();
int[] slumpTal = new int[8]; // skapar vektor för de slumpade talen
int slump;
int[] vinnandeTal = new int[8]; // skapar vektor för de vinnande talen
int j = 0;


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

slump = random.Next(1, 26);

foreach( int slumpVärde in slumpTal)
{
if (slump == slumpVärde)
i--;
else

{
slumpTal[i] = slump;
break;

}


}


}

bool vinst = false;
for (int i = 0; i < slumpTal.Length; i++)
{
slump = slumpTal[i];

foreach (int nummer in myArray)
{
if (slump == nummer)
{

vinnandeTal[j] = slump;
j++;
vinst = true;
}
}
}


if (vinst)
{
Console.WriteLine("Grattis! Ditt nummer har dragits. Vinnande nummer var {0}!",  // vad ska jag skriva här för att få rätt text, istället för det som jag skrivit på nästa rad?  );
for (int i = 0; i < j; i++)
Console.WriteLine(vinnandeTal[i]);
}
else
Console.WriteLine("Tyvärr vann du inte den här gången. Vinnande nummer var {0}.", );


Console.ReadKey();

}


}
}

Teraeagle Online 20215 – Moderator
Postad: 13 nov 2020 11:02

Tips: Använd knappen {;} i verktygsfältet när du infogar kod i inlägget så blir det mer läsligt.

namespace Uppgift_5
{
class Program
{

public static int HämtaGissning()
{
int gissning = 0;
bool tal = false;

while(!tal)
{
Console.Write("Ange ett heltal mellan 1 och 25 ");
tal = int.TryParse(Console.ReadLine(), out gissning);

if (!tal)
Console.WriteLine("Du angav ett ogiltigt svar. Försök igen.");

}

return gissning;
}


static void Main(string[] args)

{
Console.WriteLine(":::::::: BINGOLOTTO :::::::");
Console.WriteLine("|| Välkommen till spelet ||");
Console.WriteLine("Du kommer att få ange 10 stycken tal. Om något/några av talen matchar de dragna talen så har du vunnit!");
Console.WriteLine("LYCKA TILL!");
Console.ReadLine();


int[] myArray = new int[10];
int gissning;

for (int i = 0; i < myArray.Length; i++)
{
bool redanLagrad = false;
gissning = HämtaGissning(); //anropar metod, vilket gör att variabeln gissning tilldelas värden
if (gissning > 0 && gissning < 26)
{
foreach (int gissningsVärde in myArray)
{
if (gissningsVärde == gissning)
{
Console.Write("Du har redan angett detta nummer. Försök igen. ");
i--;
redanLagrad = true;

}
}
if (redanLagrad == false)

myArray[i] = gissning;
}


else
{
Console.WriteLine("Du angav ej ett nummer mellan 1 och 25. Försök igen. ");
i--;
}


}

Random random = new Random();
int[] slumpTal = new int[8]; // skapar vektor för de slumpade talen
int slump;
int[] vinnandeTal = new int[8]; // skapar vektor för de vinnande talen
int j = 0;


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

slump = random.Next(1, 26);

foreach( int slumpVärde in slumpTal)
{
if (slump == slumpVärde)
i--;
else

{
slumpTal[i] = slump;
break;

}


}


}

bool vinst = false;
for (int i = 0; i < slumpTal.Length; i++)
{
slump = slumpTal[i];

foreach (int nummer in myArray)
{
if (slump == nummer)
{

vinnandeTal[j] = slump;
j++;
vinst = true;
}
}
}


if (vinst)
{
Console.WriteLine("Grattis! Ditt nummer har dragits. Vinnande nummer var {0}!",  // vad ska jag skriva här för att få rätt text, istället för det som jag skrivit på nästa rad?  );
for (int i = 0; i < j; i++)
Console.WriteLine(vinnandeTal[i]);
}
else
Console.WriteLine("Tyvärr vann du inte den här gången. Vinnande nummer var {0}.", );


Console.ReadKey();

}


}
}
Laguna 28443
Postad: 13 nov 2020 12:57

Ja, om man indenterar också så blir det mer läsligt.

Yngve 37796 – Livehjälpare
Postad: 13 nov 2020 13:55 Redigerad: 13 nov 2020 13:58

EDIT - läste fel

Aerius 504 – Fd. Medlem
Postad: 13 nov 2020 13:58

Spara dom tal som dragits. Gör en IF-sats som jämför nu dragna talet med dom redan dragna. Om taket redan dragits dra ett nytt tal. 

Svara Avbryt
Close