Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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