Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (hide annotations) (download) (as text)
Wed Oct 7 13:11:07 2015 UTC (8 years, 6 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 10421 byte(s)
TEnemyにキャストしてはいけないところを訂正

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

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