Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (hide annotations) (download) (as text)
Sat Jul 11 08:02:13 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 10833 byte(s)
コードを圧縮

実行結果は同じ
1 yamat0jp 3 unit Unit1;
2 yamat0jp 1
3     interface
4    
5     uses
6     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7     Dialogs, Menus, ExtCtrls, Math;
8    
9     const
10     Count = 8;
11    
12     type
13     TStoneType = (stNone, stWhite, stBlack, stError);
14    
15 yamat0jp 3 TGridData = array [0 .. Count - 1] of array [0 .. Count - 1] of TStoneType;
16 yamat0jp 1
17     TPlayer = class
18     private
19     FAuto: Boolean;
20 yamat0jp 4 FStone: TStoneType;
21 yamat0jp 1 public
22     property Auto: Boolean read FAuto write FAuto;
23 yamat0jp 4 property Stone: TStoneType read FStone write FStone;
24 yamat0jp 1 end;
25    
26     TStoneGrid = class
27     private
28     FStrings: TGridData;
29 yamat0jp 3 FBuffer: array [1 .. Count * Count - 4] of TGridData;
30 yamat0jp 1 FTurnNumber: integer;
31     FTurnIndex: integer;
32     function GetStrings(X, Y: integer): TStoneType;
33     procedure SetStrings(X, Y: integer; const Value: TStoneType);
34     procedure SetTurnNumber(const Value: integer);
35     public
36     procedure Clear;
37     procedure BackUp;
38     function CalScore(Player: TPlayer; X, Y: integer): integer;
39 yamat0jp 3 function CanSetStone(Player: TPlayer; X, Y: integer;
40     Reverse: Boolean): Boolean;
41 yamat0jp 1 function NextStone(Player: TPlayer): TPoint;
42 yamat0jp 3 property Strings[X, Y: integer]: TStoneType read GetStrings
43     write SetStrings; default;
44 yamat0jp 1 property TurnNumber: integer read FTurnNumber write SetTurnNumber;
45     end;
46    
47     TForm1 = class(TForm)
48     Timer1: TTimer;
49     MainMenu1: TMainMenu;
50     Game1: TMenuItem;
51     Start1: TMenuItem;
52     N1: TMenuItem;
53     End1: TMenuItem;
54     Com1: TMenuItem;
55     Player11: TMenuItem;
56     Player21: TMenuItem;
57     procedure FormCreate(Sender: TObject);
58     procedure FormDestroy(Sender: TObject);
59     procedure FormPaint(Sender: TObject);
60     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
61 yamat0jp 3 Shift: TShiftState; X, Y: integer);
62 yamat0jp 1 procedure Timer1Timer(Sender: TObject);
63     procedure FormResize(Sender: TObject);
64     procedure Player(Sender: TObject);
65     procedure Start1Click(Sender: TObject);
66     procedure End1Click(Sender: TObject);
67     private
68 yamat0jp 3 { Private 宣言 }
69 yamat0jp 1 StoneGrid: TStoneGrid;
70     Index: TPlayer;
71     Active: Boolean;
72     Size: integer;
73     procedure CompStone;
74     procedure GameStart;
75     procedure ChangePlayer;
76     procedure CheckGame;
77     public
78 yamat0jp 3 { Public 宣言 }
79 yamat0jp 1 end;
80    
81     var
82     Player1: TPlayer;
83     Player2: TPlayer;
84    
85     Form1: TForm1;
86    
87     implementation
88    
89     {$R *.dfm}
90     { TStoneGrid }
91    
92     procedure TStoneGrid.BackUp;
93     begin
94 yamat0jp 3 FBuffer[FTurnNumber] := FStrings;
95     if FTurnNumber < Count * Count - 4 then
96 yamat0jp 1 begin
97 yamat0jp 3 inc(FTurnNumber);
98     FTurnIndex := FTurnNumber;
99     FBuffer[FTurnNumber] := FStrings;
100 yamat0jp 1 end;
101     end;
102    
103     function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer;
104     var
105     i, j: integer;
106     begin
107 yamat0jp 3 if CanSetStone(Player, X, Y, true) = true then
108 yamat0jp 1 begin
109     if Player = Player1 then
110 yamat0jp 4 Player := Player2
111 yamat0jp 3 else
112     Player := Player1;
113     result := 0;
114     for i := 0 to Count - 1 do
115     for j := 0 to Count - 1 do
116     if CanSetStone(Player, i, j, false) = true then
117     inc(result);
118     FStrings := FBuffer[FTurnNumber];
119     end
120     else
121 yamat0jp 1 begin
122 yamat0jp 3 FStrings := FBuffer[FTurnNumber];
123     result := -1;
124 yamat0jp 1 end;
125     end;
126    
127 yamat0jp 3 function TStoneGrid.CanSetStone(Player: TPlayer; X, Y: integer;
128     Reverse: Boolean): Boolean;
129 yamat0jp 1 var
130 yamat0jp 3 i: integer;
131 yamat0jp 4 p: Boolean;
132     procedure Method(m, n: integer);
133 yamat0jp 3 var
134 yamat0jp 4 s: TStoneType;
135 yamat0jp 3 j: integer;
136 yamat0jp 1 begin
137 yamat0jp 4 if p = false then
138     Exit;
139     i := 1;
140 yamat0jp 3 while true do
141 yamat0jp 4 begin
142     s := GetStrings(X + m * i, Y + n * i);
143     if (s = stNone) or (s = stError) then
144     break
145     else if s = Player.Stone then
146     if i > 1 then
147     begin
148     result := true;
149     if Reverse = true then
150 yamat0jp 1 begin
151 yamat0jp 4 for j := 1 to i - 1 do
152     SetStrings(X + m * j, Y + n * j, Player.Stone);
153     break;
154 yamat0jp 3 end
155     else
156 yamat0jp 1 begin
157 yamat0jp 4 p := false;
158 yamat0jp 3 break;
159 yamat0jp 4 end;
160     end
161     else
162     break
163 yamat0jp 3 else
164 yamat0jp 4 inc(i);
165     end;
166 yamat0jp 3 end;
167    
168     begin
169     result := false;
170     if GetStrings(X, Y) = stNone then
171     begin
172 yamat0jp 4 p := true;
173     if Player.Stone = stBlack then
174 yamat0jp 3 begin
175 yamat0jp 4 Method(-1, -1);
176     Method(-1, 0);
177     Method(-1, 1);
178     Method(0, -1);
179     Method(0, 1);
180     Method(1, -1);
181     Method(1, 0);
182     Method(1, 1);
183 yamat0jp 3 if (Reverse = true) and (result = true) then
184 yamat0jp 1 begin
185 yamat0jp 3 SetStrings(X, Y, stBlack);
186 yamat0jp 1 end;
187 yamat0jp 3 end
188     else
189 yamat0jp 1 begin
190 yamat0jp 4 Method(-1, -1);
191     Method(-1, 0);
192     Method(-1, 1);
193     Method(0, -1);
194     Method(0, 1);
195     Method(1, -1);
196     Method(1, 0);
197     Method(1, 1);
198 yamat0jp 3 if (Reverse = true) and (result = true) then
199 yamat0jp 1 begin
200 yamat0jp 3 Strings[X, Y] := stWhite;
201 yamat0jp 1 end;
202     end;
203     end;
204     end;
205    
206     procedure TStoneGrid.Clear;
207     var
208     i, j: integer;
209     begin
210 yamat0jp 3 for i := 0 to Count - 1 do
211     for j := 0 to Count - 1 do
212     Strings[i, j] := stNone;
213     Strings[3, 3] := stBlack;
214     Strings[4, 4] := stBlack;
215     Strings[4, 3] := stWhite;
216     Strings[3, 4] := stWhite;
217     FTurnNumber := 1;
218     FTurnIndex := 1;
219 yamat0jp 1 end;
220    
221     function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
222     begin
223 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
224 yamat0jp 4 result := FStrings[X, Y]
225 yamat0jp 3 else
226     result := stError;
227 yamat0jp 1 end;
228    
229     function TStoneGrid.NextStone(Player: TPlayer): TPoint;
230     var
231     i, j, m, n: integer;
232     begin
233 yamat0jp 3 n := -1;
234     for i := 0 to Count - 1 do
235     for j := 0 to Count - 1 do
236 yamat0jp 1 begin
237 yamat0jp 3 m := CalScore(Player, i, j);
238     if (n = -1) or ((m > -1) and (n > m)) then
239 yamat0jp 1 begin
240 yamat0jp 3 n := m;
241     result := Point(i, j);
242 yamat0jp 1 end;
243     end;
244     if n = -1 then
245 yamat0jp 3 result := Point(-1, -1);
246 yamat0jp 1 end;
247    
248     procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
249     begin
250 yamat0jp 3 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
251     FStrings[X, Y] := Value;
252 yamat0jp 1 end;
253    
254     procedure TStoneGrid.SetTurnNumber(const Value: integer);
255     begin
256     if Value > FTurnIndex then
257 yamat0jp 4 FTurnNumber := FTurnIndex
258 yamat0jp 3 else
259     FTurnNumber := Value;
260     FStrings := FBuffer[FTurnNumber];
261 yamat0jp 1 end;
262    
263     { TForm1 }
264    
265     procedure TForm1.ChangePlayer;
266     var
267     i, j, m, n: integer;
268     s: string;
269     procedure Main;
270     begin
271     if Index = Player1 then
272 yamat0jp 4 Index := Player2
273 yamat0jp 3 else
274     Index := Player1;
275 yamat0jp 1 end;
276     function Execute: Boolean;
277     var
278     i, j: integer;
279     begin
280 yamat0jp 3 result := false;
281     for i := 0 to Count - 1 do
282 yamat0jp 1 begin
283 yamat0jp 3 for j := 0 to Count - 1 do
284     if StoneGrid.CanSetStone(Index, i, j, false) = true then
285 yamat0jp 1 begin
286 yamat0jp 3 result := true;
287     break;
288 yamat0jp 1 end;
289     if result = true then
290 yamat0jp 3 break;
291 yamat0jp 1 end;
292     end;
293 yamat0jp 3
294 yamat0jp 1 begin
295 yamat0jp 3 StoneGrid.BackUp;
296     Main;
297 yamat0jp 1 if Execute = false then
298     begin
299 yamat0jp 3 Main;
300 yamat0jp 1 if Execute = false then
301     begin
302 yamat0jp 3 Timer1.Enabled := false;
303     Active := false;
304     m := 0;
305     n := 0;
306     for i := 0 to Count - 1 do
307     for j := 0 to Count - 1 do
308     case StoneGrid[i, j] of
309     stBlack:
310     inc(m);
311     stWhite:
312     inc(n);
313 yamat0jp 1 end;
314     if m > n then
315 yamat0jp 4 s := 'Player1 Win:' + #13#10
316 yamat0jp 3 else if m < n then
317 yamat0jp 4 s := 'Player2 Win:' + #13#10
318 yamat0jp 3 else
319     s := 'Draw:' + #13#10;
320     Showmessage(s + '(Player1) ' + IntToStr(m) + '(Player2) ' + IntToStr(n));
321 yamat0jp 1 end;
322     end;
323     end;
324    
325     procedure TForm1.CheckGame;
326     var
327     i, j, m, n: integer;
328     s: string;
329     begin
330 yamat0jp 3 m := 0;
331     n := 0;
332     for i := 0 to Count - 1 do
333     for j := 0 to Count - 1 do
334     case StoneGrid.Strings[i, j] of
335     stWhite:
336     inc(m);
337     stBlack:
338     inc(n);
339 yamat0jp 1 end;
340 yamat0jp 3 if (m = 0) or (n = 0) or (m + n = Count * Count) then
341 yamat0jp 1 begin
342     if n > m then
343 yamat0jp 4 s := 'Player1 Win' + #13#10
344 yamat0jp 3 else if n < m then
345 yamat0jp 4 s := 'Player2 Win' + #13#10
346 yamat0jp 3 else
347     s := 'draw' + #13#10;
348     Timer1.Enabled := false;
349     Active := false;
350     Showmessage(s + '(Player1) ' + IntToStr(n) + #13#10 + '(Player2) ' +
351     IntToStr(m));
352     end
353     else
354     ChangePlayer;
355 yamat0jp 1 end;
356    
357     procedure TForm1.CompStone;
358     var
359     s: TPoint;
360     begin
361 yamat0jp 3 s := StoneGrid.NextStone(Index);
362     StoneGrid.CanSetStone(Index, s.X, s.Y, true);
363     FormPaint(nil);
364     CheckGame;
365 yamat0jp 1 end;
366    
367     procedure TForm1.GameStart;
368     begin
369 yamat0jp 3 StoneGrid.Clear;
370     StoneGrid.BackUp;
371     FormPaint(nil);
372     Index := Player1;
373     Active := true;
374     Timer1.Enabled := true;
375 yamat0jp 1 end;
376    
377     procedure TForm1.FormCreate(Sender: TObject);
378     begin
379 yamat0jp 3 StoneGrid := TStoneGrid.Create;
380     Player1 := TPlayer.Create;
381     Player2 := TPlayer.Create;
382 yamat0jp 4 Player1.Stone := stBlack;
383     Player2.Stone := stWhite;
384 yamat0jp 3 Player2.Auto := true;
385     GameStart;
386 yamat0jp 1 end;
387    
388     procedure TForm1.FormDestroy(Sender: TObject);
389     begin
390 yamat0jp 3 StoneGrid.Free;
391     Player1.Free;
392     Player2.Free;
393 yamat0jp 1 end;
394    
395     procedure TForm1.FormPaint(Sender: TObject);
396     var
397     i, j: integer;
398     begin
399 yamat0jp 3 Canvas.Brush.Color := clWhite;
400     Canvas.Rectangle(0, 0, Count * Size, Count * Size);
401     for i := 0 to Count - 1 do
402 yamat0jp 1 begin
403 yamat0jp 3 Canvas.MoveTo(i * Size, 0);
404     Canvas.LineTo(i * Size, Size * Count);
405     for j := 0 to Count - 1 do
406 yamat0jp 1 begin
407 yamat0jp 3 Canvas.MoveTo(0, j * Size);
408     Canvas.LineTo(Count * Size, j * Size);
409     case StoneGrid.Strings[i, j] of
410     stWhite:
411     begin
412     Canvas.Brush.Color := clWhite;
413     Canvas.Ellipse(i * Size, j * Size, (i + 1) * Size, (j + 1) * Size);
414     end;
415     stBlack:
416     begin
417     Canvas.Brush.Color := clBlack;
418     Canvas.Ellipse(i * Size, j * Size, (i + 1) * Size, (j + 1) * Size);
419     end;
420 yamat0jp 1 end;
421     end;
422     end;
423     end;
424    
425     procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
426 yamat0jp 3 Shift: TShiftState; X, Y: integer);
427 yamat0jp 1 begin
428 yamat0jp 3 if (Active = true) and (Index.Auto = false) and (X <= Count * Size) and
429     (Y <= Count * Size) then
430 yamat0jp 1 begin
431 yamat0jp 3 X := X div Size;
432     Y := Y div Size;
433     if StoneGrid.CanSetStone(Index, X, Y, true) = true then
434 yamat0jp 1 begin
435 yamat0jp 3 FormPaint(Sender);
436     CheckGame;
437 yamat0jp 1 end;
438     end;
439     end;
440    
441     procedure TForm1.Timer1Timer(Sender: TObject);
442     begin
443 yamat0jp 3 if (Active = true) and (Index.Auto = true) then
444 yamat0jp 1 begin
445 yamat0jp 3 Timer1.Enabled := false;
446     CompStone;
447     Timer1.Enabled := true;
448 yamat0jp 1 end;
449     end;
450    
451     procedure TForm1.FormResize(Sender: TObject);
452     begin
453 yamat0jp 3 Size := Min(ClientWidth, ClientHeight) div Count;
454     FormPaint(Sender);
455 yamat0jp 1 end;
456    
457     procedure TForm1.Player(Sender: TObject);
458     begin
459 yamat0jp 3 (Sender as TMenuItem).Checked := not(Sender as TMenuItem).Checked;
460 yamat0jp 1 if Sender = Player11 then
461 yamat0jp 4 Player1.Auto := Player11.Checked
462 yamat0jp 3 else
463     Player2.Auto := Player21.Checked;
464 yamat0jp 1 end;
465    
466     procedure TForm1.Start1Click(Sender: TObject);
467     begin
468 yamat0jp 3 GameStart;
469 yamat0jp 1 end;
470    
471     procedure TForm1.End1Click(Sender: TObject);
472     begin
473 yamat0jp 3 Close;
474 yamat0jp 1 end;
475    
476     end.

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