Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (hide annotations) (download) (as text)
Mon Jul 13 00:01:54 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12446 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     function GetStrings(X, Y: integer): TStoneType;
35     procedure SetStrings(X, Y: integer; const Value: TStoneType);
36     procedure SetTurnNumber(const Value: integer);
37     public
38     procedure Clear;
39     procedure BackUp;
40     function CalScore(Player: TPlayer; X, Y: integer): integer;
41 yamat0jp 7 function CanSetStone(Player: TPlayer; X, Y: integer; Reverse: Boolean;
42     const Visible: Boolean = false): Boolean;
43 yamat0jp 1 function NextStone(Player: TPlayer): TPoint;
44 yamat0jp 3 property Strings[X, Y: integer]: TStoneType read GetStrings
45     write SetStrings; default;
46 yamat0jp 1 property TurnNumber: integer read FTurnNumber write SetTurnNumber;
47 yamat0jp 7 property TurnIndex: integer read FTurnIndex write FTurnIndex;
48 yamat0jp 1 end;
49    
50     TForm1 = class(TForm)
51     Timer1: TTimer;
52     MainMenu1: TMainMenu;
53 yamat0jp 5 MenuItem1: TMenuItem;
54     MenuItem2: TMenuItem;
55     MenuItem3: TMenuItem;
56     MenuItem4: TMenuItem;
57     MenuItem5: TMenuItem;
58     MenuItem6: TMenuItem;
59     MenuItem7: TMenuItem;
60     PaintBox1: TPaintBox;
61 yamat0jp 7 MenuItem8: TMenuItem;
62     MenuItem9: TMenuItem;
63     MenuItem10: TMenuItem;
64     MenuItem11: TMenuItem;
65     MenuItem12: TMenuItem;
66 yamat0jp 1 procedure FormCreate(Sender: TObject);
67     procedure FormDestroy(Sender: TObject);
68     procedure Timer1Timer(Sender: TObject);
69     procedure FormResize(Sender: TObject);
70 yamat0jp 5 procedure MenuItem4Click(Sender: TObject);
71     procedure MenuItem2Click(Sender: TObject);
72 yamat0jp 7 procedure PaintBox1Tap(Sender: TObject; const Point: TPointF);
73     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
74 yamat0jp 5 Shift: TShiftState; X, Y: Single);
75     procedure PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
76     procedure MenuItem6Click(Sender: TObject);
77 yamat0jp 7 procedure PaintBox1Resize(Sender: TObject);
78     procedure MenuItem8Click(Sender: TObject);
79     procedure MenuItem10Click(Sender: TObject);
80     procedure MenuItem11Click(Sender: TObject);
81 yamat0jp 1 private
82 yamat0jp 5 { Private ���� }
83 yamat0jp 1 StoneGrid: TStoneGrid;
84     Index: TPlayer;
85     Active: Boolean;
86     Size: integer;
87     procedure CompStone;
88     procedure GameStart;
89     procedure ChangePlayer;
90     public
91 yamat0jp 5 { Public ���� }
92 yamat0jp 1 end;
93    
94     var
95     Player1: TPlayer;
96     Player2: TPlayer;
97    
98     Form1: TForm1;
99    
100     implementation
101    
102 yamat0jp 5 {$R *.fmx}
103 yamat0jp 7 {$R *.Windows.fmx MSWINDOWS}
104    
105 yamat0jp 1 { TStoneGrid }
106    
107     procedure TStoneGrid.BackUp;
108     begin
109 yamat0jp 3 FBuffer[FTurnNumber] := FStrings;
110     if FTurnNumber < Count * Count - 4 then
111 yamat0jp 1 begin
112 yamat0jp 7 FTurnIndex := FTurnNumber + 1;
113 yamat0jp 3 inc(FTurnNumber);
114     FBuffer[FTurnNumber] := FStrings;
115 yamat0jp 1 end;
116     end;
117    
118     function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer;
119     var
120     i, j: integer;
121     begin
122 yamat0jp 3 if CanSetStone(Player, X, Y, true) = true then
123 yamat0jp 1 begin
124     if Player = Player1 then
125 yamat0jp 4 Player := Player2
126 yamat0jp 3 else
127     Player := Player1;
128     result := 0;
129     for i := 0 to Count - 1 do
130     for j := 0 to Count - 1 do
131     if CanSetStone(Player, i, j, false) = true then
132     inc(result);
133     FStrings := FBuffer[FTurnNumber];
134     end
135     else
136 yamat0jp 1 begin
137 yamat0jp 3 FStrings := FBuffer[FTurnNumber];
138     result := -1;
139 yamat0jp 1 end;
140     end;
141    
142 yamat0jp 3 function TStoneGrid.CanSetStone(Player: TPlayer; X, Y: integer;
143 yamat0jp 7 Reverse: Boolean; const Visible: Boolean): Boolean;
144 yamat0jp 1 var
145 yamat0jp 8 i, k: integer;
146 yamat0jp 4 p: Boolean;
147 yamat0jp 7 q: ^TPoint;
148     list: TList;
149 yamat0jp 4 procedure Method(m, n: integer);
150 yamat0jp 3 var
151 yamat0jp 4 s: TStoneType;
152 yamat0jp 3 j: integer;
153 yamat0jp 1 begin
154 yamat0jp 4 if p = false then
155     Exit;
156     i := 1;
157 yamat0jp 3 while true do
158 yamat0jp 4 begin
159     s := GetStrings(X + m * i, Y + n * i);
160     if (s = stNone) or (s = stError) then
161     break
162     else if s = Player.Stone then
163     if i > 1 then
164     begin
165     result := true;
166     if Reverse = true then
167 yamat0jp 1 begin
168 yamat0jp 4 for j := 1 to i - 1 do
169 yamat0jp 7 begin
170     New(q);
171     q^ := Point(X + m * j, Y + n * j);
172     list.Add(q);
173     end;
174 yamat0jp 4 break;
175 yamat0jp 3 end
176     else
177 yamat0jp 1 begin
178 yamat0jp 4 p := false;
179 yamat0jp 3 break;
180 yamat0jp 4 end;
181     end
182     else
183     break
184 yamat0jp 3 else
185 yamat0jp 4 inc(i);
186     end;
187 yamat0jp 3 end;
188    
189     begin
190 yamat0jp 7 list := TList.Create;
191 yamat0jp 8 try
192     result := false;
193     p := true;
194     if GetStrings(X, Y) = stNone then
195 yamat0jp 3 begin
196 yamat0jp 8 Method(-1, -1);
197     Method(-1, 0);
198     Method(-1, 1);
199     Method(0, -1);
200     Method(0, 1);
201     Method(1, -1);
202     Method(1, 0);
203     Method(1, 1);
204     end;
205     if (Reverse = true) and (result = true) then
206     begin
207     SetStrings(X, Y, Player.Stone);
208     for i := 0 to list.Count - 1 do
209 yamat0jp 1 begin
210 yamat0jp 8 if Visible = true then
211     begin
212     for k := 1 to 10 do
213     begin
214     Sleep(10);
215     Application.ProcessMessages;
216     end;
217     Form1.PaintBox1.Repaint;
218     end;
219     q := list[i];
220     SetStrings(q^.X, q^.Y, Player.Stone);
221 yamat0jp 1 end;
222     end;
223 yamat0jp 8 finally
224     for i := 0 to list.Count - 1 do
225     Dispose(list[i]);
226     list.Free;
227 yamat0jp 1 end;
228     end;
229    
230     procedure TStoneGrid.Clear;
231     var
232     i, j: integer;
233     begin
234 yamat0jp 3 for i := 0 to Count - 1 do
235     for j := 0 to Count - 1 do
236     Strings[i, j] := stNone;
237     Strings[3, 3] := stBlack;
238     Strings[4, 4] := stBlack;
239     Strings[4, 3] := stWhite;
240     Strings[3, 4] := stWhite;
241 yamat0jp 7 FTurnNumber := 0;
242     FTurnIndex := 0;
243 yamat0jp 1 end;
244    
245     function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
246     begin
247 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
248 yamat0jp 4 result := FStrings[X, Y]
249 yamat0jp 3 else
250     result := stError;
251 yamat0jp 1 end;
252    
253     function TStoneGrid.NextStone(Player: TPlayer): TPoint;
254     var
255     i, j, m, n: integer;
256     begin
257 yamat0jp 3 n := -1;
258     for i := 0 to Count - 1 do
259     for j := 0 to Count - 1 do
260 yamat0jp 1 begin
261 yamat0jp 3 m := CalScore(Player, i, j);
262     if (n = -1) or ((m > -1) and (n > m)) then
263 yamat0jp 1 begin
264 yamat0jp 3 n := m;
265     result := Point(i, j);
266 yamat0jp 1 end;
267     end;
268     if n = -1 then
269 yamat0jp 3 result := Point(-1, -1);
270 yamat0jp 1 end;
271    
272     procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
273     begin
274 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
275     FStrings[X, Y] := Value;
276 yamat0jp 1 end;
277    
278     procedure TStoneGrid.SetTurnNumber(const Value: integer);
279     begin
280     if Value > FTurnIndex then
281 yamat0jp 4 FTurnNumber := FTurnIndex
282 yamat0jp 3 else
283     FTurnNumber := Value;
284     FStrings := FBuffer[FTurnNumber];
285 yamat0jp 1 end;
286    
287     { TForm1 }
288    
289     procedure TForm1.ChangePlayer;
290     var
291     i, j, m, n: integer;
292     s: string;
293     procedure Main;
294     begin
295     if Index = Player1 then
296 yamat0jp 4 Index := Player2
297 yamat0jp 3 else
298     Index := Player1;
299 yamat0jp 1 end;
300     function Execute: Boolean;
301     var
302     i, j: integer;
303     begin
304 yamat0jp 3 result := false;
305     for i := 0 to Count - 1 do
306 yamat0jp 1 begin
307 yamat0jp 3 for j := 0 to Count - 1 do
308     if StoneGrid.CanSetStone(Index, i, j, false) = true then
309 yamat0jp 1 begin
310 yamat0jp 3 result := true;
311     break;
312 yamat0jp 1 end;
313     if result = true then
314 yamat0jp 3 break;
315 yamat0jp 1 end;
316     end;
317 yamat0jp 3
318 yamat0jp 1 begin
319 yamat0jp 3 StoneGrid.BackUp;
320     Main;
321 yamat0jp 1 if Execute = false then
322     begin
323 yamat0jp 3 Main;
324 yamat0jp 1 if Execute = false then
325     begin
326 yamat0jp 7 with StoneGrid do
327     if TurnIndex < Count * Count - 4 then
328     begin
329     TurnIndex := TurnIndex - 1;
330     TurnNumber := TurnNumber - 1;
331     end;
332 yamat0jp 3 Timer1.Enabled := false;
333     Active := false;
334     m := 0;
335     n := 0;
336     for i := 0 to Count - 1 do
337     for j := 0 to Count - 1 do
338     case StoneGrid[i, j] of
339     stBlack:
340     inc(m);
341     stWhite:
342     inc(n);
343 yamat0jp 1 end;
344     if m > n then
345 yamat0jp 4 s := 'Player1 Win:' + #13#10
346 yamat0jp 3 else if m < n then
347 yamat0jp 4 s := 'Player2 Win:' + #13#10
348 yamat0jp 3 else
349     s := 'Draw:' + #13#10;
350 yamat0jp 7 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
351     IntToStr(n));
352 yamat0jp 1 end;
353     end;
354     end;
355    
356     procedure TForm1.CompStone;
357     var
358     s: TPoint;
359     begin
360 yamat0jp 3 s := StoneGrid.NextStone(Index);
361 yamat0jp 7 StoneGrid.CanSetStone(Index, s.X, s.Y, true, true);
362 yamat0jp 5 PaintBox1.Repaint;
363 yamat0jp 7 ChangePlayer;
364 yamat0jp 1 end;
365    
366     procedure TForm1.GameStart;
367     begin
368 yamat0jp 3 StoneGrid.Clear;
369     StoneGrid.BackUp;
370 yamat0jp 5 PaintBox1.Repaint;
371 yamat0jp 3 Index := Player1;
372     Active := true;
373     Timer1.Enabled := true;
374 yamat0jp 1 end;
375    
376 yamat0jp 7 procedure TForm1.MenuItem10Click(Sender: TObject);
377     begin
378     with StoneGrid do
379     begin
380     if TurnIndex > TurnNumber then
381     TurnIndex := TurnNumber;
382     end;
383     Active := true;
384     Timer1.Enabled := true;
385     end;
386    
387     procedure TForm1.MenuItem11Click(Sender: TObject);
388     begin
389     if Timer1.Enabled = true then
390     Timer1.Enabled := false;
391     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 5 end;
414    
415 yamat0jp 7 procedure TForm1.MenuItem8Click(Sender: TObject);
416     begin
417     if (Player1.Auto = true) and (Player2.Auto = true) then
418     Timer1.Enabled := false;
419     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 3 if (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 7 if Timer1.Enabled = false then
503     Timer1.Enabled := true;
504     if (Active = false) and (StoneGrid.TurnIndex < Count * Count - 4) then
505     Active := true;
506     if (Active = true) and (Index.Auto = false) then
507 yamat0jp 5 begin
508     if StoneGrid.CanSetStone(Index, Floor(Point.X / Size),
509 yamat0jp 7 Floor(Point.Y / Size), true, true) = true then
510 yamat0jp 5 begin
511     PaintBox1.Repaint;
512 yamat0jp 7 ChangePlayer;
513 yamat0jp 5 end;
514     end;
515 yamat0jp 1 end;
516    
517     end.

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