2013-05-19 13 views
5

Chcę utworzyć grę w karty z użyciem C#. Zaprojektowałem Picture Boxe na formularzu jako karty (odwrotne). Stworzyłem również metodę Click dla każdego zdjęcia, które tworzy losową liczbę z zakresu od 0 do 51 i użyj tego numeru, aby ustawić obraz z elementu ImageList.Problem w projektowaniu sztuczki karcianej przy użyciu C#

 Random random = new Random(); 
     int i = random.Next(0, 51); 
     pictureBox1.Image = imageList1.Images[i]; 

Moim problemem jest to, że czasami mam te same numery (Przykład: dwa gniazda pik), w jaki sposób można zapobiec ?! (Mam na myśli to, że na przykład dostałem (5), mogę otrzymać kolejną (5))

+1

To wciąż losowe! Czy chcesz, aby karta była wyświetlana tylko raz? –

Odpowiedz

5

przechowywać numery zostały już wybrane w HashSet<int> i kontynuować wybieranie aż prąd nunber nie jest w HashSet:

// private HashSet<int> seen = new HashSet<int>(); 
// private Random random = new Random(); 

if (seen.Count == imageList1.Images.Count) 
{ 
    // no cards left... 
} 

int card = random.Next(0, imageList1.Images.Count); 
while (!seen.Add(card)) 
{ 
    card = random.Next(0, imageList1.Images.Count); 
} 

pictureBox1.Image = imageList1.Images[card]; 

lub, jeśli trzeba wybrać wiele numerów, można wypełnić tablicę z numery sekwencyjne i zamień liczbę w każdym indeksie na liczbę z innego losowego indeksu. Następnie weź N najbardziej potrzebnych elementów z losowej tablicy.

+0

dziękuję bardzo. Kod pracował ze mną. – John

2

Utwórz tablicę 52 kart. Przetasuj tablicę (na przykład za pomocą szybko działającego Fisher-Yates shuffle), a następnie wykonaj iterację, gdy chcesz nową kartę.

int[] cards = new int[52]; 

//fill the array with values from 0 to 51 
for(int i = 0; i < cards.Length; i++) 
{ 
    cards[i] = i; 
} 

int currentCard = 0; 

Shuffle(cards); 

//your cards are now randomised. You can iterate over them incrementally, 
//no need for a random select 
pictureBox1.Image = imageList1.Images[currentCard]; 
currentCard++; 


public static void Shuffle<T>(T[] array) 
{ 
    var random = _random; 
    for (int i = array.Length; i > 1; i--) 
    { 
     // Pick random element to swap. 
     int j = random.Next(i); // 0 <= j <= i-1 
     // Swap. 
     T tmp = array[j]; 
     array[j] = array[i - 1]; 
     array[i - 1] = tmp; 
    } 
} 

Zasadniczo co robisz jest tasowanie talii i po prostu biorąc wierzchnią kartę za każdym razem, jak chcesz w prawdziwej grze. Nie ma potrzeby ciągłego wybierania losowego indeksu za każdym razem.

+1

Ach, przepraszam, źle to przeczytałem. Myślałem, że zastanawiają się, dlaczego otrzymywali tę samą liczbę z rzędu. – keyboardP

+1

+1, jest to najbardziej "lubiana" gra karciana. – user7116

5

Jeśli chcesz się upewnić, że nie masz powtórnych zdjęć, możesz mieć listę pozostałych kart i za każdym razem wyjmować pokazaną kartę.

Random random = new Random();  
List<int> remainingCards = new List<int>(); 

public void SetUp() 
{ 
    for(int i = 0; i < 52; i++) 
     remainingCards.Add(i); 
} 

public void SetRandomImage() 
{ 
    int i = random.Next(0, remainingCards.Count); 
    pictureBox1.Image = imageList1.Images[remainingCards[i]]; 
    remainingCards.RemoveAt(i); 
} 
1

Myślę, że możesz użyć prostej sztuczki, z której kiedykolwiek korzystałem. Zamień obrazy między 2 losowymi indeksami na 50 razy. mniej lub więcej da ci więcej różnych losowości. Może to być podobne z odpowiedzią @ faestera.

+0

??????????????? –

Powiązane problemy