2013-11-21 1 views
0

Я пытаюсь рандомизировать порядок из 4 изображений, которые у меня есть. Я делаю игру с гангом флага для C# Windows Phone App, ее работа очень хорошая, но правильным ответом всегда является флаг 4, поэтому, если у кого-то есть какие-то советы о том, как я могу изменить порядок изображений.Случайный порядок ящиков изображений

+2

Как заказ определен в настоящее время? Я не вижу кода. – FrankPl

+0

<Изображение x: Name = "Flag1" Grid.Row = "0" Grid.Column = "0" HorizontalAlignment = "Center" VerticalAlignment = "Top" Tap = "Flag1_Tap" /> <Изображение x: Name = "Flag2 "Grid.Row =" 1 "Grid.Column =" 0 "HorizontalAlignment =" Center "VerticalAlignment =" Center "Tap =" Flag2_Tap "/> <Изображение x: Name =" Flag3 "Grid.Row =" 0 "Сетка .Column = "1" HorizontalAlignment = "Center" VerticalAlignment = "Top" Margin = "7,1,3,0" Tap = "Flag3_Tap" /> <Изображение x: Name = "Flag4" Grid.Row = "1 «Grid.Column =« 1 »HorizontalAlignment =« Center »VerticalAlignment =« Center »Margin =« 1,1,0,0 »Tap =« Flag4_Tap »/> – user3010392

+0

@ user3010392 - вам нужен другой подход. Не жуйте код макета «Флаги» в XAML. Составьте список объектов «флаг», а затем «привязать» к списку (или подобному) в XAML. Затем вы можете использовать любой из методов, описанных в ответах ниже, чтобы заказать свой список. Обратите внимание: если вы используете список, который не является коллекцией Observable, вам необходимо сначала его заказать. –

ответ

0

Вы можете использовать Linq. Скажем, у вас есть список объектов «Флаг», что-то вроде этого сделает то, что вы хотите?

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. Вот хороший и простой C# реализация от DotNetPerls:

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

Поскольку этот код является универсальным, вы определенно можете использовать его для массива изображений.