Задать вопрос
@D0ct0r_Murder

Алгоритм расстановки позиций чисел в игре «пятнашки» — выводит -1. В чём ошибка?

в startGameButton_Click выводится все -1. Я до сих пор не заметил в чём ошибка.
Как определить,придумал ли рандом одинаковое число,по-другому не знаю,как,кроме перебора. Почему он выходит из цикла. Он должен перебрать его,пока рандом не выдаст число,отличное от тех чисел,что уже были.

private void startGameButton_Click(object sender, EventArgs e)
        {
            int[] t_numbers;
            MessageBox.Show("Game started...");
            GetRandomLocate(out t_numbers);

            string str = "";

            foreach (var t in t_numbers)
                str += t.ToString() + " ";

            MessageBox.Show(str);
        }
private void GetRandomLocate(out int[] t_numbers)
        {
            Random random = new Random();
            bool flag = true;

            t_numbers = new int[Logic.size];

            for (int i = 0; i < Logic.size; i++)
                t_numbers[i] = -1;

            for(int i = 0;i<Logic.size;i++)
            {
                while(flag)
                {
                    int rnd = random.Next(0, Logic.size + 1);
                    int ind = 0;

                    foreach (var t in t_numbers)
                        if (t == rnd)
                            ind = 1;

                    if (ind == 0)
                    {
                        t_numbers[i] = rnd;
                        flag = !flag;
                    }

                    else
                        flag = true;
                }
            }
        }
  • Вопрос задан
  • 369 просмотров
Подписаться 1 Простой Комментировать
Ответ пользователя Павел К ответам на вопрос (3)
@youkerni
Unity3D developer
Способ которым ты контролируешь уникальность цифр на кнопке далеко не оптимальный. Представь сколько итераций потребуется для того, что бы срандомить число 24 если у тебя уже есть числа от 0 до 23 (для поля 5x5); Шанс 1/25, а значит в среднем будет уходить 25 итераций. Это не много, но не оптимально.

Что я предлагаю: создать List, засунуть туда n чисел (от 0 до n). И дальше использовать следующий код:

t_numbers = new int[Logic.size];
List<int> numbers = new List<int>();
int randomIndex = -1;

 for (int i = 0; i < Logic.size; i++)
                numbers.Add(i);
int i = 0;
do
{
  randomIndex = random.Next(0, numbers.Count);
   t_numbers[i++] = numbers[randomIndex];
   numbers.RemoveAt(randomIndex);
} while(numbers.Count > 0);


Не уверен что написал все верно, т.к. пишу код прямо тут. Но суть ты должен был уловить.
Ответ написан