2013-05-19 7 views
5

C#を使用してカードトリックゲームを作成します。私は絵のボックスをフォーム上にカード(裏面)としてデザインしました。また、0から51の間の乱数を作成し、その数値を使ってImageListから画像を設定するピクチャごとに、Clickメソッドを作成しました。C#を使用してカードトリックゲームを設計する際の問題

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

私の問題は、時々私は同じ数字(例:スペードの2ジャックス)を取得することで、私はそれを防ぐことができますどのように、! (例えば、私が(5)を持っていれば、別の(5)が得られるかもしれません)

+1

まだランダムです!カードを一度しか表示できないようにしますか? –

答えて

5

ストアすでにHashSet<int>に選択され、現在nunberが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]; 

それとも、あなたは多くの数字を選択する必要がある場合は、あなたがして、配列を埋めることができます連続した番号と各インデックスの番号を別のランダムなインデックスの番号で入れ替えます。次に、ランダム化された配列から必要な上位N個のアイテムを取得します。

+0

ありがとうございます。コードは私と一緒に働いた。 – John

2

52枚のカードの配列を作成します。配列をシャッフルしてください(たとえば、Fisher-Yates shuffleは高速です)。新しいカードを作成する場合は、繰り返します。

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; 
    } 
} 

実際にあなたがやっていることは、あなたが実際のゲームのようにデッキをシャッフルし、毎回トップカードを取ることです。常にランダムなインデックスを毎回選択する必要はありません。

+1

ああ、申し訳ありませんが、私はそれを誤解しました。私はなぜ彼らが同じ番号を連続して得ていたのだろうと思っていたと思った。 – keyboardP

+1

+1、これはカードゲームの中で最も「好き」です。 – user7116

5

リピート画像がないことを確認したい場合は、残っているカードのリストを表示し、そのカードを毎回削除することができます。

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

私はこれまでに使ったシンプルなトリックを使用すると思います。 2つのランダムなインデックスの間でイメージを50回スワップします。より少ないかより多くはあなたにランダムのより多くの変化を与えるでしょう。これは@ faesterの答えと似ているかもしれません。

+0

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

関連する問題