Показать сообщение отдельно
  #1  
Старый 22.12.2010, 17:06
Аватар для virgin34
virgin34 virgin34 вне форума
Прохожий
 
Регистрация: 24.04.2010
Сообщения: 7
Репутация: 10
Сообщение Помощь в расшифровке кода (120 строк)

Задали задание - написать программу "пятнашки". Нашел готовое - не знаю некоторых строк кода. Помогите разобраться в нем
Код:
var MainForm: TMainForm;

implementation

{$R *.dfm}

type
  TTagArray = array [1..16] of Byte;

var
  Dibs: TTagArray;
  Direction: 0..4;
  Number,N: 1..16;
  Xo,Yo,X,Y: Integer;

function RandomArray: TTagArray;
var
  i,j,X: 1..16;
  Single: Boolean;
begin
  Randomize;
  for i:=1 to 16 do begin
    repeat
      X:=Random(16)+1; // генерирует случайное число от 1 до 16
      Single:=True; for j:=1 to i-1 do Single:=(Single)and(X<>Result[j]); // проверка единственности числа X
    until Single;
    Result[i]:=X;
  end;
end;

procedure DrawArray(Sender: TForm; TagArray: TTagArray);
var i: 1..16;
begin
  for i:=1 to 16 do begin
    if TagArray[i]=16 then Continue; // если элемент массива 16, то переходим в следующию итерацию
    with TButton(Sender.Components[TagArray[i]]) do begin Left:=((i-1) mod 4)*75+2; Top:=((i-1) div 4)*75+2; end;
  end;
end;

procedure TMainForm.StartBtnClick(Sender: TObject);
begin
  Dibs:=RandomArray;
  DrawArray(MainForm,Dibs);
end;

procedure TMainForm.Move(Sender: TObject);
var i: 1..16;
begin
  Timer.Enabled:=True; // включение таймера
  case Direction of  // исходя из направления движения
   1: dec(X,15); // уменьшаем X на 15
   2: inc(X,15); // увеличиваем X на 15
   3: dec(Y,15); // уменьшаем Y на 15
   4: inc(Y,15); // увеличиваем Y на 15
  end;
  with TButton(Components[Number]) do begin Left:=Xo+X; Top:=Yo+Y; end; // перемещаем компонент
  if (abs(X)=75)or(abs(Y)=75) then begin // когда пройдено 75 шагов
    Timer.Enabled:=False; // выключаем таймер
    X:=0; Y:=0;
    case Direction of // перестановка чисел в массиве
     1: begin Dibs[N-1]:=Dibs[N]; Dibs[N]:=16; end;
     2: begin Dibs[N+1]:=Dibs[N]; Dibs[N]:=16; end;
     3: begin Dibs[N-4]:=Dibs[N]; Dibs[N]:=16; end;
     4: begin Dibs[N+4]:=Dibs[N]; Dibs[N]:=16; end;
    end;
    for i:=1 to 16 do if Dibs[i]<>i then Break; // определяем, расставлены ли кнопки по порядку от 1 до 15
    if i=17 then ShowMessage('Вы выиграли!'); // и если да, то Ok!
  end;
end;

procedure TMainForm.ButtonClick(Sender: TObject);
var i: 1..16;
begin
  Number:=(Sender as TButton).ComponentIndex; // Number — номер нажатой кнопки
  for i:=1 to 16 do if Dibs[i]=Number then N:=i; // определение ее позиции в массиве
  // определение направления движения
  Direction:=0;
  if (N>1 )and(N<>5)and(N<>9)and(N<>13)and(Dibs[N-1]=16) then Direction:=1; // влево
  if (N<16)and(N<>4)and(N<>8)and(N<>12)and(Dibs[N+1]=16) then Direction:=2; // вправо
  if                           (N-4> 0)and(Dibs[N-4]=16) then Direction:=3; // вверх
  if                           (N+4<17)and(Dibs[N+4]=16) then Direction:=4; // вниз
  if Direction=0 then Exit; // если вокруг кнопки пустой позиции нет — выход
  Xo:=(Sender as TButton).Left; Yo:=(Sender as TButton).Top; X:=0; Y:=0;
  MainForm.Move(Sender); // вызов процедуры перемещения кнопки
end;

procedure TMainForm.EndBtnClick(Sender: TObject);
begin Close end;

end.
Ответить с цитированием