Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show annotations) (download) (as text)
Tue Jul 14 00:24:36 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12164 byte(s)
盤の外をクリックした場合にFTurnNumberが実態から離れる問題を訂正しました

一連のエラーは確認してみますが終わってくれそうです

インデントの微調整をしました
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 [0 .. Count * Count - 4] of TGridData;
32 FTurnNumber: integer;
33 FTurnIndex: integer;
34 FActive: Boolean;
35 function GetStrings(X, Y: integer): TStoneType;
36 procedure SetStrings(X, Y: integer; const Value: TStoneType);
37 procedure SetTurnNumber(const Value: integer);
38 public
39 procedure Clear;
40 function CalScore(Stone: TStoneType; X, Y: integer): integer;
41 function CanSetStone(Stone: TStoneType; X, Y: integer; Reverse: Boolean;
42 const Visible: Boolean = false): Boolean;
43 function NextStone(Stone: TStoneType): TPoint;
44 procedure Start;
45 procedure Restart;
46 procedure Pause;
47 property Strings[X, Y: integer]: TStoneType read GetStrings
48 write SetStrings; default;
49 property TurnNumber: integer read FTurnNumber write SetTurnNumber;
50 property Active: Boolean read FActive;
51 end;
52
53 TForm1 = class(TForm)
54 Timer1: TTimer;
55 MainMenu1: TMainMenu;
56 MenuItem1: TMenuItem;
57 MenuItem2: TMenuItem;
58 MenuItem3: TMenuItem;
59 MenuItem4: TMenuItem;
60 MenuItem5: TMenuItem;
61 MenuItem6: TMenuItem;
62 MenuItem7: TMenuItem;
63 PaintBox1: TPaintBox;
64 MenuItem8: TMenuItem;
65 MenuItem9: TMenuItem;
66 MenuItem10: TMenuItem;
67 MenuItem11: TMenuItem;
68 MenuItem12: TMenuItem;
69 procedure FormCreate(Sender: TObject);
70 procedure FormDestroy(Sender: TObject);
71 procedure Timer1Timer(Sender: TObject);
72 procedure FormResize(Sender: TObject);
73 procedure MenuItem4Click(Sender: TObject);
74 procedure MenuItem2Click(Sender: TObject);
75 procedure PaintBox1Tap(Sender: TObject; const Point: TPointF);
76 procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
77 Shift: TShiftState; X, Y: Single);
78 procedure PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
79 procedure MenuItem6Click(Sender: TObject);
80 procedure PaintBox1Resize(Sender: TObject);
81 procedure MenuItem8Click(Sender: TObject);
82 procedure MenuItem10Click(Sender: TObject);
83 procedure MenuItem11Click(Sender: TObject);
84 private
85 { Private ���� }
86 StoneGrid: TStoneGrid;
87 Index: TPlayer;
88 Size: integer;
89 procedure CompStone;
90 procedure GameStart;
91 procedure ChangePlayer;
92 public
93 { Public ���� }
94 end;
95
96 var
97 Player1: TPlayer;
98 Player2: TPlayer;
99
100 Form1: TForm1;
101
102 implementation
103
104 {$R *.fmx}
105 {$R *.Windows.fmx MSWINDOWS}
106 { TStoneGrid }
107
108 function TStoneGrid.CalScore(Stone: TStoneType; X, Y: integer): integer;
109 var
110 i, j: integer;
111 begin
112 if CanSetStone(Stone, X, Y, true) = true then
113 begin
114 if Stone = stBlack then
115 Stone := stWhite
116 else
117 Stone := stBlack;
118 result := 0;
119 for i := 0 to Count - 1 do
120 for j := 0 to Count - 1 do
121 if CanSetStone(Stone, i, j, false) = true then
122 inc(result);
123 FStrings := FBuffer[FTurnIndex];
124 end
125 else
126 begin
127 FStrings := FBuffer[FTurnIndex];
128 result := -1;
129 end;
130 end;
131
132 function TStoneGrid.CanSetStone(Stone: TStoneType; X, Y: integer;
133 Reverse: Boolean; const Visible: Boolean): Boolean;
134 var
135 i, k: integer;
136 p: Boolean;
137 q: ^TPoint;
138 list: TList;
139 procedure Method(m, n: integer);
140 var
141 s: TStoneType;
142 j: integer;
143 begin
144 if p = false then
145 Exit;
146 i := 1;
147 while true do
148 begin
149 s := GetStrings(X + m * i, Y + n * i);
150 if (s = stNone) or (s = stError) then
151 break
152 else if s = Stone then
153 if i > 1 then
154 begin
155 result := true;
156 if Reverse = true then
157 begin
158 for j := 1 to i - 1 do
159 begin
160 New(q);
161 q^ := Point(X + m * j, Y + n * j);
162 list.Add(q);
163 end;
164 break;
165 end
166 else
167 begin
168 p := false;
169 break;
170 end;
171 end
172 else
173 break
174 else
175 inc(i);
176 end;
177 end;
178
179 begin
180 list := TList.Create;
181 try
182 result := false;
183 p := true;
184 if GetStrings(X, Y) = stNone then
185 begin
186 Method(-1, -1);
187 Method(-1, 0);
188 Method(-1, 1);
189 Method(0, -1);
190 Method(0, 1);
191 Method(1, -1);
192 Method(1, 0);
193 Method(1, 1);
194 if (Reverse = true) and (result = true) then
195 begin
196 SetStrings(X, Y, Stone);
197 for i := 0 to list.Count - 1 do
198 begin
199 if Visible = true then
200 begin
201 for k := 1 to 10 do
202 begin
203 Sleep(10);
204 Application.ProcessMessages;
205 end;
206 Form1.PaintBox1.Repaint;
207 end;
208 q := list[i];
209 SetStrings(q^.X, q^.Y, Stone);
210 end;
211 end;
212 end;
213 finally
214 for i := 0 to list.Count - 1 do
215 Dispose(list[i]);
216 list.Free;
217 end;
218 if (Visible = true)and(result = true) then
219 begin
220 inc(FTurnIndex);
221 inc(FTurnNumber);
222 FBuffer[FTurnIndex] := FStrings;
223 end;
224 end;
225
226 procedure TStoneGrid.Clear;
227 var
228 i, j: integer;
229 begin
230 for i := 0 to Count - 1 do
231 for j := 0 to Count - 1 do
232 Strings[i, j] := stNone;
233 Strings[3, 3] := stBlack;
234 Strings[4, 4] := stBlack;
235 Strings[4, 3] := stWhite;
236 Strings[3, 4] := stWhite;
237 FTurnNumber := 0;
238 FTurnIndex := 0;
239 FBuffer[0] := FStrings;
240 end;
241
242 function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
243 begin
244 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
245 result := FStrings[X, Y]
246 else
247 result := stError;
248 end;
249
250 function TStoneGrid.NextStone(Stone: TStoneType): TPoint;
251 var
252 i, j, m, n: integer;
253 begin
254 n := -1;
255 for i := 0 to Count - 1 do
256 for j := 0 to Count - 1 do
257 begin
258 m := CalScore(Stone, i, j);
259 if (n = -1) or ((m > -1) and (n > m)) then
260 begin
261 n := m;
262 result := Point(i, j);
263 end;
264 end;
265 if n = -1 then
266 result := Point(-1, -1);
267 end;
268
269 procedure TStoneGrid.Pause;
270 begin
271 FActive := false;
272 end;
273
274 procedure TStoneGrid.Restart;
275 begin
276 FActive := true;
277 FTurnIndex := FTurnNumber;
278 end;
279
280 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
281 begin
282 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
283 FStrings[X, Y] := Value;
284 end;
285
286 procedure TStoneGrid.SetTurnNumber(const Value: integer);
287 begin
288 if Value > FTurnIndex then
289 FTurnNumber := FTurnIndex
290 else if Value < 0 then
291 FTurnNumber := 0
292 else
293 FTurnNumber := Value;
294 FActive := false;
295 FStrings := FBuffer[FTurnNumber];
296 end;
297
298 procedure TStoneGrid.Start;
299 begin
300 Clear;
301 FActive := true;
302 end;
303
304 { TForm1 }
305
306 procedure TForm1.ChangePlayer;
307 var
308 i, j, m, n: integer;
309 s: string;
310 procedure Main;
311 begin
312 if Index = Player1 then
313 Index := Player2
314 else
315 Index := Player1;
316 end;
317 function Execute: Boolean;
318 var
319 i, j: integer;
320 begin
321 result := false;
322 for i := 0 to Count - 1 do
323 for j := 0 to Count - 1 do
324 if StoneGrid.CanSetStone(Index.Stone, i, j, false) = true then
325 begin
326 result := true;
327 Exit;
328 end;
329 end;
330
331 begin
332 Main;
333 if Execute = false then
334 begin
335 Main;
336 if Execute = false then
337 begin
338 StoneGrid.Pause;
339 Timer1.Enabled := false;
340 m := 0;
341 n := 0;
342 for i := 0 to Count - 1 do
343 for j := 0 to Count - 1 do
344 case StoneGrid[i, j] of
345 stBlack:
346 inc(m);
347 stWhite:
348 inc(n);
349 end;
350 if m > n then
351 s := 'Player1 Win:' + #13#10
352 else if m < n then
353 s := 'Player2 Win:' + #13#10
354 else
355 s := 'Draw:' + #13#10;
356 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
357 IntToStr(n));
358 end;
359 end;
360 end;
361
362 procedure TForm1.CompStone;
363 var
364 s: TPoint;
365 begin
366 s := StoneGrid.NextStone(Index.Stone);
367 StoneGrid.CanSetStone(Index.Stone, s.X, s.Y, true, true);
368 PaintBox1.Repaint;
369 ChangePlayer;
370 end;
371
372 procedure TForm1.GameStart;
373 begin
374 StoneGrid.Start;
375 PaintBox1.Repaint;
376 Index := Player1;
377 Timer1.Enabled := true;
378 end;
379
380 procedure TForm1.MenuItem10Click(Sender: TObject);
381 begin
382 StoneGrid.Restart;
383 Timer1.Enabled := true;
384 end;
385
386 procedure TForm1.MenuItem11Click(Sender: TObject);
387 begin
388 Timer1.Enabled := false;
389 with StoneGrid do
390 if Sender = MenuItem11 then
391 TurnNumber := TurnNumber + 1
392 else
393 TurnNumber := TurnNumber - 1;
394 ChangePlayer;
395 PaintBox1.Repaint;
396 end;
397
398 procedure TForm1.MenuItem2Click(Sender: TObject);
399 begin
400 GameStart;
401 end;
402
403 procedure TForm1.MenuItem4Click(Sender: TObject);
404 begin
405 Close;
406 end;
407
408 procedure TForm1.MenuItem6Click(Sender: TObject);
409 begin
410 Player1.Auto := MenuItem6.IsChecked;
411 Player2.Auto := MenuItem7.IsChecked;
412 MenuItem10Click(Sender);
413 end;
414
415 procedure TForm1.MenuItem8Click(Sender: TObject);
416 begin
417 StoneGrid.Pause;
418 Timer1.Enabled := false;
419 end;
420
421 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
422 var
423 i, j: integer;
424 begin
425 Canvas.Fill.Color := TAlphaColors.White;
426 Canvas.FillRect(RectF(0, 0, Count * Size, Count * Size), 0, 0, [], 1);
427 for i := 0 to Count do
428 begin
429 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
430 for j := 0 to Count do
431 begin
432 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
433 case StoneGrid.Strings[i, j] of
434 stWhite:
435 Canvas.DrawEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
436 (j + 1) * Size), 1);
437 stBlack:
438 begin
439 Canvas.Fill.Color := TAlphaColors.Black;
440 Canvas.FillEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
441 (j + 1) * Size), 1);
442 end;
443 end;
444 end;
445 end;
446 end;
447
448 procedure TForm1.PaintBox1Resize(Sender: TObject);
449 begin
450 Size := Min(ClientWidth, ClientHeight) div Count;
451 end;
452
453 procedure TForm1.FormCreate(Sender: TObject);
454 begin
455 StoneGrid := TStoneGrid.Create;
456 Player1 := TPlayer.Create;
457 Player2 := TPlayer.Create;
458 Player1.Stone := stBlack;
459 Player2.Stone := stWhite;
460 Player2.Auto := true;
461 with PaintBox1.Canvas do
462 begin
463 StrokeDash := TStrokeDash.Solid;
464 Stroke.Color := TAlphaColors.Black;
465 StrokeThickness := 3;
466 end;
467 PaintBox1Resize(Sender);
468 GameStart;
469 end;
470
471 procedure TForm1.FormDestroy(Sender: TObject);
472 begin
473 StoneGrid.Free;
474 Player1.Free;
475 Player2.Free;
476 end;
477
478 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
479 Shift: TShiftState; X, Y: Single);
480 begin
481 PaintBox1Tap(Sender, PointF(X, Y));
482 end;
483
484 procedure TForm1.Timer1Timer(Sender: TObject);
485 begin
486 if (StoneGrid.Active = true) and (Index.Auto = true) then
487 begin
488 Timer1.Enabled := false;
489 CompStone;
490 Timer1.Enabled := true;
491 end;
492 end;
493
494 procedure TForm1.FormResize(Sender: TObject);
495 begin
496 Size := Min(ClientWidth, ClientHeight) div Count;
497 PaintTo(Canvas);
498 end;
499
500 procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF);
501 begin
502 if Index.Auto = false then
503 begin
504 MenuItem10Click(Sender);
505 if StoneGrid.CanSetStone(Index.Stone, Floor(Point.X / Size),
506 Floor(Point.Y / Size), true, true) = true then
507 begin
508 PaintBox1.Repaint;
509 ChangePlayer;
510 end;
511 end;
512 end;
513
514 end.

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