Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (show 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 unit Unit1;
2
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 TGridData = array [0 .. Count - 1] of array [0 .. Count - 1] of TStoneType;
16
17 TPlayer = class
18 private
19 FAuto: Boolean;
20 FStone: TStoneType;
21 public
22 property Auto: Boolean read FAuto write FAuto;
23 property Stone: TStoneType read FStone write FStone;
24 end;
25
26 TStoneGrid = class
27 private
28 FStrings: TGridData;
29 FBuffer: array [1 .. Count * Count - 4] of TGridData;
30 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 function CanSetStone(Player: TPlayer; X, Y: integer;
40 Reverse: Boolean): Boolean;
41 function NextStone(Player: TPlayer): TPoint;
42 property Strings[X, Y: integer]: TStoneType read GetStrings
43 write SetStrings; default;
44 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 Shift: TShiftState; X, Y: integer);
62 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 { Private 宣言 }
69 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 { Public 宣言 }
79 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 FBuffer[FTurnNumber] := FStrings;
95 if FTurnNumber < Count * Count - 4 then
96 begin
97 inc(FTurnNumber);
98 FTurnIndex := FTurnNumber;
99 FBuffer[FTurnNumber] := FStrings;
100 end;
101 end;
102
103 function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer;
104 var
105 i, j: integer;
106 begin
107 if CanSetStone(Player, X, Y, true) = true then
108 begin
109 if Player = Player1 then
110 Player := Player2
111 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 begin
122 FStrings := FBuffer[FTurnNumber];
123 result := -1;
124 end;
125 end;
126
127 function TStoneGrid.CanSetStone(Player: TPlayer; X, Y: integer;
128 Reverse: Boolean): Boolean;
129 var
130 i: integer;
131 p: Boolean;
132 procedure Method(m, n: integer);
133 var
134 s: TStoneType;
135 j: integer;
136 begin
137 if p = false then
138 Exit;
139 i := 1;
140 while true do
141 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 begin
151 for j := 1 to i - 1 do
152 SetStrings(X + m * j, Y + n * j, Player.Stone);
153 break;
154 end
155 else
156 begin
157 p := false;
158 break;
159 end;
160 end
161 else
162 break
163 else
164 inc(i);
165 end;
166 end;
167
168 begin
169 result := false;
170 if GetStrings(X, Y) = stNone then
171 begin
172 p := true;
173 if Player.Stone = stBlack then
174 begin
175 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 if (Reverse = true) and (result = true) then
184 begin
185 SetStrings(X, Y, stBlack);
186 end;
187 end
188 else
189 begin
190 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 if (Reverse = true) and (result = true) then
199 begin
200 Strings[X, Y] := stWhite;
201 end;
202 end;
203 end;
204 end;
205
206 procedure TStoneGrid.Clear;
207 var
208 i, j: integer;
209 begin
210 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 end;
220
221 function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
222 begin
223 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
224 result := FStrings[X, Y]
225 else
226 result := stError;
227 end;
228
229 function TStoneGrid.NextStone(Player: TPlayer): TPoint;
230 var
231 i, j, m, n: integer;
232 begin
233 n := -1;
234 for i := 0 to Count - 1 do
235 for j := 0 to Count - 1 do
236 begin
237 m := CalScore(Player, i, j);
238 if (n = -1) or ((m > -1) and (n > m)) then
239 begin
240 n := m;
241 result := Point(i, j);
242 end;
243 end;
244 if n = -1 then
245 result := Point(-1, -1);
246 end;
247
248 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
249 begin
250 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
251 FStrings[X, Y] := Value;
252 end;
253
254 procedure TStoneGrid.SetTurnNumber(const Value: integer);
255 begin
256 if Value > FTurnIndex then
257 FTurnNumber := FTurnIndex
258 else
259 FTurnNumber := Value;
260 FStrings := FBuffer[FTurnNumber];
261 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 Index := Player2
273 else
274 Index := Player1;
275 end;
276 function Execute: Boolean;
277 var
278 i, j: integer;
279 begin
280 result := false;
281 for i := 0 to Count - 1 do
282 begin
283 for j := 0 to Count - 1 do
284 if StoneGrid.CanSetStone(Index, i, j, false) = true then
285 begin
286 result := true;
287 break;
288 end;
289 if result = true then
290 break;
291 end;
292 end;
293
294 begin
295 StoneGrid.BackUp;
296 Main;
297 if Execute = false then
298 begin
299 Main;
300 if Execute = false then
301 begin
302 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 end;
314 if m > n then
315 s := 'Player1 Win:' + #13#10
316 else if m < n then
317 s := 'Player2 Win:' + #13#10
318 else
319 s := 'Draw:' + #13#10;
320 Showmessage(s + '(Player1) ' + IntToStr(m) + '(Player2) ' + IntToStr(n));
321 end;
322 end;
323 end;
324
325 procedure TForm1.CheckGame;
326 var
327 i, j, m, n: integer;
328 s: string;
329 begin
330 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 end;
340 if (m = 0) or (n = 0) or (m + n = Count * Count) then
341 begin
342 if n > m then
343 s := 'Player1 Win' + #13#10
344 else if n < m then
345 s := 'Player2 Win' + #13#10
346 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 end;
356
357 procedure TForm1.CompStone;
358 var
359 s: TPoint;
360 begin
361 s := StoneGrid.NextStone(Index);
362 StoneGrid.CanSetStone(Index, s.X, s.Y, true);
363 FormPaint(nil);
364 CheckGame;
365 end;
366
367 procedure TForm1.GameStart;
368 begin
369 StoneGrid.Clear;
370 StoneGrid.BackUp;
371 FormPaint(nil);
372 Index := Player1;
373 Active := true;
374 Timer1.Enabled := true;
375 end;
376
377 procedure TForm1.FormCreate(Sender: TObject);
378 begin
379 StoneGrid := TStoneGrid.Create;
380 Player1 := TPlayer.Create;
381 Player2 := TPlayer.Create;
382 Player1.Stone := stBlack;
383 Player2.Stone := stWhite;
384 Player2.Auto := true;
385 GameStart;
386 end;
387
388 procedure TForm1.FormDestroy(Sender: TObject);
389 begin
390 StoneGrid.Free;
391 Player1.Free;
392 Player2.Free;
393 end;
394
395 procedure TForm1.FormPaint(Sender: TObject);
396 var
397 i, j: integer;
398 begin
399 Canvas.Brush.Color := clWhite;
400 Canvas.Rectangle(0, 0, Count * Size, Count * Size);
401 for i := 0 to Count - 1 do
402 begin
403 Canvas.MoveTo(i * Size, 0);
404 Canvas.LineTo(i * Size, Size * Count);
405 for j := 0 to Count - 1 do
406 begin
407 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 end;
421 end;
422 end;
423 end;
424
425 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
426 Shift: TShiftState; X, Y: integer);
427 begin
428 if (Active = true) and (Index.Auto = false) and (X <= Count * Size) and
429 (Y <= Count * Size) then
430 begin
431 X := X div Size;
432 Y := Y div Size;
433 if StoneGrid.CanSetStone(Index, X, Y, true) = true then
434 begin
435 FormPaint(Sender);
436 CheckGame;
437 end;
438 end;
439 end;
440
441 procedure TForm1.Timer1Timer(Sender: TObject);
442 begin
443 if (Active = true) and (Index.Auto = true) then
444 begin
445 Timer1.Enabled := false;
446 CompStone;
447 Timer1.Enabled := true;
448 end;
449 end;
450
451 procedure TForm1.FormResize(Sender: TObject);
452 begin
453 Size := Min(ClientWidth, ClientHeight) div Count;
454 FormPaint(Sender);
455 end;
456
457 procedure TForm1.Player(Sender: TObject);
458 begin
459 (Sender as TMenuItem).Checked := not(Sender as TMenuItem).Checked;
460 if Sender = Player11 then
461 Player1.Auto := Player11.Checked
462 else
463 Player2.Auto := Player21.Checked;
464 end;
465
466 procedure TForm1.Start1Click(Sender: TObject);
467 begin
468 GameStart;
469 end;
470
471 procedure TForm1.End1Click(Sender: TObject);
472 begin
473 Close;
474 end;
475
476 end.

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