Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #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.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025