Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (hide annotations) (download) (as text)
Tue Jul 14 00:24:36 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12164 byte(s)
盤の外をクリックした場合にFTurnNumberが実態から離れる問題を訂正しました

一連のエラーは確認してみますが終わってくれそうです

インデントの微調整をしました
1 yamat0jp 5 unit Unit1;
2 yamat0jp 1
3     interface
4    
5     uses
6 yamat0jp 5 System.SysUtils, System.Types, System.UITypes, System.Classes,
7     System.Variants,
8     FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Menus,
9     System.Math, FMX.Objects, FMX.StdCtrls;
10 yamat0jp 1
11     const
12     Count = 8;
13    
14     type
15     TStoneType = (stNone, stWhite, stBlack, stError);
16    
17 yamat0jp 3 TGridData = array [0 .. Count - 1] of array [0 .. Count - 1] of TStoneType;
18 yamat0jp 1
19     TPlayer = class
20     private
21     FAuto: Boolean;
22 yamat0jp 4 FStone: TStoneType;
23 yamat0jp 1 public
24     property Auto: Boolean read FAuto write FAuto;
25 yamat0jp 4 property Stone: TStoneType read FStone write FStone;
26 yamat0jp 1 end;
27    
28     TStoneGrid = class
29     private
30     FStrings: TGridData;
31 yamat0jp 7 FBuffer: array [0 .. Count * Count - 4] of TGridData;
32 yamat0jp 1 FTurnNumber: integer;
33     FTurnIndex: integer;
34 yamat0jp 9 FActive: Boolean;
35 yamat0jp 1 function GetStrings(X, Y: integer): TStoneType;
36     procedure SetStrings(X, Y: integer; const Value: TStoneType);
37     procedure SetTurnNumber(const Value: integer);
38     public
39     procedure Clear;
40 yamat0jp 10 function CalScore(Stone: TStoneType; X, Y: integer): integer;
41     function CanSetStone(Stone: TStoneType; X, Y: integer; Reverse: Boolean;
42 yamat0jp 7 const Visible: Boolean = false): Boolean;
43 yamat0jp 10 function NextStone(Stone: TStoneType): TPoint;
44 yamat0jp 9 procedure Start;
45     procedure Restart;
46     procedure Pause;
47 yamat0jp 3 property Strings[X, Y: integer]: TStoneType read GetStrings
48     write SetStrings; default;
49 yamat0jp 1 property TurnNumber: integer read FTurnNumber write SetTurnNumber;
50 yamat0jp 10 property Active: Boolean read FActive;
51 yamat0jp 1 end;
52    
53     TForm1 = class(TForm)
54     Timer1: TTimer;
55     MainMenu1: TMainMenu;
56 yamat0jp 5 MenuItem1: TMenuItem;
57     MenuItem2: TMenuItem;
58     MenuItem3: TMenuItem;
59     MenuItem4: TMenuItem;
60     MenuItem5: TMenuItem;
61     MenuItem6: TMenuItem;
62     MenuItem7: TMenuItem;
63     PaintBox1: TPaintBox;
64 yamat0jp 7 MenuItem8: TMenuItem;
65     MenuItem9: TMenuItem;
66     MenuItem10: TMenuItem;
67     MenuItem11: TMenuItem;
68     MenuItem12: TMenuItem;
69 yamat0jp 1 procedure FormCreate(Sender: TObject);
70     procedure FormDestroy(Sender: TObject);
71     procedure Timer1Timer(Sender: TObject);
72     procedure FormResize(Sender: TObject);
73 yamat0jp 5 procedure MenuItem4Click(Sender: TObject);
74     procedure MenuItem2Click(Sender: TObject);
75 yamat0jp 7 procedure PaintBox1Tap(Sender: TObject; const Point: TPointF);
76     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
77 yamat0jp 5 Shift: TShiftState; X, Y: Single);
78     procedure PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
79     procedure MenuItem6Click(Sender: TObject);
80 yamat0jp 7 procedure PaintBox1Resize(Sender: TObject);
81     procedure MenuItem8Click(Sender: TObject);
82     procedure MenuItem10Click(Sender: TObject);
83     procedure MenuItem11Click(Sender: TObject);
84 yamat0jp 1 private
85 yamat0jp 5 { Private ���� }
86 yamat0jp 1 StoneGrid: TStoneGrid;
87     Index: TPlayer;
88     Size: integer;
89     procedure CompStone;
90     procedure GameStart;
91     procedure ChangePlayer;
92     public
93 yamat0jp 5 { Public ���� }
94 yamat0jp 1 end;
95    
96     var
97     Player1: TPlayer;
98     Player2: TPlayer;
99    
100     Form1: TForm1;
101    
102     implementation
103    
104 yamat0jp 5 {$R *.fmx}
105 yamat0jp 7 {$R *.Windows.fmx MSWINDOWS}
106 yamat0jp 1 { TStoneGrid }
107    
108 yamat0jp 10 function TStoneGrid.CalScore(Stone: TStoneType; X, Y: integer): integer;
109 yamat0jp 1 var
110     i, j: integer;
111     begin
112 yamat0jp 10 if CanSetStone(Stone, X, Y, true) = true then
113 yamat0jp 1 begin
114 yamat0jp 10 if Stone = stBlack then
115     Stone := stWhite
116 yamat0jp 3 else
117 yamat0jp 10 Stone := stBlack;
118 yamat0jp 3 result := 0;
119     for i := 0 to Count - 1 do
120     for j := 0 to Count - 1 do
121 yamat0jp 10 if CanSetStone(Stone, i, j, false) = true then
122 yamat0jp 3 inc(result);
123 yamat0jp 9 FStrings := FBuffer[FTurnIndex];
124 yamat0jp 3 end
125     else
126 yamat0jp 1 begin
127 yamat0jp 9 FStrings := FBuffer[FTurnIndex];
128 yamat0jp 3 result := -1;
129 yamat0jp 1 end;
130     end;
131    
132 yamat0jp 10 function TStoneGrid.CanSetStone(Stone: TStoneType; X, Y: integer;
133 yamat0jp 7 Reverse: Boolean; const Visible: Boolean): Boolean;
134 yamat0jp 1 var
135 yamat0jp 8 i, k: integer;
136 yamat0jp 4 p: Boolean;
137 yamat0jp 7 q: ^TPoint;
138     list: TList;
139 yamat0jp 4 procedure Method(m, n: integer);
140 yamat0jp 3 var
141 yamat0jp 4 s: TStoneType;
142 yamat0jp 3 j: integer;
143 yamat0jp 1 begin
144 yamat0jp 4 if p = false then
145     Exit;
146     i := 1;
147 yamat0jp 3 while true do
148 yamat0jp 4 begin
149     s := GetStrings(X + m * i, Y + n * i);
150     if (s = stNone) or (s = stError) then
151     break
152 yamat0jp 10 else if s = Stone then
153 yamat0jp 4 if i > 1 then
154     begin
155     result := true;
156     if Reverse = true then
157 yamat0jp 1 begin
158 yamat0jp 4 for j := 1 to i - 1 do
159 yamat0jp 7 begin
160     New(q);
161     q^ := Point(X + m * j, Y + n * j);
162     list.Add(q);
163     end;
164 yamat0jp 4 break;
165 yamat0jp 3 end
166     else
167 yamat0jp 1 begin
168 yamat0jp 4 p := false;
169 yamat0jp 3 break;
170 yamat0jp 4 end;
171     end
172     else
173     break
174 yamat0jp 3 else
175 yamat0jp 4 inc(i);
176     end;
177 yamat0jp 3 end;
178    
179     begin
180 yamat0jp 7 list := TList.Create;
181 yamat0jp 8 try
182     result := false;
183     p := true;
184     if GetStrings(X, Y) = stNone then
185 yamat0jp 3 begin
186 yamat0jp 8 Method(-1, -1);
187     Method(-1, 0);
188     Method(-1, 1);
189     Method(0, -1);
190     Method(0, 1);
191     Method(1, -1);
192     Method(1, 0);
193     Method(1, 1);
194 yamat0jp 13 if (Reverse = true) and (result = true) then
195 yamat0jp 1 begin
196 yamat0jp 13 SetStrings(X, Y, Stone);
197     for i := 0 to list.Count - 1 do
198 yamat0jp 8 begin
199 yamat0jp 13 if Visible = true then
200 yamat0jp 8 begin
201 yamat0jp 13 for k := 1 to 10 do
202     begin
203     Sleep(10);
204     Application.ProcessMessages;
205     end;
206     Form1.PaintBox1.Repaint;
207 yamat0jp 8 end;
208 yamat0jp 13 q := list[i];
209     SetStrings(q^.X, q^.Y, Stone);
210 yamat0jp 8 end;
211 yamat0jp 1 end;
212     end;
213 yamat0jp 8 finally
214     for i := 0 to list.Count - 1 do
215     Dispose(list[i]);
216     list.Free;
217 yamat0jp 1 end;
218 yamat0jp 13 if (Visible = true)and(result = true) then
219 yamat0jp 9 begin
220     inc(FTurnIndex);
221     inc(FTurnNumber);
222 yamat0jp 10 FBuffer[FTurnIndex] := FStrings;
223 yamat0jp 9 end;
224 yamat0jp 1 end;
225    
226     procedure TStoneGrid.Clear;
227     var
228     i, j: integer;
229     begin
230 yamat0jp 3 for i := 0 to Count - 1 do
231     for j := 0 to Count - 1 do
232     Strings[i, j] := stNone;
233     Strings[3, 3] := stBlack;
234     Strings[4, 4] := stBlack;
235     Strings[4, 3] := stWhite;
236     Strings[3, 4] := stWhite;
237 yamat0jp 7 FTurnNumber := 0;
238     FTurnIndex := 0;
239 yamat0jp 10 FBuffer[0] := FStrings;
240 yamat0jp 1 end;
241    
242     function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
243     begin
244 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
245 yamat0jp 4 result := FStrings[X, Y]
246 yamat0jp 3 else
247     result := stError;
248 yamat0jp 1 end;
249    
250 yamat0jp 10 function TStoneGrid.NextStone(Stone: TStoneType): TPoint;
251 yamat0jp 1 var
252     i, j, m, n: integer;
253     begin
254 yamat0jp 3 n := -1;
255     for i := 0 to Count - 1 do
256     for j := 0 to Count - 1 do
257 yamat0jp 1 begin
258 yamat0jp 10 m := CalScore(Stone, i, j);
259 yamat0jp 3 if (n = -1) or ((m > -1) and (n > m)) then
260 yamat0jp 1 begin
261 yamat0jp 3 n := m;
262     result := Point(i, j);
263 yamat0jp 1 end;
264     end;
265     if n = -1 then
266 yamat0jp 3 result := Point(-1, -1);
267 yamat0jp 1 end;
268    
269 yamat0jp 9 procedure TStoneGrid.Pause;
270     begin
271 yamat0jp 10 FActive := false;
272 yamat0jp 9 end;
273    
274     procedure TStoneGrid.Restart;
275     begin
276 yamat0jp 10 FActive := true;
277     FTurnIndex := FTurnNumber;
278 yamat0jp 9 end;
279    
280 yamat0jp 1 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
281     begin
282 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
283     FStrings[X, Y] := Value;
284 yamat0jp 1 end;
285    
286     procedure TStoneGrid.SetTurnNumber(const Value: integer);
287     begin
288     if Value > FTurnIndex then
289 yamat0jp 4 FTurnNumber := FTurnIndex
290 yamat0jp 12 else if Value < 0 then
291     FTurnNumber := 0
292 yamat0jp 3 else
293     FTurnNumber := Value;
294 yamat0jp 10 FActive := false;
295 yamat0jp 3 FStrings := FBuffer[FTurnNumber];
296 yamat0jp 1 end;
297    
298 yamat0jp 9 procedure TStoneGrid.Start;
299     begin
300     Clear;
301     FActive := true;
302     end;
303    
304 yamat0jp 1 { TForm1 }
305    
306     procedure TForm1.ChangePlayer;
307     var
308     i, j, m, n: integer;
309     s: string;
310     procedure Main;
311     begin
312     if Index = Player1 then
313 yamat0jp 4 Index := Player2
314 yamat0jp 3 else
315     Index := Player1;
316 yamat0jp 1 end;
317     function Execute: Boolean;
318     var
319     i, j: integer;
320     begin
321 yamat0jp 3 result := false;
322     for i := 0 to Count - 1 do
323     for j := 0 to Count - 1 do
324 yamat0jp 10 if StoneGrid.CanSetStone(Index.Stone, i, j, false) = true then
325 yamat0jp 1 begin
326 yamat0jp 3 result := true;
327 yamat0jp 12 Exit;
328 yamat0jp 1 end;
329     end;
330 yamat0jp 3
331 yamat0jp 1 begin
332 yamat0jp 3 Main;
333 yamat0jp 1 if Execute = false then
334     begin
335 yamat0jp 3 Main;
336 yamat0jp 1 if Execute = false then
337     begin
338 yamat0jp 9 StoneGrid.Pause;
339 yamat0jp 3 Timer1.Enabled := false;
340     m := 0;
341     n := 0;
342     for i := 0 to Count - 1 do
343     for j := 0 to Count - 1 do
344     case StoneGrid[i, j] of
345     stBlack:
346     inc(m);
347     stWhite:
348     inc(n);
349 yamat0jp 1 end;
350     if m > n then
351 yamat0jp 4 s := 'Player1 Win:' + #13#10
352 yamat0jp 3 else if m < n then
353 yamat0jp 4 s := 'Player2 Win:' + #13#10
354 yamat0jp 3 else
355     s := 'Draw:' + #13#10;
356 yamat0jp 7 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
357     IntToStr(n));
358 yamat0jp 1 end;
359     end;
360     end;
361    
362     procedure TForm1.CompStone;
363     var
364     s: TPoint;
365     begin
366 yamat0jp 10 s := StoneGrid.NextStone(Index.Stone);
367     StoneGrid.CanSetStone(Index.Stone, s.X, s.Y, true, true);
368 yamat0jp 5 PaintBox1.Repaint;
369 yamat0jp 7 ChangePlayer;
370 yamat0jp 1 end;
371    
372     procedure TForm1.GameStart;
373     begin
374 yamat0jp 9 StoneGrid.Start;
375 yamat0jp 5 PaintBox1.Repaint;
376 yamat0jp 3 Index := Player1;
377     Timer1.Enabled := true;
378 yamat0jp 1 end;
379    
380 yamat0jp 7 procedure TForm1.MenuItem10Click(Sender: TObject);
381     begin
382 yamat0jp 9 StoneGrid.Restart;
383 yamat0jp 7 Timer1.Enabled := true;
384     end;
385    
386     procedure TForm1.MenuItem11Click(Sender: TObject);
387     begin
388 yamat0jp 10 Timer1.Enabled := false;
389 yamat0jp 7 with StoneGrid do
390     if Sender = MenuItem11 then
391     TurnNumber := TurnNumber + 1
392     else
393     TurnNumber := TurnNumber - 1;
394 yamat0jp 12 ChangePlayer;
395 yamat0jp 7 PaintBox1.Repaint;
396     end;
397    
398 yamat0jp 5 procedure TForm1.MenuItem2Click(Sender: TObject);
399 yamat0jp 1 begin
400 yamat0jp 3 GameStart;
401 yamat0jp 1 end;
402    
403 yamat0jp 5 procedure TForm1.MenuItem4Click(Sender: TObject);
404 yamat0jp 1 begin
405 yamat0jp 5 Close;
406 yamat0jp 1 end;
407    
408 yamat0jp 5 procedure TForm1.MenuItem6Click(Sender: TObject);
409     begin
410 yamat0jp 7 Player1.Auto := MenuItem6.IsChecked;
411     Player2.Auto := MenuItem7.IsChecked;
412 yamat0jp 10 MenuItem10Click(Sender);
413 yamat0jp 5 end;
414    
415 yamat0jp 7 procedure TForm1.MenuItem8Click(Sender: TObject);
416     begin
417 yamat0jp 9 StoneGrid.Pause;
418     Timer1.Enabled := false;
419 yamat0jp 7 end;
420    
421 yamat0jp 5 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
422 yamat0jp 1 var
423     i, j: integer;
424     begin
425 yamat0jp 5 Canvas.Fill.Color := TAlphaColors.White;
426     Canvas.FillRect(RectF(0, 0, Count * Size, Count * Size), 0, 0, [], 1);
427     for i := 0 to Count do
428 yamat0jp 1 begin
429 yamat0jp 5 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
430     for j := 0 to Count do
431 yamat0jp 1 begin
432 yamat0jp 5 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
433 yamat0jp 3 case StoneGrid.Strings[i, j] of
434     stWhite:
435 yamat0jp 7 Canvas.DrawEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
436     (j + 1) * Size), 1);
437 yamat0jp 3 stBlack:
438     begin
439 yamat0jp 5 Canvas.Fill.Color := TAlphaColors.Black;
440     Canvas.FillEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
441     (j + 1) * Size), 1);
442 yamat0jp 3 end;
443 yamat0jp 1 end;
444     end;
445     end;
446     end;
447    
448 yamat0jp 7 procedure TForm1.PaintBox1Resize(Sender: TObject);
449     begin
450     Size := Min(ClientWidth, ClientHeight) div Count;
451     end;
452    
453 yamat0jp 5 procedure TForm1.FormCreate(Sender: TObject);
454 yamat0jp 1 begin
455 yamat0jp 5 StoneGrid := TStoneGrid.Create;
456     Player1 := TPlayer.Create;
457     Player2 := TPlayer.Create;
458     Player1.Stone := stBlack;
459     Player2.Stone := stWhite;
460     Player2.Auto := true;
461     with PaintBox1.Canvas do
462 yamat0jp 1 begin
463 yamat0jp 5 StrokeDash := TStrokeDash.Solid;
464     Stroke.Color := TAlphaColors.Black;
465     StrokeThickness := 3;
466 yamat0jp 1 end;
467 yamat0jp 7 PaintBox1Resize(Sender);
468 yamat0jp 5 GameStart;
469 yamat0jp 1 end;
470    
471 yamat0jp 5 procedure TForm1.FormDestroy(Sender: TObject);
472     begin
473     StoneGrid.Free;
474     Player1.Free;
475     Player2.Free;
476     end;
477    
478 yamat0jp 7 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
479 yamat0jp 5 Shift: TShiftState; X, Y: Single);
480     begin
481 yamat0jp 7 PaintBox1Tap(Sender, PointF(X, Y));
482 yamat0jp 5 end;
483    
484 yamat0jp 1 procedure TForm1.Timer1Timer(Sender: TObject);
485     begin
486 yamat0jp 10 if (StoneGrid.Active = true) and (Index.Auto = true) then
487 yamat0jp 1 begin
488 yamat0jp 3 Timer1.Enabled := false;
489     CompStone;
490     Timer1.Enabled := true;
491 yamat0jp 1 end;
492     end;
493    
494     procedure TForm1.FormResize(Sender: TObject);
495     begin
496 yamat0jp 3 Size := Min(ClientWidth, ClientHeight) div Count;
497 yamat0jp 5 PaintTo(Canvas);
498 yamat0jp 1 end;
499    
500 yamat0jp 7 procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF);
501 yamat0jp 1 begin
502 yamat0jp 11 if Index.Auto = false then
503     begin
504 yamat0jp 10 MenuItem10Click(Sender);
505     if StoneGrid.CanSetStone(Index.Stone, Floor(Point.X / Size),
506 yamat0jp 7 Floor(Point.Y / Size), true, true) = true then
507 yamat0jp 5 begin
508     PaintBox1.Repaint;
509 yamat0jp 7 ChangePlayer;
510 yamat0jp 5 end;
511     end;
512 yamat0jp 1 end;
513    
514     end.

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