Показать сообщение отдельно
  #7  
Старый 23.04.2009, 21:28
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Заполнять массив "по умному". Не пытаться генерить номер картинки, а генерить ее положение. Допустим у нас есть массив 6х6. Сначала заполняем его нулями, картинки при этом нумеруются с 1. Теперь берем и генерируем расположение картинки в массиве. Если место уже занято (в соотв. ячейке не 0), то просто сдвигаем по кругу. далее еще раз повторяем этот алгоритм для парной картинки. Далее переходим к картинке номер 2. Для примера - на одномерном массиве (на свой перепишешь сам) для массива из 4х элементов и 2х рактинок (т.е. всего картинок будет 4):
Код:
var
  A : Array [1..4] Of Integer;

procedure Generate;

  procedure GenPlace(No : Integer);
  var
    N, I : Integer;
  begin
     N := Random(4) + 1; // от 1 до 4;
     If A[N] = 0 
       Then A[N] := No  // место пустое
       Else // место уже занято - начинаем сдвигать, пока не найдем пустое
         Begin
            I := N + 1;
           While I <= 4 Do
              Begin
                If A[i] = 0 
                  Then A[i] := No  // место пустое
                  Else
                    Begin
                      Inc(I);
                      If I > 4 Then I := 1;
                    End;
              End;
         End;
  end;

var
  I : Integer;
begin
  // сначала очищаем массив
  For I := 1 To 4 Do A[i] := 0;

  // Теперь поехали генерить места картинок. 
  // Внешний цикл - картинки. У нас их 2.
  For I := 1 To 2 Do
    Begin
       GenPlace(I); // первая из пары
       GenPlace(I); // вторая
    End;
end;

Как-то так. Код можно оптимизировать, то так более понятен алгоритм.
Ответить с цитированием