Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (show annotations) (download) (as text)
Mon Jul 13 11:09:42 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 12110 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 [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 end;
195 if (Reverse = true) and (result = true) then
196 begin
197 SetStrings(X, Y, Stone);
198 for i := 0 to list.Count - 1 do
199 begin
200 if Visible = true then
201 begin
202 for k := 1 to 10 do
203 begin
204 Sleep(10);
205 Application.ProcessMessages;
206 end;
207 Form1.PaintBox1.Repaint;
208 end;
209 q := list[i];
210 SetStrings(q^.X, q^.Y, Stone);
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 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
291 FTurnNumber := Value;
292 FActive := false;
293 FStrings := FBuffer[FTurnNumber];
294 end;
295
296 procedure TStoneGrid.Start;
297 begin
298 Clear;
299 FActive := true;
300 end;
301
302 { TForm1 }
303
304 procedure TForm1.ChangePlayer;
305 var
306 i, j, m, n: integer;
307 s: string;
308 procedure Main;
309 begin
310 if Index = Player1 then
311 Index := Player2
312 else
313 Index := Player1;
314 end;
315 function Execute: Boolean;
316 var
317 i, j: integer;
318 begin
319 result := false;
320 for i := 0 to Count - 1 do
321 begin
322 for j := 0 to Count - 1 do
323 if StoneGrid.CanSetStone(Index.Stone, i, j, false) = true then
324 begin
325 result := true;
326 break;
327 end;
328 if result = true then
329 break;
330 end;
331 end;
332
333 begin
334 Main;
335 if Execute = false then
336 begin
337 Main;
338 if Execute = false then
339 begin
340 StoneGrid.Pause;
341 Timer1.Enabled := false;
342 m := 0;
343 n := 0;
344 for i := 0 to Count - 1 do
345 for j := 0 to Count - 1 do
346 case StoneGrid[i, j] of
347 stBlack:
348 inc(m);
349 stWhite:
350 inc(n);
351 end;
352 if m > n then
353 s := 'Player1 Win:' + #13#10
354 else if m < n then
355 s := 'Player2 Win:' + #13#10
356 else
357 s := 'Draw:' + #13#10;
358 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
359 IntToStr(n));
360 end;
361 end;
362 end;
363
364 procedure TForm1.CompStone;
365 var
366 s: TPoint;
367 begin
368 s := StoneGrid.NextStone(Index.Stone);
369 StoneGrid.CanSetStone(Index.Stone, s.X, s.Y, true, true);
370 PaintBox1.Repaint;
371 ChangePlayer;
372 end;
373
374 procedure TForm1.GameStart;
375 begin
376 StoneGrid.Start;
377 PaintBox1.Repaint;
378 Index := Player1;
379 Timer1.Enabled := true;
380 end;
381
382 procedure TForm1.MenuItem10Click(Sender: TObject);
383 begin
384 StoneGrid.Restart;
385 Timer1.Enabled := true;
386 end;
387
388 procedure TForm1.MenuItem11Click(Sender: TObject);
389 begin
390 Timer1.Enabled := false;
391 with StoneGrid do
392 if Sender = MenuItem11 then
393 TurnNumber := TurnNumber + 1
394 else
395 TurnNumber := TurnNumber - 1;
396 PaintBox1.Repaint;
397 end;
398
399 procedure TForm1.MenuItem2Click(Sender: TObject);
400 begin
401 GameStart;
402 end;
403
404 procedure TForm1.MenuItem4Click(Sender: TObject);
405 begin
406 Close;
407 end;
408
409 procedure TForm1.MenuItem6Click(Sender: TObject);
410 begin
411 Player1.Auto := MenuItem6.IsChecked;
412 Player2.Auto := MenuItem7.IsChecked;
413 MenuItem10Click(Sender);
414 end;
415
416 procedure TForm1.MenuItem8Click(Sender: TObject);
417 begin
418 StoneGrid.Pause;
419 Timer1.Enabled := false;
420 end;
421
422 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
423 var
424 i, j: integer;
425 begin
426 Canvas.Fill.Color := TAlphaColors.White;
427 Canvas.FillRect(RectF(0, 0, Count * Size, Count * Size), 0, 0, [], 1);
428 for i := 0 to Count do
429 begin
430 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
431 for j := 0 to Count do
432 begin
433 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
434 case StoneGrid.Strings[i, j] of
435 stWhite:
436 Canvas.DrawEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
437 (j + 1) * Size), 1);
438 stBlack:
439 begin
440 Canvas.Fill.Color := TAlphaColors.Black;
441 Canvas.FillEllipse(RectF(i * Size, j * Size, (i + 1) * Size,
442 (j + 1) * Size), 1);
443 end;
444 end;
445 end;
446 end;
447 end;
448
449 procedure TForm1.PaintBox1Resize(Sender: TObject);
450 begin
451 Size := Min(ClientWidth, ClientHeight) div Count;
452 end;
453
454 procedure TForm1.FormCreate(Sender: TObject);
455 begin
456 StoneGrid := TStoneGrid.Create;
457 Player1 := TPlayer.Create;
458 Player2 := TPlayer.Create;
459 Player1.Stone := stBlack;
460 Player2.Stone := stWhite;
461 Player2.Auto := true;
462 with PaintBox1.Canvas do
463 begin
464 StrokeDash := TStrokeDash.Solid;
465 Stroke.Color := TAlphaColors.Black;
466 StrokeThickness := 3;
467 end;
468 PaintBox1Resize(Sender);
469 GameStart;
470 end;
471
472 procedure TForm1.FormDestroy(Sender: TObject);
473 begin
474 StoneGrid.Free;
475 Player1.Free;
476 Player2.Free;
477 end;
478
479 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
480 Shift: TShiftState; X, Y: Single);
481 begin
482 PaintBox1Tap(Sender, PointF(X, Y));
483 end;
484
485 procedure TForm1.Timer1Timer(Sender: TObject);
486 begin
487 if (StoneGrid.Active = true) and (Index.Auto = true) then
488 begin
489 Timer1.Enabled := false;
490 CompStone;
491 Timer1.Enabled := true;
492 end;
493 end;
494
495 procedure TForm1.FormResize(Sender: TObject);
496 begin
497 Size := Min(ClientWidth, ClientHeight) div Count;
498 PaintTo(Canvas);
499 end;
500
501 procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF);
502 begin
503 if Index.Auto = false then
504 begin
505 MenuItem10Click(Sender);
506 if StoneGrid.CanSetStone(Index.Stone, Floor(Point.X / Size),
507 Floor(Point.Y / Size), true, true) = true then
508 begin
509 PaintBox1.Repaint;
510 ChangePlayer;
511 end;
512 end;
513 end;
514
515 end.

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