Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10 - (hide annotations) (download) (as text)
Mon Jul 13 10:29:57 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12200 byte(s)
前回の修正が大きかったのでバグ取りです

依存部分を少し回避しました
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     end;
195     if (Reverse = true) and (result = true) then
196     begin
197 yamat0jp 10 SetStrings(X, Y, Stone);
198 yamat0jp 8 for i := 0 to list.Count - 1 do
199 yamat0jp 1 begin
200 yamat0jp 8 if Visible = true then
201     begin
202     for k := 1 to 10 do
203     begin
204     Sleep(10);
205     Application.ProcessMessages;
206     end;
207     Form1.PaintBox1.Repaint;
208     end;
209     q := list[i];
210 yamat0jp 10 SetStrings(q^.X, q^.Y, Stone);
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 9 if Visible = true then
219     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 3 else
291     FTurnNumber := Value;
292 yamat0jp 10 FActive := false;
293 yamat0jp 3 FStrings := FBuffer[FTurnNumber];
294 yamat0jp 1 end;
295    
296 yamat0jp 9 procedure TStoneGrid.Start;
297     begin
298     Clear;
299     FActive := true;
300     end;
301    
302 yamat0jp 1 { TForm1 }
303    
304     procedure TForm1.ChangePlayer;
305     var
306     i, j, m, n: integer;
307     s: string;
308     procedure Main;
309     begin
310     if Index = Player1 then
311 yamat0jp 4 Index := Player2
312 yamat0jp 3 else
313     Index := Player1;
314 yamat0jp 1 end;
315     function Execute: Boolean;
316     var
317     i, j: integer;
318     begin
319 yamat0jp 3 result := false;
320     for i := 0 to Count - 1 do
321 yamat0jp 1 begin
322 yamat0jp 3 for j := 0 to Count - 1 do
323 yamat0jp 10 if StoneGrid.CanSetStone(Index.Stone, i, j, false) = true then
324 yamat0jp 1 begin
325 yamat0jp 3 result := true;
326     break;
327 yamat0jp 1 end;
328     if result = true then
329 yamat0jp 3 break;
330 yamat0jp 1 end;
331     end;
332 yamat0jp 3
333 yamat0jp 1 begin
334 yamat0jp 3 Main;
335 yamat0jp 1 if Execute = false then
336     begin
337 yamat0jp 3 Main;
338 yamat0jp 1 if Execute = false then
339     begin
340 yamat0jp 9 StoneGrid.Pause;
341 yamat0jp 3 Timer1.Enabled := false;
342     m := 0;
343     n := 0;
344     for i := 0 to Count - 1 do
345     for j := 0 to Count - 1 do
346     case StoneGrid[i, j] of
347     stBlack:
348     inc(m);
349     stWhite:
350     inc(n);
351 yamat0jp 1 end;
352     if m > n then
353 yamat0jp 4 s := 'Player1 Win:' + #13#10
354 yamat0jp 3 else if m < n then
355 yamat0jp 4 s := 'Player2 Win:' + #13#10
356 yamat0jp 3 else
357     s := 'Draw:' + #13#10;
358 yamat0jp 7 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
359     IntToStr(n));
360 yamat0jp 1 end;
361     end;
362     end;
363    
364     procedure TForm1.CompStone;
365     var
366     s: TPoint;
367     begin
368 yamat0jp 10 s := StoneGrid.NextStone(Index.Stone);
369     StoneGrid.CanSetStone(Index.Stone, s.X, s.Y, true, true);
370 yamat0jp 5 PaintBox1.Repaint;
371 yamat0jp 7 ChangePlayer;
372 yamat0jp 1 end;
373    
374     procedure TForm1.GameStart;
375     begin
376 yamat0jp 9 StoneGrid.Start;
377 yamat0jp 5 PaintBox1.Repaint;
378 yamat0jp 3 Index := Player1;
379     Timer1.Enabled := true;
380 yamat0jp 1 end;
381    
382 yamat0jp 7 procedure TForm1.MenuItem10Click(Sender: TObject);
383     begin
384 yamat0jp 9 StoneGrid.Restart;
385 yamat0jp 7 Timer1.Enabled := true;
386     end;
387    
388     procedure TForm1.MenuItem11Click(Sender: TObject);
389     begin
390 yamat0jp 10 Timer1.Enabled := false;
391 yamat0jp 7 with StoneGrid do
392     if Sender = MenuItem11 then
393     TurnNumber := TurnNumber + 1
394     else
395     TurnNumber := TurnNumber - 1;
396     PaintBox1.Repaint;
397     end;
398    
399 yamat0jp 5 procedure TForm1.MenuItem2Click(Sender: TObject);
400 yamat0jp 1 begin
401 yamat0jp 3 GameStart;
402 yamat0jp 1 end;
403    
404 yamat0jp 5 procedure TForm1.MenuItem4Click(Sender: TObject);
405 yamat0jp 1 begin
406 yamat0jp 5 Close;
407 yamat0jp 1 end;
408    
409 yamat0jp 5 procedure TForm1.MenuItem6Click(Sender: TObject);
410     begin
411 yamat0jp 7 Player1.Auto := MenuItem6.IsChecked;
412     Player2.Auto := MenuItem7.IsChecked;
413 yamat0jp 10 MenuItem10Click(Sender);
414 yamat0jp 5 end;
415    
416 yamat0jp 7 procedure TForm1.MenuItem8Click(Sender: TObject);
417     begin
418 yamat0jp 9 StoneGrid.Pause;
419     Timer1.Enabled := false;
420 yamat0jp 7 end;
421    
422 yamat0jp 5 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
423 yamat0jp 1 var
424     i, j: integer;
425     begin
426 yamat0jp 5 Canvas.Fill.Color := TAlphaColors.White;
427     Canvas.FillRect(RectF(0, 0, Count * Size, Count * Size), 0, 0, [], 1);
428     for i := 0 to Count do
429 yamat0jp 1 begin
430 yamat0jp 5 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
431     for j := 0 to Count do
432 yamat0jp 1 begin
433 yamat0jp 5 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
434 yamat0jp 3 case StoneGrid.Strings[i, j] of
435     stWhite:
436 yamat0jp 7 Canvas.DrawEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
437     (j + 1) * Size), 1);
438 yamat0jp 3 stBlack:
439     begin
440 yamat0jp 5 Canvas.Fill.Color := TAlphaColors.Black;
441     Canvas.FillEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
442     (j + 1) * Size), 1);
443 yamat0jp 3 end;
444 yamat0jp 1 end;
445     end;
446     end;
447     end;
448    
449 yamat0jp 7 procedure TForm1.PaintBox1Resize(Sender: TObject);
450     begin
451     Size := Min(ClientWidth, ClientHeight) div Count;
452     end;
453    
454 yamat0jp 5 procedure TForm1.FormCreate(Sender: TObject);
455 yamat0jp 1 begin
456 yamat0jp 5 StoneGrid := TStoneGrid.Create;
457     Player1 := TPlayer.Create;
458     Player2 := TPlayer.Create;
459     Player1.Stone := stBlack;
460     Player2.Stone := stWhite;
461     Player2.Auto := true;
462     with PaintBox1.Canvas do
463 yamat0jp 1 begin
464 yamat0jp 5 StrokeDash := TStrokeDash.Solid;
465     Stroke.Color := TAlphaColors.Black;
466     StrokeThickness := 3;
467 yamat0jp 1 end;
468 yamat0jp 7 PaintBox1Resize(Sender);
469 yamat0jp 5 GameStart;
470 yamat0jp 1 end;
471    
472 yamat0jp 5 procedure TForm1.FormDestroy(Sender: TObject);
473     begin
474     StoneGrid.Free;
475     Player1.Free;
476     Player2.Free;
477     end;
478    
479 yamat0jp 7 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
480 yamat0jp 5 Shift: TShiftState; X, Y: Single);
481     begin
482 yamat0jp 7 PaintBox1Tap(Sender, PointF(X, Y));
483 yamat0jp 5 end;
484    
485 yamat0jp 1 procedure TForm1.Timer1Timer(Sender: TObject);
486     begin
487 yamat0jp 10 if (StoneGrid.Active = true) and (Index.Auto = true) then
488 yamat0jp 1 begin
489 yamat0jp 3 Timer1.Enabled := false;
490     CompStone;
491     Timer1.Enabled := true;
492 yamat0jp 1 end;
493     end;
494    
495     procedure TForm1.FormResize(Sender: TObject);
496     begin
497 yamat0jp 3 Size := Min(ClientWidth, ClientHeight) div Count;
498 yamat0jp 5 PaintTo(Canvas);
499 yamat0jp 1 end;
500    
501 yamat0jp 7 procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF);
502 yamat0jp 1 begin
503 yamat0jp 10 if (Player1.Auto = false)or(Player2.Auto = false) then
504     MenuItem10Click(Sender);
505     if (StoneGrid.Active = true) and (Index.Auto = false) then
506 yamat0jp 5 begin
507 yamat0jp 10 if StoneGrid.CanSetStone(Index.Stone, Floor(Point.X / Size),
508 yamat0jp 7 Floor(Point.Y / Size), true, true) = true then
509 yamat0jp 5 begin
510     PaintBox1.Repaint;
511 yamat0jp 7 ChangePlayer;
512 yamat0jp 5 end;
513     end;
514 yamat0jp 1 end;
515    
516     end.

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