Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (show annotations) (download) (as text)
Sun Jul 12 09:24:51 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 11333 byte(s)
ちょこちょこっとエラー修正

多分これで最後のコミット
1 unit Unit1;
2
3 interface
4
5 uses
6 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
11 const
12 Count = 8;
13
14 type
15 TStoneType = (stNone, stWhite, stBlack, stError);
16
17 TGridData = array [0 .. Count - 1] of array [0 .. Count - 1] of TStoneType;
18
19 TPlayer = class
20 private
21 FAuto: Boolean;
22 FStone: TStoneType;
23 public
24 property Auto: Boolean read FAuto write FAuto;
25 property Stone: TStoneType read FStone write FStone;
26 end;
27
28 TStoneGrid = class
29 private
30 FStrings: TGridData;
31 FBuffer: array [1 .. Count * Count - 4] of TGridData;
32 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 function CanSetStone(Player: TPlayer; X, Y: integer;
42 Reverse: Boolean): Boolean;
43 function NextStone(Player: TPlayer): TPoint;
44 property Strings[X, Y: integer]: TStoneType read GetStrings
45 write SetStrings; default;
46 property TurnNumber: integer read FTurnNumber write SetTurnNumber;
47 end;
48
49 TForm1 = class(TForm)
50 Timer1: TTimer;
51 MainMenu1: TMainMenu;
52 MenuItem1: TMenuItem;
53 MenuItem2: TMenuItem;
54 MenuItem3: TMenuItem;
55 MenuItem4: TMenuItem;
56 MenuItem5: TMenuItem;
57 MenuItem6: TMenuItem;
58 MenuItem7: TMenuItem;
59 PaintBox1: TPaintBox;
60 procedure FormCreate(Sender: TObject);
61 procedure FormDestroy(Sender: TObject);
62 procedure Timer1Timer(Sender: TObject);
63 procedure FormResize(Sender: TObject);
64 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 private
72 { Private ���� }
73 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 { Public ���� }
83 end;
84
85 var
86 Player1: TPlayer;
87 Player2: TPlayer;
88
89 Form1: TForm1;
90
91 implementation
92
93 {$R *.fmx}
94 { TStoneGrid }
95
96 procedure TStoneGrid.BackUp;
97 begin
98 FBuffer[FTurnNumber] := FStrings;
99 if FTurnNumber < Count * Count - 4 then
100 begin
101 inc(FTurnNumber);
102 FTurnIndex := FTurnNumber;
103 FBuffer[FTurnNumber] := FStrings;
104 end;
105 end;
106
107 function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer;
108 var
109 i, j: integer;
110 begin
111 if CanSetStone(Player, X, Y, true) = true then
112 begin
113 if Player = Player1 then
114 Player := Player2
115 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 begin
126 FStrings := FBuffer[FTurnNumber];
127 result := -1;
128 end;
129 end;
130
131 function TStoneGrid.CanSetStone(Player: TPlayer; X, Y: integer;
132 Reverse: Boolean): Boolean;
133 var
134 i: integer;
135 p: Boolean;
136 procedure Method(m, n: integer);
137 var
138 s: TStoneType;
139 j: integer;
140 begin
141 if p = false then
142 Exit;
143 i := 1;
144 while true do
145 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 begin
155 for j := 1 to i - 1 do
156 SetStrings(X + m * j, Y + n * j, Player.Stone);
157 break;
158 end
159 else
160 begin
161 p := false;
162 break;
163 end;
164 end
165 else
166 break
167 else
168 inc(i);
169 end;
170 end;
171
172 begin
173 result := false;
174 if GetStrings(X, Y) = stNone then
175 begin
176 p := true;
177 if Player.Stone = stBlack then
178 begin
179 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 if (Reverse = true) and (result = true) then
188 begin
189 SetStrings(X, Y, stBlack);
190 end;
191 end
192 else
193 begin
194 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 if (Reverse = true) and (result = true) then
203 begin
204 Strings[X, Y] := stWhite;
205 end;
206 end;
207 end;
208 end;
209
210 procedure TStoneGrid.Clear;
211 var
212 i, j: integer;
213 begin
214 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 end;
224
225 function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
226 begin
227 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
228 result := FStrings[X, Y]
229 else
230 result := stError;
231 end;
232
233 function TStoneGrid.NextStone(Player: TPlayer): TPoint;
234 var
235 i, j, m, n: integer;
236 begin
237 n := -1;
238 for i := 0 to Count - 1 do
239 for j := 0 to Count - 1 do
240 begin
241 m := CalScore(Player, i, j);
242 if (n = -1) or ((m > -1) and (n > m)) then
243 begin
244 n := m;
245 result := Point(i, j);
246 end;
247 end;
248 if n = -1 then
249 result := Point(-1, -1);
250 end;
251
252 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
253 begin
254 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
255 FStrings[X, Y] := Value;
256 end;
257
258 procedure TStoneGrid.SetTurnNumber(const Value: integer);
259 begin
260 if Value > FTurnIndex then
261 FTurnNumber := FTurnIndex
262 else
263 FTurnNumber := Value;
264 FStrings := FBuffer[FTurnNumber];
265 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 Index := Player2
277 else
278 Index := Player1;
279 end;
280 function Execute: Boolean;
281 var
282 i, j: integer;
283 begin
284 result := false;
285 for i := 0 to Count - 1 do
286 begin
287 for j := 0 to Count - 1 do
288 if StoneGrid.CanSetStone(Index, i, j, false) = true then
289 begin
290 result := true;
291 break;
292 end;
293 if result = true then
294 break;
295 end;
296 end;
297
298 begin
299 StoneGrid.BackUp;
300 Main;
301 if Execute = false then
302 begin
303 Main;
304 if Execute = false then
305 begin
306 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 end;
318 if m > n then
319 s := 'Player1 Win:' + #13#10
320 else if m < n then
321 s := 'Player2 Win:' + #13#10
322 else
323 s := 'Draw:' + #13#10;
324 Showmessage(s + '(Player1) ' + IntToStr(m) + '(Player2) ' + IntToStr(n));
325 end;
326 end;
327 end;
328
329 procedure TForm1.CheckGame;
330 var
331 i, j, m, n: integer;
332 s: string;
333 begin
334 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 end;
344 if (m = 0) or (n = 0) or (m + n = Count * Count) then
345 begin
346 if n > m then
347 s := 'Player1 Win' + #13#10
348 else if n < m then
349 s := 'Player2 Win' + #13#10
350 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 end;
360
361 procedure TForm1.CompStone;
362 var
363 s: TPoint;
364 begin
365 s := StoneGrid.NextStone(Index);
366 StoneGrid.CanSetStone(Index, s.X, s.Y, true);
367 PaintBox1.Repaint;
368 CheckGame;
369 end;
370
371 procedure TForm1.GameStart;
372 begin
373 StoneGrid.Clear;
374 StoneGrid.BackUp;
375 PaintBox1.Repaint;
376 Index := Player1;
377 Active := true;
378 Timer1.Enabled := true;
379 end;
380
381 procedure TForm1.MenuItem2Click(Sender: TObject);
382 begin
383 GameStart;
384 end;
385
386 procedure TForm1.MenuItem4Click(Sender: TObject);
387 begin
388 Close;
389 end;
390
391 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 var
399 i, j: integer;
400 begin
401 Size := ClientHeight div Count;
402 Canvas.Fill.Color := TAlphaColors.White;
403 Canvas.FillRect(RectF(0, 0, Count * Size, Count * Size), 0, 0, [], 1);
404 for i := 0 to Count do
405 begin
406 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
407 for j := 0 to Count do
408 begin
409 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
410 case StoneGrid.Strings[i, j] of
411 stWhite:
412 Canvas.DrawEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
413 (j + 1) * Size), 1);
414 stBlack:
415 begin
416 Canvas.Fill.Color := TAlphaColors.Black;
417 Canvas.FillEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
418 (j + 1) * Size), 1);
419 end;
420 end;
421 end;
422 end;
423 end;
424
425 procedure TForm1.FormCreate(Sender: TObject);
426 begin
427 StoneGrid := TStoneGrid.Create;
428 Player1 := TPlayer.Create;
429 Player2 := TPlayer.Create;
430 Player1.Stone := stBlack;
431 Player2.Stone := stWhite;
432 Player2.Auto := true;
433 with PaintBox1.Canvas do
434 begin
435 StrokeDash := TStrokeDash.Solid;
436 Stroke.Color := TAlphaColors.Black;
437 StrokeThickness := 3;
438 end;
439 GameStart;
440 end;
441
442 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 procedure TForm1.Timer1Timer(Sender: TObject);
456 begin
457 if (Active = true) and (Index.Auto = true) then
458 begin
459 Timer1.Enabled := false;
460 CompStone;
461 Timer1.Enabled := true;
462 end;
463 end;
464
465 procedure TForm1.FormResize(Sender: TObject);
466 begin
467 Size := Min(ClientWidth, ClientHeight) div Count;
468 PaintTo(Canvas);
469 end;
470
471 procedure TForm1.FormTap(Sender: TObject; const Point: TPointF);
472 begin
473 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 end;
484
485 end.

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