- •Часть 1
- •Implementation
- •Implementation
- •Implementation
- •Часть 1
- •Implementation
- •Implementation
- •Implementation
- •IBplementation
- •Implementation
- •Часть 1
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Interface
- •Часть 1
- •Interface
- •Часть 1 I. 104
- •Implementation
- •Implementation
- •Implementation
- •Часть I
- •Р ис. 1.46. Окно программы Звуки Windows
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Interface
- •Часть 1
- •168 Част
- •Implementation
- •Часть 1
- •Interface uses
- •Implementation
- •Interface
- •Implementation
- •Часть 1
- •Часть 1 I Примеры и задачи
- •Часть 1 I Примеры и задачи
- •Implementation
- •205 Часть
- •Interface
- •Implementation
- •216 Часть 1
- •Поле т ип Размер Информация
- •Часть 1
- •Implementation
- •Interface
- •Implementation
- •Implementation
- •Часть 2 Таблица 2.2 (окончание)
- •252 Часть 2
- •Часть 2 I Delphi — краткий справочник
- •Часть 2
Implementation
{$R *.dfm}
const
H = 4; W = 4; // размер поля — 4x4
CH => 64; CW = 64; // размер клеток - 16x16
// правильное расположение фишек stp : array[l..H, 1..W] of byte = (( 1, 2, 3, 4),
( 5, 6, 7, 8),
( 9,10,11,12),
(13,14,15, 0));
// игровое поле
pole: array[l..H, 1..W] of byte;
ex,ey: integer; // координаты пустой клетки
// новая игра procedure NewGame; var
i,j: integer; begin
// исходное (правильное) положение
for i:=0 to H+l do
for j:=0 to W+l do
polefi, j] := stp[i, j] ;
Forml.Mixer; // перемешать фишки
Forml.ShowPole; // отобразить поле end;
// проверяет, расположены ли // фишки в нужном порядке function Finish: boolean; var
row,col: integer;
i: integer; begin
row :=1; col :=1;
Finish := True; // пусть фишки в нужном порядке
for i:=l to 15 do begin
if pole[row,col] <> i then begin
Finish:= False; break; end;
// к следующей клетке if col < 4
then inc(col) else begin col :=1; inc(row); end; end; end;
// "переменяет" фишку в соседнюю пустую клетку,
// если она есть, конечно
procedure Move(ex,су: integer);
// сх,су — клетка, в которой игрок сделал щелчок
var
г: integer; // выбор игрока begin
// проверим, возможен ли обмен
if not (( abs(cx-ex) = 1) and (cy-ey = 0) or ( abs(cy-ey) = 1) and (cx-ex = 0))
then exit;
// Обмен. Переместим фишку из х,у в ех,еу
Pole[ey,ex] := Pole[су,сх];
Pole[су,сх] := 0;
ех:=сх;
еу:=су;
// отрисовать поле
Forml.ShowPole;
if Finish then
begin
r := MessageDlg('Цель достигнута!'+ #13+
'Еше раз?',mtlnformation,[mbYes,mbNo], 0); if г = mrNo then Forml.Close; // завершить работу программы
end;
end;
154
Час;
Примеры i/i задачи
155
// щелчок в клетке
procedure TForml.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var
cx,cy: integer; // координаты клетки begin
// преобразуем координаты мыши в координаты клетки сх := Trunc(X / CW) + 1; су :«■ Trunc(Y / СН) + 1; Move(сх,су) ; end;
// выводит игровое поле procedure TForml.ShowPole; var
i,j: integer;
x,y: integer; // x,y - координаты вывода
// текста в клетке begin
// сетка: вертикальные линии for i:= I to W- 1 do begin
Canvas.MoveTo(i*CW,0);
Canvas.LineTo(i*CW,ClientHeight); end;
// сетка: горизонтальные линии
for i:= 1 toH-1 do
begin
Canvas.MoveTo(0,i*CH);
Canvas.LineTo(ClientWidth,i*CH); end;
// содержимое клеток
// x,y — координаты вывода текста
for i:= 1 to H do
begin
y:=(i-l)*CH + 15;
for j:=1 to W do
begin
x:= (j-l)*CW + 15;
case Pole[i,j] of
0: Canvas.TextOut(x,y, ' '); 1..9: Canvas.TextOut(x,y, ' ' +
IntToStr(Pole[i,j])+' ');
10..15: Canvas.TextOut(x,y,IntToStr(Pole[i,j])) , end; end; end;
end;
// "перемешивает" фишки procedure TForml.Mixer; var
xl,yl: integer; // пустая клетка x2,y2: integer; // эту переместить в пустую d: integer; // направление, относительно пустой i: integer; begin
xl:=4;
yl:=4i
randomize;
for i:= 1 to 150 do
begin
repeat
x2:=xl;
y2:=yl;
d:=random(4)+1;
case d of
1: 4dec(x2) ; 2: inc(x2); 3: dec(y2); 4: inc(y2); end;
until (x2>=l) and (x2<=4) and (y2>=l) and (y2<=4), // здесь определили фишку, которую // надо переместить в пустую клетку Pole[yl,xl] := Ро1е[у2,х2]; Ро1е[у2,х2] := 0; xl:=x2; yl:=y2; end;
156
Примеры и задачи
157
// запомним координаты пустой клетки ех: = xl; еу:= yl; end;
// обработка события OnCreate
procedure TForml.FormCreate(Sender: TObject)
begin
ClientWidth := CW * W;
ClientHeight := CH * H;
Canvas.Font.Name := 'Times New Roman1;
Canvas.Font.Size : = 22;
NewGame; end;
// обработка события OnPaint
procedure TForml.FormPaint(Sender: TObject);
begin
Forml.ShowPole; end;
end.
Рис.
1.59. Окно программы Собери картинку
Игра "Собери картинку" — игра "15" с графическим интерфейсом (вместо цифр — фрагменты картинки) . Картинка загружается из файла pic_l.bmp, который находится в том же каталоге что и выполняемый файл программы, (с) Культин Н.Б., 2003.
)
unit soberi_;
