Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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