5

我想用 C# 创建一个纸牌把戏游戏。我在表格上设计了图片框作为卡片(背面)。我还为每张图片创建了一个 Click 方法,该方法创建一个介于 0 和 51 之间的随机数,并使用该数字从 ImageList 中设置图像。

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

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

4

4 回答 4

5

将您已经选择的号码存储在 a 中HashSet<int>并继续选择,直到当前号码不在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 个需要的项目。

于 2013-05-19T17:09:41.783 回答
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);
} 
于 2013-05-19T17:10:28.363 回答
2

创建一个包含 52 张卡片的数组。对数组进行洗牌(例如,使用快速的Fisher-Yates 洗牌),然后在需要新卡时进行迭代。

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

本质上,你所做的就是洗牌,每次只拿最上面的牌,就像在真正的游戏中一样。无需每次都不断地选择随机索引。

于 2013-05-19T17:06:19.363 回答
1

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

于 2013-05-19T17:12:39.207 回答