Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (show annotations) (download) (as text)
Fri Oct 9 09:51:15 2015 UTC (8 years, 5 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 10077 byte(s)
マップセッティングをconstで書き直しました

影響を受けて縦と横が逆になりました
1 unit Unit1;
2
3 interface
4
5 uses
6 System.SysUtils, System.Types, System.UITypes, System.Classes,
7 System.Variants,
8 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects;
9
10 type
11 TDir = (Left, Right, Up, Down, Stop);
12
13 TChar = class(TObject)
14 public
15 Index: integer;
16 Dir: TDir;
17 X, Y: integer;
18 AX, AY: integer;
19 procedure Walk; virtual;
20 procedure Wall; virtual;
21 procedure Clear; virtual;
22 end;
23
24 TEnemy = class(TChar)
25 public
26 Count: integer;
27 Max: integer;
28 Visible: Boolean;
29 constructor Create;
30 procedure Walk; override;
31 procedure Clear; override;
32 procedure Wall; override;
33 end;
34
35 TWorry = class(TEnemy)
36 public
37 constructor Create;
38 procedure Wall; override;
39 end;
40
41 TGhost = class(TEnemy)
42 public
43 constructor Create;
44 procedure Wall; override;
45 end;
46
47 TMap = class(TObject)
48 const
49 Wid = 20;
50 Hei = 20;
51 Size = 32;
52
53 type
54 TMapData = array [0 .. Wid - 1, 0 .. Hei - 1] of integer;
55 private
56 FStrings: TMapData;
57 function GetStrings(X, Y: integer): integer;
58 procedure SetStrings(X, Y: integer; const Value: integer);
59 public
60 procedure Clear;
61 property Strings[X, Y: integer]: integer read GetStrings
62 write SetStrings; default;
63 end;
64
65 TForm1 = class(TForm)
66 Image1: TImage;
67 Timer1: TTimer;
68 procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
69 procedure FormCreate(Sender: TObject);
70 procedure FormDestroy(Sender: TObject);
71 procedure Timer1Timer(Sender: TObject);
72 procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
73 Shift: TShiftState);
74 private
75 FAction: Boolean;
76 procedure SetAction(const Value: Boolean);
77 { private ���� }
78 public
79 { public ���� }
80 List: TList;
81 Count: integer;
82 procedure Start;
83 procedure GameOver;
84 procedure GameClear;
85 property Action: Boolean read FAction write SetAction;
86 end;
87
88 var
89 Form1: TForm1;
90 Map1: TMap;
91 Char1: TChar;
92
93 implementation
94
95 {$R *.fmx}
96 { TMap }
97
98 procedure TMap.Clear;
99 const
100 AMAP: TMapData = ((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
101 1), (1, 9, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1),
102 (1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1),
103 (1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1),
104 (1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1),
105 (1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 9, 1, 1, 0, 1, 0, 0, 0, 1, 1),
106 (1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1),
107 (1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1),
108 (1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1),
109 (1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1),
110 (1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1),
111 (1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1),
112 (1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1),
113 (1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1),
114 (1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1),
115 (1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1),
116 (1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1),
117 (1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1),
118 (1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
119 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1));
120 begin
121 FStrings := AMAP;
122 end;
123
124 function TMap.GetStrings(X, Y: integer): integer;
125 begin
126 result := FStrings[X, Y];
127 end;
128
129 procedure TMap.SetStrings(X, Y: integer; const Value: integer);
130 begin
131 FStrings[X, Y] := Value;
132 end;
133
134 procedure TForm1.FormCreate(Sender: TObject);
135 var
136 i, j, k: integer;
137 s: TChar;
138 begin
139 Map1 := TMap.Create;
140 Map1.Clear;
141 ClientWidth := Map1.Size * Map1.Wid;
142 ClientHeight := Map1.Size * Map1.Hei;
143 List := TList.Create;
144 Char1 := TChar.Create;
145 List.Add(TWorry.Create);
146 List.Add(TGhost.Create);
147 for i := 0 to Map1.Wid - 1 do
148 for j := 0 to Map1.Hei - 1 do
149 begin
150 k := Map1[i, j];
151 if k in [3, 4] then
152 begin
153 s := List[k - 3];
154 s.AX := i;
155 s.AY := j;
156 end;
157 if k = 2 then
158 begin
159 Char1.AX := i;
160 Char1.AY := j;
161 end;
162 end;
163 Start;
164 end;
165
166 procedure TForm1.FormDestroy(Sender: TObject);
167 var
168 i: integer;
169 s: TChar;
170 begin
171 Char1.Free;
172 Map1.Free;
173 for i := 0 to List.Count - 1 do
174 begin
175 s := List[i];
176 s.Free;
177 end;
178 List.Free;
179 end;
180
181 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
182 Shift: TShiftState);
183 begin
184 case Key of
185 vkLeft:
186 Char1.Dir := TDir.Left;
187 vkRight:
188 Char1.Dir := Right;
189 vkUp:
190 Char1.Dir := Up;
191 vkDown:
192 Char1.Dir := Down;
193 vkEscape:
194 Start;
195 end;
196 end;
197
198 procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
199 const ARect: TRectF);
200 var
201 i: integer;
202 j: integer;
203 s: TEnemy;
204 procedure detail(X, Y: integer; z: Extended);
205 begin
206 Canvas.DrawBitMap(Image1.BitMap, RectF(X * Map1.Size, Y * Map1.Size,
207 (X + 1) * Map1.Size, (Y + 1) * Map1.Size),
208 RectF(i * Map1.Size, j * Map1.Size, (i + 1) * Map1.Size,
209 (j + 1) * Map1.Size), z);
210 end;
211 procedure enemy(X, Y: integer);
212 begin
213 Canvas.FillRect(RectF(X * Map1.Size, Y * Map1.Size, (X + 1) * Map1.Size,
214 (Y + 1) * Map1.Size), 0, 0, [], 1);
215 end;
216
217 begin
218 for i := 0 to Map1.Wid - 1 do
219 for j := 0 to Map1.Hei - 1 do
220 case Map1[i, j] of
221 0:
222 detail(0, 0, 1);
223 1:
224 detail(2, 1, 0.5);
225 10:
226 detail(2, 1, 1);
227 end;
228 i := Char1.X;
229 j := Char1.Y;
230 case Char1.Dir of
231 TDir.Left, Stop:
232 detail(0, 1, 1);
233 Right:
234 detail(1, 0, 1);
235 Up:
236 detail(1, 1, 1);
237 Down:
238 detail(2, 0, 1);
239 end;
240 for i := 0 to List.Count - 1 do
241 begin
242 s := List[i];
243 if s.Visible = true then
244 enemy(s.X, s.Y);
245 end;
246 end;
247
248 procedure TForm1.GameClear;
249 var
250 i: integer;
251 j: integer;
252 begin
253 for i := 0 to Map1.Wid - 1 do
254 for j := 0 to Map1.Hei - 1 do
255 if Map1[i, j] = 0 then
256 Exit;
257 Start;
258 end;
259
260 procedure TForm1.GameOver;
261 var
262 i: integer;
263 s: TEnemy;
264 begin
265 for i := 0 to List.Count - 1 do
266 begin
267 s := List[i];
268 if (Char1.X = s.X) and (Char1.Y = s.Y) then
269 if Action = true then
270 begin
271 s.Visible := false;
272 s.Count := 20;
273 end
274 else
275 begin
276 Start;
277 break;
278 end;
279 end;
280 end;
281
282 procedure TForm1.SetAction(const Value: Boolean);
283 begin
284 if Value = true then
285 begin
286 Count := 100;
287 Canvas.Fill.Color := TAlphaColors.Blue;
288 end
289 else
290 Canvas.Fill.Color := TAlphaColors.Purple;
291 FAction := Value;
292 end;
293
294 procedure TForm1.Start;
295 var
296 i: integer;
297 s: TEnemy;
298 begin
299 Action := false;
300 Map1.Clear;
301 for i := 0 to List.Count - 1 do
302 begin
303 s := List[i];
304 s.Clear;
305 Map1[s.X, s.Y] := 0;
306 end;
307 Char1.Clear;
308 Map1[Char1.X, Char1.Y] := 10;
309 end;
310
311 procedure TForm1.Timer1Timer(Sender: TObject);
312 var
313 i, p, q: integer;
314 s: TEnemy;
315 begin
316 Char1.Walk;
317 p := Char1.X;
318 q := Char1.Y;
319 if Map1[p, q] = 9 then
320 Action := true;
321 Map1[p, q] := 10;
322 GameOver;
323 for i := 0 to List.Count - 1 do
324 begin
325 s := List[i];
326 s.Walk
327 end;
328 if Action = true then
329 begin
330 if Count = 0 then
331 Action := false;
332 dec(Count);
333 end;
334 GameOver;
335 PaintTo(Canvas);
336 GameClear;
337 end;
338
339 { TChar }
340
341 procedure TChar.Clear;
342 begin
343 X := AX;
344 Y := AY;
345 Dir := Stop;
346 end;
347
348 procedure TChar.Walk;
349 var
350 p, q: integer;
351 begin
352 p := X;
353 q := Y;
354 case Dir of
355 TDir.Left:
356 p := X - 1;
357 Right:
358 p := X + 1;
359 Up:
360 q := Y - 1;
361 Down:
362 q := Y + 1;
363 end;
364 if Map1[p, q] <> 1 then
365 begin
366 X := p;
367 Y := q;
368 end
369 else
370 Wall;
371 end;
372
373 procedure TChar.Wall;
374 begin
375 case Dir of
376 TDir.Left:
377 Dir := Right;
378 Right:
379 Dir := TDir.Left;
380 Up:
381 Dir := Down;
382 Down:
383 Dir := Up;
384 end;
385 end;
386
387 { TEnemy }
388
389 procedure TEnemy.Clear;
390 begin
391 inherited;
392 Visible := true;
393 Wall;
394 end;
395
396 constructor TEnemy.Create;
397 begin
398 inherited;
399 Randomize;
400 Count := Random(5);
401 Visible := true;
402 end;
403
404 procedure TEnemy.Walk;
405 begin
406 if Visible = false then
407 begin
408 dec(Count);
409 if Count = 0 then
410 Clear;
411 Exit;
412 end;
413 inherited;
414 dec(Count);
415 if Count = 0 then
416 begin
417 Wall;
418 Count := Max;
419 end;
420 end;
421
422 procedure TEnemy.Wall;
423 var
424 p, q: integer;
425 begin
426 p := Char1.X;
427 q := Char1.Y;
428 Randomize;
429 case Random(2) of
430 0:
431 if (p <= X) and (Map1[X + 1, Y] <> 1) then
432 Dir := Right
433 else
434 Dir := TDir.Left;
435 1:
436 if (q <= Y) and (Map1[X, Y + 1] <> 1) then
437 Dir := Down
438 else
439 Dir := Up;
440 end;
441 end;
442
443 { TWorry }
444
445 constructor TWorry.Create;
446 begin
447 Max := 5;
448 end;
449
450 procedure TWorry.Wall;
451 begin
452 if Form1.Action = true then
453 begin
454 inherited;
455 Exit;
456 end;
457 Randomize;
458 case Random(4) of
459 0:
460 Dir := TDir.Left;
461 1:
462 Dir := Right;
463 2:
464 Dir := Up;
465 3:
466 Dir := Down;
467 end;
468 end;
469
470 { TGhost }
471
472 constructor TGhost.Create;
473 begin
474 Max := 3;
475 end;
476
477 procedure TGhost.Wall;
478 var
479 p, q: integer;
480 begin
481 if Form1.Action = true then
482 begin
483 inherited;
484 Exit;
485 end;
486 p := Char1.X;
487 q := Char1.Y;
488 if p > X then
489 begin
490 if Map1[p + 1, q] <> 1 then
491 Dir := Right
492 else if q > Y then
493 Dir := Down
494 else if q < Y then
495 Dir := Up;
496 end
497 else if p < X then
498 if Map1[p - 1, q] <> 1 then
499 Dir := TDir.Left
500 else if q > Y then
501 Dir := Down
502 else if q < Y then
503 Dir := Up;
504 end;
505
506 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26