使用C#设计卡片技巧游戏的一个问题

时间:2013-05-19 17:03:58

标签: c#

我想用C#创建一个卡片技巧游戏。我在表单上设计了Picture Boxes作为卡片(背面)。我还为每个创建0到51之间的随机数的图片创建了一个Click方法,并使用该数字从ImageList设置图像。

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

我的问题是,有时我会得到相同的数字(例如:两个黑桃杰克),我该如何防止这种情况?! (我的意思是,例如,如果我得到(5),我可能得到另一个(5))

4 个答案:

答案 0 :(得分: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个需要的项目。

答案 1 :(得分: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);
} 

答案 2 :(得分: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;
    }
}

基本上你正在做的是改变牌组,每次都拿着顶牌,就像在真实的比赛中一样。每次都不需要经常选择随机索引。

答案 3 :(得分:1)

我想你可能会用一个我用过的简单技巧。在2个随机索引之间交换图像50次。少或多会给你更多随机。这可能与@ faester的答案类似。