4 svar
38 visningar
Vetten 3
Postad: 13 nov 2020

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();

}


}
}

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 11626
Postad: 13 nov 2020

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

Yngve 18407 – Volontär digitala räknestugor
Postad: 13 nov 2020 Redigerad: 13 nov 2020

EDIT - läste fel

Aerius 471
Postad: 13 nov 2020

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