6 System.SysUtils, System.Types, System.UITypes, System.Classes,
8 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects;
17 TMapData = array [0 .. Wid - 1, 0 .. Hei - 1] of integer;
19 TDir = (Left, Right, Up, Down);
23 TBeem = class(TObject)
30 property X: integer read FX write FX;
31 property Y: integer read FY write FY;
32 property Speed: integer read FSpeed write FSpeed;
41 property Dir: TDirs read FDir write FDir;
53 FFlightData: TMapData;
55 function HardSearch: Boolean;
57 property AX: integer read FAX write FAX;
58 property AY: integer read FAY write FAY;
59 property Index: integer read FIndex write FIndex;
60 property Pattern: integer read FPattern write FPattern;
68 property Speed: integer read FSpeed write FSpeed;
69 property Visible: Boolean read FVisible write FVisible;
82 procedure PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
83 procedure FormCreate(Sender: TObject);
84 procedure FormDestroy(Sender: TObject);
85 procedure Timer1Timer(Sender: TObject);
86 procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
88 procedure FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
100 function CheckCross: Boolean;
107 Param: TAtack = (Interval: 0; Count: 5);
114 procedure TEnemy.Buffer;
116 AData: array [0 .. Kind - 1] of TMapData = ((
118 (0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
119 (0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0),
120 (0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0),
121 (0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0),
122 (0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0),
123 (0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0),
124 (0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0),
125 (0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0),
126 (0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0),
127 (0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0),
128 (0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0),
129 (0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0),
130 (0, 0, 0, 0, 0, 0, 0, 0, 15, 14, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0),
131 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
132 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
133 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
134 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
135 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
136 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
137 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), (
139 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
140 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
141 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
142 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
143 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
144 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
145 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
146 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
147 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
148 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
149 (1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18),
150 (0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0),
151 (0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 0, 0, 0, 0),
152 (0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0),
153 (0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
154 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
155 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
156 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
157 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
158 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), (
160 (0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
161 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
162 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
163 (0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0),
164 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
165 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
166 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
167 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
168 (0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
169 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
170 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
171 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
172 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
173 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0, 0, 0, 0),
174 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
175 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
176 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
177 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
178 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
179 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
186 for i := 0 to Wid - 1 do
187 for j := 0 to Hei - 1 do
188 FFlightData[i, j] := AData[Pattern][j, i];
191 procedure TEnemy.Clear;
195 if Kind = Pattern then
199 if HardSearch = true then
209 constructor TEnemy.Create;
216 function TForm1.CheckCross: Boolean;
222 for i := List.Count - 1 downto 0 do
225 if (Char1.X < s.X + Size) and (Char1.X + Size > s.X) and
226 (Char1.Y < s.Y + Size) and (Char1.Y + Size > s.Y) then
234 for i := Atack.Count - 1 downto 0 do
237 for j := List.Count - 1 downto 0 do
240 if (t.X < s.X + Size) and (t.X + Size > s.X) and (t.Y < s.Y + Size) and
241 (t.Y + Size > s.Y) then
253 procedure TForm1.FormCreate(Sender: TObject);
255 Char1 := TChar.Create;
256 List := TList.Create;
257 Atack := TList.Create;
258 ClientWidth := Wid * Size;
259 ClientHeight := Hei * Size;
264 procedure TForm1.FormDestroy(Sender: TObject);
270 for i := 0 to List.Count - 1 do
275 for i := 0 to Atack.Count - 1 do
283 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
290 Char1.Dir := Char1.Dir + [TDir.Left];
292 Char1.Dir := Char1.Dir + [Right];
294 Char1.Dir := Char1.Dir + [Up];
296 Char1.Dir := Char1.Dir + [Down];
300 procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
307 Char1.Dir := Char1.Dir - [TDir.Left];
309 Char1.Dir := Char1.Dir - [Right];
311 Char1.Dir := Char1.Dir - [Up];
313 Char1.Dir := Char1.Dir - [Down];
317 procedure TForm1.GameOver;
321 Timer1.Enabled := false;
324 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
330 Canvas.DrawBitmap(Image1.Bitmap, RectF(0, 0, Image1.Bitmap.Width,
331 Image1.Bitmap.Height), RectF(0, -Image1.Bitmap.Height + Hei * Size + Length,
332 Image1.Bitmap.Width, Hei * Size + Length), 1);
333 for i := 0 to List.Count - 1 do
336 if s.Visible = true then
337 Canvas.DrawBitmap(Image2.Bitmap, RectF(Size, 0, 2 * Size, Size),
338 RectF(s.X, s.Y, s.X + Size, s.Y + Size), 1);
340 for i := 0 to Atack.Count - 1 do
343 Canvas.DrawBitmap(Image2.Bitmap, RectF(2 * Size, 0, 3 * Size, Size),
344 RectF(t.X, t.Y, t.X + Size, t.Y + Size), 1);
346 Canvas.DrawBitmap(Image2.Bitmap, RectF(0, 0, Size, Size),
347 RectF(Char1.X, Char1.Y, Char1.X + Size, Char1.Y + Size), 1);
350 procedure TForm1.Timer1Timer(Sender: TObject);
358 if Length <= Image1.Bitmap.Height - Hei * Size then
361 if Length >= Enemy then
363 if List.Count = 0 then
365 List.Add(TEnemy.Create);
367 for i := 0 to List.Count - 1 do
370 if s.Visible = true then
380 for i := 0 to List.Count - 1 do
383 if s.Visible = true then
385 if s.X > s.AX * Size then
387 else if s.X < s.AX * Size then
388 s.X := s.X + s.Speed;
389 if s.Y > s.AY * Size then
391 else if s.Y < s.AY * Size then
392 s.Y := s.Y + s.Speed;
393 if (s.X = s.AX * Size) and (s.Y = s.AY * Size) then
399 else if X = true then
405 if TDir.Left in Char1.Dir then
406 Char1.X := Char1.X - 1;
407 if Right in Char1.Dir then
408 Char1.X := Char1.X + 1;
409 if Up in Char1.Dir then
410 Char1.Y := Char1.Y - 1;
411 if Down in Char1.Dir then
412 Char1.Y := Char1.Y + 1;
413 for i := Atack.Count - 1 downto 0 do
416 t.Y := t.Y - t.Speed;
417 if (t.Y + Size) < 0 then
424 if (Param.Interval = 0) and (Atack.Count < Param.Count) then
426 Atack.Add(TBeem.Create);
427 Param.Interval := 10;
429 if Param.Interval > 0 then
432 if CheckCross = true then
436 function TEnemy.HardSearch: Boolean;
442 for i := 0 to Wid - 1 do
443 for j := 0 to Hei - 1 do
444 if FFlightData[i, j] = Index then
453 procedure TEnemy.Search;
456 if FFlightData[AX - 1, AY - 1] = Index then
461 else if FFlightData[AX, AY - 1] = Index then
463 else if FFlightData[AX - 1, AY] = Index then
465 else if FFlightData[AX + 1, AY] = Index then
467 else if FFlightData[AX - 1, AY + 1] = Index then
472 else if FFlightData[AX, AY + 1] = Index then
474 else if FFlightData[AX + 1, AY + 1] = Index then
482 if HardSearch = false then
489 procedure TChar.Clear;
491 X := Wid * Size div 2;
492 Y := (Hei - 1) * Size;
495 constructor TChar.Create;
502 constructor TBeem.Create;
505 FY := Char1.Y - Size;