Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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