
22.12.2010, 17:06
|
 |
Прохожий
|
|
Регистрация: 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.
|