我想用C#创建一个卡片技巧游戏。我在表单上设计了Picture Boxes作为卡片(背面)。我还为每个创建0到51之间的随机数的图片创建了一个Click方法,并使用该数字从ImageList设置图像。
Random random = new Random();
int i = random.Next(0, 51);
pictureBox1.Image = imageList1.Images[i];
我的问题是,有时我会得到相同的数字(例如:两个黑桃杰克),我该如何防止这种情况?! (我的意思是,例如,如果我得到(5),我可能得到另一个(5))
答案 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的答案类似。