2013-11-21 117 views
0

我想隨機化我擁有的4張圖像的順序。我正在爲C#Windows Phone應用程序做旗幟猜謎遊戲,它的工作非常好,但正確的答案始終是標記4,所以如果任何人有任何關於如何改變圖像順序的建議。圖像框的隨機順序

+2

當前訂單如何確定?我看不到任何代碼。 – FrankPl

+0
+0

@ user3010392 - 您需要一種不同的方法。不要將「標誌」的佈局硬編碼到XAML中。製作「標誌」對象的列表,然後「綁定」到XAML中的列表視圖(或類似)。然後,您可以使用以下答案中詳述的任何技術來訂購您的清單。請注意,如果您使用的不是Observable集合的列表,您需要先訂購它。 –

回答

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

那麼你可以使用它爲你的標誌,假設你有一個叫旗類,像這個:

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

請注意System.Random是一個低質量的隨機數發生器。如果你需要它們,你可以插入更好的。在選擇索引時還要注意while循環 - 這是爲了處理從隨機數生成器獲得1.0值的非常罕見的情況,但仍然保持其他所有值的概率相等。

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

由於這個代碼是通用的,你絕對可以將它用於圖像陣列。