Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (hide annotations) (download) (as text)
Mon Jul 13 09:00:57 2015 UTC (8 years, 9 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12233 byte(s)
FTurnIndex,FTurnNumberの使い方をシンプルにした

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

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