Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (show annotations) (download) (as text)
Mon Jul 13 09:00:57 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12233 byte(s)
FTurnIndex,FTurnNumberの使い方をシンプルにした

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

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