图像框的随机顺序

时间:2013-11-21 18:55:21

标签: c# windows-phone-7.1

我正在尝试将我拥有的4张图片的顺序随机化。我正在为C#Windows Phone App做一个旗帜猜测游戏,它的工作非常好,但正确的答案总是标志4,所以如果有人对如何改变图像的顺序有任何建议。

3 个答案:

答案 0 :(得分:0)

你可以使用Linq。假设你有一个“Flag”对象列表,这样的东西会做你想要的吗?

class Program
    {
        static Random Random = new Random();

        static void Main(string[] args)
        {
            List<Flag> flags = new List<Flag>()
                                   {
                                       new Flag() {Name = "A"},
                                       new Flag() {Name = "B"},
                                       new Flag() {Name = "C"},
                                       new Flag() {Name = "D"}
                                   };

            Console.WriteLine(String.Join(",", flags.Select(f => f.Name)));

            IEnumerable<Flag> randomlyOrdered = flags.OrderBy(f => Random.Next());
            List<Flag> newListInDifferentOrder = new List<Flag>(randomlyOrdered);

            Console.WriteLine(String.Join(",", newListInDifferentOrder.Select(f=>f.Name)));
        }

        private class Flag
        {
            public String Name { get; set; }
        }
    }

答案 1 :(得分:0)

您可以实现这样的方法,从列表中随机选择任何类型的项目:

private System.Random random = new System.Random();
public T GetRandomItem<T>(IList<T> candidates)
{
    int index = candidates.Count;
    while (index >= candidates.Count)
        index = (int)(random.NextDouble() * (double)candidates.Count);
    return candidates[index];
}

然后你会把它用作你的旗帜,假设你有一个名为Flag的类,就像这样:

List<Flag> possibleFlags; // <-- You populated this somewhere in your app
Flag randomFlag = GetRandomItem<Flag>(possibleFlags);

请注意,System.Random是一个低质量的随机数生成器。如果需要,你可以插入更好的。在选择索引时还要注意while循环 - 这是为了处理从随机数生成器获取值1.0的非常罕见的情况,但仍然保持所有其他值的概率相等。

答案 2 :(得分:0)

使用shuffling algorithm。这是来自DotNetPerls的简洁C#实现:

using System;

class Program
{
    /// <summary>
    /// Used in Shuffle(T).
    /// </summary>
    static Random _random = new Random();

    /// <summary>
    /// Shuffle the array.
    /// </summary>
    /// <typeparam name="T">Array element type.</typeparam>
    /// <param name="array">Array to shuffle.</param>
    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;
    }
    }

由于此代码是通用的,因此您绝对可以将其用于图像数组。