Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7 - (hide annotations) (download) (as text)
Sun Jul 12 23:30:08 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12249 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 3 i: 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 3 result := false;
192 yamat0jp 7 p := true;
193 yamat0jp 3 if GetStrings(X, Y) = stNone then
194     begin
195 yamat0jp 7 Method(-1, -1);
196     Method(-1, 0);
197     Method(-1, 1);
198     Method(0, -1);
199     Method(0, 1);
200     Method(1, -1);
201     Method(1, 0);
202     Method(1, 1);
203     end;
204     if (Reverse = true) and (result = true) then
205     begin
206     SetStrings(X, Y, Player.Stone);
207     for i := 0 to list.Count - 1 do
208 yamat0jp 3 begin
209 yamat0jp 7 if Visible = true then
210 yamat0jp 1 begin
211 yamat0jp 7 Sleep(10);
212     Form1.PaintBox1.Repaint;
213 yamat0jp 1 end;
214 yamat0jp 7 q := list[i];
215     SetStrings(q^.X, q^.Y, Player.Stone);
216 yamat0jp 1 end;
217     end;
218 yamat0jp 7 for i := 0 to list.Count - 1 do
219     Dispose(list[i]);
220     list.Free;
221 yamat0jp 1 end;
222    
223     procedure TStoneGrid.Clear;
224     var
225     i, j: integer;
226     begin
227 yamat0jp 3 for i := 0 to Count - 1 do
228     for j := 0 to Count - 1 do
229     Strings[i, j] := stNone;
230     Strings[3, 3] := stBlack;
231     Strings[4, 4] := stBlack;
232     Strings[4, 3] := stWhite;
233     Strings[3, 4] := stWhite;
234 yamat0jp 7 FTurnNumber := 0;
235     FTurnIndex := 0;
236 yamat0jp 1 end;
237    
238     function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
239     begin
240 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
241 yamat0jp 4 result := FStrings[X, Y]
242 yamat0jp 3 else
243     result := stError;
244 yamat0jp 1 end;
245    
246     function TStoneGrid.NextStone(Player: TPlayer): TPoint;
247     var
248     i, j, m, n: integer;
249     begin
250 yamat0jp 3 n := -1;
251     for i := 0 to Count - 1 do
252     for j := 0 to Count - 1 do
253 yamat0jp 1 begin
254 yamat0jp 3 m := CalScore(Player, i, j);
255     if (n = -1) or ((m > -1) and (n > m)) then
256 yamat0jp 1 begin
257 yamat0jp 3 n := m;
258     result := Point(i, j);
259 yamat0jp 1 end;
260     end;
261     if n = -1 then
262 yamat0jp 3 result := Point(-1, -1);
263 yamat0jp 1 end;
264    
265     procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
266     begin
267 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
268     FStrings[X, Y] := Value;
269 yamat0jp 1 end;
270    
271     procedure TStoneGrid.SetTurnNumber(const Value: integer);
272     begin
273     if Value > FTurnIndex then
274 yamat0jp 4 FTurnNumber := FTurnIndex
275 yamat0jp 3 else
276     FTurnNumber := Value;
277     FStrings := FBuffer[FTurnNumber];
278 yamat0jp 1 end;
279    
280     { TForm1 }
281    
282     procedure TForm1.ChangePlayer;
283     var
284     i, j, m, n: integer;
285     s: string;
286     procedure Main;
287     begin
288     if Index = Player1 then
289 yamat0jp 4 Index := Player2
290 yamat0jp 3 else
291     Index := Player1;
292 yamat0jp 1 end;
293     function Execute: Boolean;
294     var
295     i, j: integer;
296     begin
297 yamat0jp 3 result := false;
298     for i := 0 to Count - 1 do
299 yamat0jp 1 begin
300 yamat0jp 3 for j := 0 to Count - 1 do
301     if StoneGrid.CanSetStone(Index, i, j, false) = true then
302 yamat0jp 1 begin
303 yamat0jp 3 result := true;
304     break;
305 yamat0jp 1 end;
306     if result = true then
307 yamat0jp 3 break;
308 yamat0jp 1 end;
309     end;
310 yamat0jp 3
311 yamat0jp 1 begin
312 yamat0jp 3 StoneGrid.BackUp;
313     Main;
314 yamat0jp 1 if Execute = false then
315     begin
316 yamat0jp 3 Main;
317 yamat0jp 1 if Execute = false then
318     begin
319 yamat0jp 7 with StoneGrid do
320     if TurnIndex < Count * Count - 4 then
321     begin
322     TurnIndex := TurnIndex - 1;
323     TurnNumber := TurnNumber - 1;
324     end;
325 yamat0jp 3 Timer1.Enabled := false;
326     Active := false;
327     m := 0;
328     n := 0;
329     for i := 0 to Count - 1 do
330     for j := 0 to Count - 1 do
331     case StoneGrid[i, j] of
332     stBlack:
333     inc(m);
334     stWhite:
335     inc(n);
336 yamat0jp 1 end;
337     if m > n then
338 yamat0jp 4 s := 'Player1 Win:' + #13#10
339 yamat0jp 3 else if m < n then
340 yamat0jp 4 s := 'Player2 Win:' + #13#10
341 yamat0jp 3 else
342     s := 'Draw:' + #13#10;
343 yamat0jp 7 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
344     IntToStr(n));
345 yamat0jp 1 end;
346     end;
347     end;
348    
349     procedure TForm1.CompStone;
350     var
351     s: TPoint;
352     begin
353 yamat0jp 3 s := StoneGrid.NextStone(Index);
354 yamat0jp 7 StoneGrid.CanSetStone(Index, s.X, s.Y, true, true);
355 yamat0jp 5 PaintBox1.Repaint;
356 yamat0jp 7 ChangePlayer;
357 yamat0jp 1 end;
358    
359     procedure TForm1.GameStart;
360     begin
361 yamat0jp 3 StoneGrid.Clear;
362     StoneGrid.BackUp;
363 yamat0jp 5 PaintBox1.Repaint;
364 yamat0jp 3 Index := Player1;
365     Active := true;
366     Timer1.Enabled := true;
367 yamat0jp 1 end;
368    
369 yamat0jp 7 procedure TForm1.MenuItem10Click(Sender: TObject);
370     begin
371     with StoneGrid do
372     begin
373     if TurnIndex > TurnNumber then
374     TurnIndex := TurnNumber;
375     end;
376     Active := true;
377     Timer1.Enabled := true;
378     end;
379    
380     procedure TForm1.MenuItem11Click(Sender: TObject);
381     begin
382     if Timer1.Enabled = true then
383     Timer1.Enabled := false;
384     with StoneGrid do
385     if Sender = MenuItem11 then
386     TurnNumber := TurnNumber + 1
387     else
388     TurnNumber := TurnNumber - 1;
389     PaintBox1.Repaint;
390     end;
391    
392 yamat0jp 5 procedure TForm1.MenuItem2Click(Sender: TObject);
393 yamat0jp 1 begin
394 yamat0jp 3 GameStart;
395 yamat0jp 1 end;
396    
397 yamat0jp 5 procedure TForm1.MenuItem4Click(Sender: TObject);
398 yamat0jp 1 begin
399 yamat0jp 5 Close;
400 yamat0jp 1 end;
401    
402 yamat0jp 5 procedure TForm1.MenuItem6Click(Sender: TObject);
403     begin
404 yamat0jp 7 Player1.Auto := MenuItem6.IsChecked;
405     Player2.Auto := MenuItem7.IsChecked;
406 yamat0jp 5 end;
407    
408 yamat0jp 7 procedure TForm1.MenuItem8Click(Sender: TObject);
409     begin
410     if (Player1.Auto = true) and (Player2.Auto = true) then
411     Timer1.Enabled := false;
412     end;
413    
414 yamat0jp 5 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
415 yamat0jp 1 var
416     i, j: integer;
417     begin
418 yamat0jp 5 Canvas.Fill.Color := TAlphaColors.White;
419     Canvas.FillRect(RectF(0, 0, Count * Size, Count * Size), 0, 0, [], 1);
420     for i := 0 to Count do
421 yamat0jp 1 begin
422 yamat0jp 5 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
423     for j := 0 to Count do
424 yamat0jp 1 begin
425 yamat0jp 5 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
426 yamat0jp 3 case StoneGrid.Strings[i, j] of
427     stWhite:
428 yamat0jp 7 Canvas.DrawEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
429     (j + 1) * Size), 1);
430 yamat0jp 3 stBlack:
431     begin
432 yamat0jp 5 Canvas.Fill.Color := TAlphaColors.Black;
433     Canvas.FillEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
434     (j + 1) * Size), 1);
435 yamat0jp 3 end;
436 yamat0jp 1 end;
437     end;
438     end;
439     end;
440    
441 yamat0jp 7 procedure TForm1.PaintBox1Resize(Sender: TObject);
442     begin
443     Size := Min(ClientWidth, ClientHeight) div Count;
444     end;
445    
446 yamat0jp 5 procedure TForm1.FormCreate(Sender: TObject);
447 yamat0jp 1 begin
448 yamat0jp 5 StoneGrid := TStoneGrid.Create;
449     Player1 := TPlayer.Create;
450     Player2 := TPlayer.Create;
451     Player1.Stone := stBlack;
452     Player2.Stone := stWhite;
453     Player2.Auto := true;
454     with PaintBox1.Canvas do
455 yamat0jp 1 begin
456 yamat0jp 5 StrokeDash := TStrokeDash.Solid;
457     Stroke.Color := TAlphaColors.Black;
458     StrokeThickness := 3;
459 yamat0jp 1 end;
460 yamat0jp 7 PaintBox1Resize(Sender);
461 yamat0jp 5 GameStart;
462 yamat0jp 1 end;
463    
464 yamat0jp 5 procedure TForm1.FormDestroy(Sender: TObject);
465     begin
466     StoneGrid.Free;
467     Player1.Free;
468     Player2.Free;
469     end;
470    
471 yamat0jp 7 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
472 yamat0jp 5 Shift: TShiftState; X, Y: Single);
473     begin
474 yamat0jp 7 PaintBox1Tap(Sender, PointF(X, Y));
475 yamat0jp 5 end;
476    
477 yamat0jp 1 procedure TForm1.Timer1Timer(Sender: TObject);
478     begin
479 yamat0jp 3 if (Active = true) and (Index.Auto = true) then
480 yamat0jp 1 begin
481 yamat0jp 3 Timer1.Enabled := false;
482     CompStone;
483     Timer1.Enabled := true;
484 yamat0jp 1 end;
485     end;
486    
487     procedure TForm1.FormResize(Sender: TObject);
488     begin
489 yamat0jp 3 Size := Min(ClientWidth, ClientHeight) div Count;
490 yamat0jp 5 PaintTo(Canvas);
491 yamat0jp 1 end;
492    
493 yamat0jp 7 procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF);
494 yamat0jp 1 begin
495 yamat0jp 7 if Timer1.Enabled = false then
496     Timer1.Enabled := true;
497     if (Active = false) and (StoneGrid.TurnIndex < Count * Count - 4) then
498     Active := true;
499     if (Active = true) and (Index.Auto = false) then
500 yamat0jp 5 begin
501     if StoneGrid.CanSetStone(Index, Floor(Point.X / Size),
502 yamat0jp 7 Floor(Point.Y / Size), true, true) = true then
503 yamat0jp 5 begin
504     PaintBox1.Repaint;
505 yamat0jp 7 ChangePlayer;
506 yamat0jp 5 end;
507     end;
508 yamat0jp 1 end;
509    
510     end.

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