Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

影響を受けて縦と横が逆になりました
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 yamat0jp 6
53     type
54     TMapData = array [0 .. Wid - 1, 0 .. Hei - 1] of integer;
55 yamat0jp 1 private
56 yamat0jp 6 FStrings: TMapData;
57 yamat0jp 1 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 yamat0jp 2 FAction: Boolean;
76     procedure SetAction(const Value: Boolean);
77 yamat0jp 1 { private ���� }
78     public
79     { public ���� }
80     List: TList;
81 yamat0jp 2 Count: integer;
82 yamat0jp 1 procedure Start;
83     procedure GameOver;
84     procedure GameClear;
85 yamat0jp 2 property Action: Boolean read FAction write SetAction;
86 yamat0jp 1 end;
87    
88     var
89     Form1: TForm1;
90 yamat0jp 4 Map1: TMap;
91     Char1: TChar;
92 yamat0jp 1
93     implementation
94    
95     {$R *.fmx}
96     { TMap }
97    
98     procedure TMap.Clear;
99 yamat0jp 6 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 yamat0jp 1 begin
121 yamat0jp 6 FStrings := AMAP;
122 yamat0jp 1 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 yamat0jp 2 var
136     i, j, k: integer;
137     s: TChar;
138 yamat0jp 1 begin
139 yamat0jp 4 Map1 := TMap.Create;
140     Map1.Clear;
141     ClientWidth := Map1.Size * Map1.Wid;
142     ClientHeight := Map1.Size * Map1.Hei;
143 yamat0jp 1 List := TList.Create;
144 yamat0jp 4 Char1 := TChar.Create;
145 yamat0jp 1 List.Add(TWorry.Create);
146 yamat0jp 2 List.Add(TGhost.Create);
147 yamat0jp 4 for i := 0 to Map1.Wid - 1 do
148     for j := 0 to Map1.Hei - 1 do
149 yamat0jp 2 begin
150 yamat0jp 4 k := Map1[i, j];
151 yamat0jp 5 if k in [3, 4] then
152 yamat0jp 2 begin
153 yamat0jp 5 s := List[k - 3];
154 yamat0jp 2 s.AX := i;
155     s.AY := j;
156     end;
157 yamat0jp 5 if k = 2 then
158     begin
159     Char1.AX := i;
160     Char1.AY := j;
161     end;
162 yamat0jp 2 end;
163 yamat0jp 1 Start;
164     end;
165    
166     procedure TForm1.FormDestroy(Sender: TObject);
167     var
168     i: integer;
169     s: TChar;
170     begin
171 yamat0jp 5 Char1.Free;
172 yamat0jp 4 Map1.Free;
173 yamat0jp 1 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 yamat0jp 4 Char1.Dir := TDir.Left;
187 yamat0jp 1 vkRight:
188 yamat0jp 4 Char1.Dir := Right;
189 yamat0jp 1 vkUp:
190 yamat0jp 4 Char1.Dir := Up;
191 yamat0jp 1 vkDown:
192 yamat0jp 4 Char1.Dir := Down;
193 yamat0jp 1 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 yamat0jp 5 s: TEnemy;
204 yamat0jp 1 procedure detail(X, Y: integer; z: Extended);
205     begin
206 yamat0jp 4 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 yamat0jp 1 end;
211     procedure enemy(X, Y: integer);
212     begin
213 yamat0jp 4 Canvas.FillRect(RectF(X * Map1.Size, Y * Map1.Size, (X + 1) * Map1.Size,
214     (Y + 1) * Map1.Size), 0, 0, [], 1);
215 yamat0jp 1 end;
216    
217     begin
218 yamat0jp 4 for i := 0 to Map1.Wid - 1 do
219     for j := 0 to Map1.Hei - 1 do
220     case Map1[i, j] of
221 yamat0jp 1 0:
222     detail(0, 0, 1);
223     1:
224     detail(2, 1, 0.5);
225     10:
226     detail(2, 1, 1);
227     end;
228 yamat0jp 4 i := Char1.X;
229     j := Char1.Y;
230     case Char1.Dir of
231 yamat0jp 1 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 yamat0jp 5 for i := 0 to List.Count - 1 do
241 yamat0jp 1 begin
242     s := List[i];
243 yamat0jp 5 if s.Visible = true then
244 yamat0jp 2 enemy(s.X, s.Y);
245 yamat0jp 1 end;
246     end;
247    
248     procedure TForm1.GameClear;
249     var
250     i: integer;
251     j: integer;
252     begin
253 yamat0jp 4 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 yamat0jp 1 Exit;
257     Start;
258     end;
259    
260     procedure TForm1.GameOver;
261     var
262     i: integer;
263 yamat0jp 5 s: TEnemy;
264 yamat0jp 1 begin
265 yamat0jp 5 for i := 0 to List.Count - 1 do
266 yamat0jp 1 begin
267     s := List[i];
268 yamat0jp 4 if (Char1.X = s.X) and (Char1.Y = s.Y) then
269 yamat0jp 2 if Action = true then
270 yamat0jp 5 begin
271     s.Visible := false;
272     s.Count := 20;
273     end
274 yamat0jp 2 else
275     begin
276     Start;
277     break;
278     end;
279 yamat0jp 1 end;
280     end;
281    
282 yamat0jp 2 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 yamat0jp 1 procedure TForm1.Start;
295     var
296     i: integer;
297 yamat0jp 5 s: TEnemy;
298 yamat0jp 1 begin
299 yamat0jp 2 Action := false;
300 yamat0jp 4 Map1.Clear;
301 yamat0jp 2 for i := 0 to List.Count - 1 do
302     begin
303     s := List[i];
304     s.Clear;
305 yamat0jp 5 Map1[s.X, s.Y] := 0;
306 yamat0jp 2 end;
307 yamat0jp 5 Char1.Clear;
308     Map1[Char1.X, Char1.Y] := 10;
309 yamat0jp 1 end;
310    
311     procedure TForm1.Timer1Timer(Sender: TObject);
312     var
313     i, p, q: integer;
314 yamat0jp 5 s: TEnemy;
315 yamat0jp 1 begin
316 yamat0jp 5 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 yamat0jp 3 for i := 0 to List.Count - 1 do
324     begin
325 yamat0jp 1 s := List[i];
326 yamat0jp 6 s.Walk
327 yamat0jp 1 end;
328 yamat0jp 2 if Action = true then
329     begin
330     if Count = 0 then
331     Action := false;
332     dec(Count);
333     end;
334 yamat0jp 1 GameOver;
335     PaintTo(Canvas);
336     GameClear;
337     end;
338    
339     { TChar }
340    
341 yamat0jp 2 procedure TChar.Clear;
342 yamat0jp 1 begin
343 yamat0jp 2 X := AX;
344     Y := AY;
345     Dir := Stop;
346     end;
347    
348 yamat0jp 5 procedure TChar.Walk;
349 yamat0jp 4 var
350     p, q: integer;
351 yamat0jp 2 begin
352 yamat0jp 1 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 yamat0jp 4 if Map1[p, q] <> 1 then
365     begin
366     X := p;
367     Y := q;
368     end
369     else
370 yamat0jp 5 Wall;
371 yamat0jp 1 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 yamat0jp 2 procedure TEnemy.Clear;
390     begin
391     inherited;
392     Visible := true;
393     Wall;
394     end;
395    
396 yamat0jp 1 constructor TEnemy.Create;
397     begin
398     inherited;
399     Randomize;
400     Count := Random(5);
401 yamat0jp 2 Visible := true;
402 yamat0jp 1 end;
403    
404 yamat0jp 5 procedure TEnemy.Walk;
405     begin
406 yamat0jp 6 if Visible = false then
407     begin
408     dec(Count);
409     if Count = 0 then
410     Clear;
411     Exit;
412     end;
413 yamat0jp 5 inherited;
414     dec(Count);
415     if Count = 0 then
416 yamat0jp 6 begin
417 yamat0jp 5 Wall;
418 yamat0jp 6 Count := Max;
419     end;
420 yamat0jp 5 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     end;
442    
443 yamat0jp 5 { TWorry }
444    
445     constructor TWorry.Create;
446 yamat0jp 2 begin
447 yamat0jp 5 Max := 5;
448 yamat0jp 1 end;
449    
450 yamat0jp 5 procedure TWorry.Wall;
451 yamat0jp 1 begin
452 yamat0jp 5 if Form1.Action = true then
453     begin
454     inherited;
455     Exit;
456     end;
457 yamat0jp 1 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 yamat0jp 2 constructor TGhost.Create;
473 yamat0jp 1 begin
474     Max := 3;
475     end;
476    
477 yamat0jp 4 procedure TGhost.Wall;
478     var
479     p, q: integer;
480 yamat0jp 1 begin
481 yamat0jp 5 if Form1.Action = true then
482     begin
483     inherited;
484     Exit;
485     end;
486 yamat0jp 4 p := Char1.X;
487     q := Char1.Y;
488 yamat0jp 5 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 yamat0jp 1 end;
505    
506     end.

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