Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations) (download) (as text)
Sat Jul 11 06:28:05 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 11728 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 public
21 property Auto: Boolean read FAuto write FAuto;
22 end;
23
24 TStoneGrid = class
25 private
26 FStrings: TGridData;
27 FBuffer: array [1 .. Count * Count - 4] of TGridData;
28 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 function CanSetStone(Player: TPlayer; X, Y: integer;
38 Reverse: Boolean): Boolean;
39 function NextStone(Player: TPlayer): TPoint;
40 property Strings[X, Y: integer]: TStoneType read GetStrings
41 write SetStrings; default;
42 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 Shift: TShiftState; X, Y: integer);
60 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 { Private 宣言 }
67 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 { Public 宣言 }
77 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 FBuffer[FTurnNumber] := FStrings;
93 if FTurnNumber < Count * Count - 4 then
94 begin
95 inc(FTurnNumber);
96 FTurnIndex := FTurnNumber;
97 FBuffer[FTurnNumber] := FStrings;
98 end;
99 end;
100
101 function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer;
102 var
103 i, j: integer;
104 begin
105 if CanSetStone(Player, X, Y, true) = true then
106 begin
107 if Player = Player1 then
108 begin
109 Player := Player2;
110 end
111 else
112 begin
113 Player := Player1;
114 end;
115 result := 0;
116 for i := 0 to Count - 1 do
117 begin
118 for j := 0 to Count - 1 do
119 begin
120 if CanSetStone(Player, i, j, false) = true then
121 begin
122 inc(result);
123 end;
124 end;
125 end;
126 FStrings := FBuffer[FTurnNumber];
127 end
128 else
129 begin
130 FStrings := FBuffer[FTurnNumber];
131 result := -1;
132 end;
133 end;
134
135 function TStoneGrid.CanSetStone(Player: TPlayer; X, Y: integer;
136 Reverse: Boolean): Boolean;
137 var
138 i: integer;
139 procedure Method1(m, n: integer);
140 var
141 j: integer;
142 begin
143 i:=1;
144 while true do
145 case GetStrings(X + m*i, Y+n*i) of
146 stBlack:
147 if i > 1 then
148 begin
149 result := true;
150 if Reverse = true then
151 begin
152 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 stWhite:
162 inc(i);
163 else
164 break;
165 end;
166 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 stBlack:
175 inc(i);
176 stWhite:
177 if i > 1 then
178 begin
179 result:=true;
180 if Reverse = true then
181 begin
182 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 end;
194 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 begin
212 SetStrings(X, Y, stBlack);
213 end;
214 end
215 else
216 begin
217 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 begin
227 Strings[X, Y] := stWhite;
228 end;
229 end;
230 end;
231 end;
232
233 procedure TStoneGrid.Clear;
234 var
235 i, j: integer;
236 begin
237 for i := 0 to Count - 1 do
238 begin
239 for j := 0 to Count - 1 do
240 begin
241 Strings[i, j] := stNone;
242 end;
243 end;
244 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 end;
251
252 function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
253 begin
254 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
255 begin
256 result := FStrings[X, Y];
257 end
258 else
259 begin
260 result := stError;
261 end;
262 end;
263
264 function TStoneGrid.NextStone(Player: TPlayer): TPoint;
265 var
266 i, j, m, n: integer;
267 begin
268 n := -1;
269 for i := 0 to Count - 1 do
270 begin
271 for j := 0 to Count - 1 do
272 begin
273 m := CalScore(Player, i, j);
274 if (n = -1) or ((m > -1) and (n > m)) then
275 begin
276 n := m;
277 result := Point(i, j);
278 end;
279 end;
280 end;
281 if n = -1 then
282 begin
283 result := Point(-1, -1);
284 end;
285 end;
286
287 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
288 begin
289 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
290 begin
291 FStrings[X, Y] := Value;
292 end;
293 end;
294
295 procedure TStoneGrid.SetTurnNumber(const Value: integer);
296 begin
297 if Value > FTurnIndex then
298 begin
299 FTurnNumber := FTurnIndex;
300 end
301 else
302 begin
303 FTurnNumber := Value;
304 end;
305 FStrings := FBuffer[FTurnNumber];
306 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 Index := Player2;
319 end
320 else
321 begin
322 Index := Player1;
323 end;
324 end;
325 function Execute: Boolean;
326 var
327 i, j: integer;
328 begin
329 result := false;
330 for i := 0 to Count - 1 do
331 begin
332 for j := 0 to Count - 1 do
333 begin
334 if StoneGrid.CanSetStone(Index, i, j, false) = true then
335 begin
336 result := true;
337 break;
338 end;
339 end;
340 if result = true then
341 begin
342 break;
343 end;
344 end;
345 end;
346
347 begin
348 StoneGrid.BackUp;
349 Main;
350 if Execute = false then
351 begin
352 Main;
353 if Execute = false then
354 begin
355 Timer1.Enabled := false;
356 Active := false;
357 m := 0;
358 n := 0;
359 for i := 0 to Count - 1 do
360 begin
361 for j := 0 to Count - 1 do
362 begin
363 case StoneGrid[i, j] of
364 stBlack:
365 inc(m);
366 stWhite:
367 inc(n);
368 end;
369 end;
370 end;
371 if m > n then
372 begin
373 s := 'Player1 Win:' + #13#10;
374 end
375 else if m < n then
376 begin
377 s := 'Player2 Win:' + #13#10;
378 end
379 else
380 begin
381 s := 'Draw:' + #13#10;
382 end;
383 Showmessage(s + '(Player1) ' + IntToStr(m) + '(Player2) ' + IntToStr(n));
384 end;
385 end;
386 end;
387
388 procedure TForm1.CheckGame;
389 var
390 i, j, m, n: integer;
391 s: string;
392 begin
393 m := 0;
394 n := 0;
395 for i := 0 to Count - 1 do
396 begin
397 for j := 0 to Count - 1 do
398 begin
399 case StoneGrid.Strings[i, j] of
400 stWhite:
401 inc(m);
402 stBlack:
403 inc(n);
404 end;
405 end;
406 end;
407 if (m = 0) or (n = 0) or (m + n = Count * Count) then
408 begin
409 if n > m then
410 begin
411 s := 'Player1 Win' + #13#10;
412 end
413 else if n < m then
414 begin
415 s := 'Player2 Win' + #13#10;
416 end
417 else
418 begin
419 s := 'draw' + #13#10;
420 end;
421 Timer1.Enabled := false;
422 Active := false;
423 Showmessage(s + '(Player1) ' + IntToStr(n) + #13#10 + '(Player2) ' +
424 IntToStr(m));
425 end
426 else
427 begin
428 ChangePlayer;
429 end;
430 end;
431
432 procedure TForm1.CompStone;
433 var
434 s: TPoint;
435 begin
436 s := StoneGrid.NextStone(Index);
437 StoneGrid.CanSetStone(Index, s.X, s.Y, true);
438 FormPaint(nil);
439 CheckGame;
440 end;
441
442 procedure TForm1.GameStart;
443 begin
444 StoneGrid.Clear;
445 StoneGrid.BackUp;
446 FormPaint(nil);
447 Index := Player1;
448 Active := true;
449 Timer1.Enabled := true;
450 end;
451
452 procedure TForm1.FormCreate(Sender: TObject);
453 begin
454 StoneGrid := TStoneGrid.Create;
455 Player1 := TPlayer.Create;
456 Player2 := TPlayer.Create;
457 Player2.Auto := true;
458 GameStart;
459 end;
460
461 procedure TForm1.FormDestroy(Sender: TObject);
462 begin
463 StoneGrid.Free;
464 Player1.Free;
465 Player2.Free;
466 end;
467
468 procedure TForm1.FormPaint(Sender: TObject);
469 var
470 i, j: integer;
471 begin
472 Canvas.Brush.Color := clWhite;
473 Canvas.Rectangle(0, 0, Count * Size, Count * Size);
474 for i := 0 to Count - 1 do
475 begin
476 Canvas.MoveTo(i * Size, 0);
477 Canvas.LineTo(i * Size, Size * Count);
478 for j := 0 to Count - 1 do
479 begin
480 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 end;
494 end;
495 end;
496 end;
497
498 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
499 Shift: TShiftState; X, Y: integer);
500 begin
501 if (Active = true) and (Index.Auto = false) and (X <= Count * Size) and
502 (Y <= Count * Size) then
503 begin
504 X := X div Size;
505 Y := Y div Size;
506 if StoneGrid.CanSetStone(Index, X, Y, true) = true then
507 begin
508 FormPaint(Sender);
509 CheckGame;
510 end;
511 end;
512 end;
513
514 procedure TForm1.Timer1Timer(Sender: TObject);
515 begin
516 if (Active = true) and (Index.Auto = true) then
517 begin
518 Timer1.Enabled := false;
519 CompStone;
520 Timer1.Enabled := true;
521 end;
522 end;
523
524 procedure TForm1.FormResize(Sender: TObject);
525 begin
526 Size := Min(ClientWidth, ClientHeight) div Count;
527 FormPaint(Sender);
528 end;
529
530 procedure TForm1.Player(Sender: TObject);
531 begin
532 (Sender as TMenuItem).Checked := not(Sender as TMenuItem).Checked;
533 if Sender = Player11 then
534 begin
535 Player1.Auto := Player11.Checked;
536 end
537 else
538 begin
539 Player2.Auto := Player21.Checked;
540 end;
541 end;
542
543 procedure TForm1.Start1Click(Sender: TObject);
544 begin
545 GameStart;
546 end;
547
548 procedure TForm1.End1Click(Sender: TObject);
549 begin
550 Close;
551 end;
552
553 end.

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