Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 26 - (show annotations) (download) (as text)
Mon Jul 20 07:09:07 2015 UTC (8 years, 8 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 15946 byte(s)
NextStone関数の定義変更を行いました

だいぶ良くなった感じです
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, stEffect);
16
17 TEffectData = record
18 X, Y: integer;
19 Left, Top: integer;
20 end;
21
22 TGridData = array [0 .. Count - 1] of array [0 .. Count - 1] of TStoneType;
23
24 TPlayer = class
25 private
26 FAuto: Boolean;
27 FStone: TStoneType;
28 public
29 property Auto: Boolean read FAuto write FAuto;
30 property Stone: TStoneType read FStone write FStone;
31 end;
32
33 TStoneGrid = class
34 private
35 FStrings: TGridData;
36 FBuffer: array [0 .. Count * Count - 4] of TGridData;
37 FTurnNumber: integer;
38 FTurnIndex: integer;
39 FActive: Boolean;
40 FList: TList;
41 FEffectStone: TStoneType;
42 FBool: Boolean;
43 FTerminated: Boolean;
44 FIndex_X: integer;
45 FIndex_Y: integer;
46 function GetStrings(X, Y: integer): TStoneType;
47 procedure SetStrings(X, Y: integer; const Value: TStoneType);
48 procedure SetTurnNumber(const Value: integer);
49 public
50 constructor Create;
51 destructor Destroy; override;
52 procedure Clear;
53 function CalScore(Stone: TStoneType; X, Y: integer): integer;
54 function CanSetStone(Stone: TStoneType; X, Y: integer; Reverse: Boolean;
55 const Visible: Boolean = false): Boolean;
56 function NextStone(Stone: TStoneType; var Pos: TPoint): Boolean;
57 procedure Start;
58 procedure Restart;
59 procedure Pause;
60 function ListExecute: Boolean;
61 procedure Paint(Canvas: TCanvas);
62 procedure ImageCount(X, Y: integer);
63 property Strings[X, Y: integer]: TStoneType read GetStrings
64 write SetStrings; default;
65 property TurnNumber: integer read FTurnNumber write SetTurnNumber;
66 property Active: Boolean read FActive;
67 end;
68
69 TForm1 = class(TForm)
70 Timer1: TTimer;
71 MainMenu1: TMainMenu;
72 MenuItem1: TMenuItem;
73 MenuItem2: TMenuItem;
74 MenuItem3: TMenuItem;
75 MenuItem4: TMenuItem;
76 MenuItem5: TMenuItem;
77 MenuItem6: TMenuItem;
78 MenuItem7: TMenuItem;
79 PaintBox1: TPaintBox;
80 MenuItem8: TMenuItem;
81 MenuItem9: TMenuItem;
82 MenuItem10: TMenuItem;
83 MenuItem11: TMenuItem;
84 MenuItem12: TMenuItem;
85 Timer2: TTimer;
86 Image1: TImage;
87 Image2: TImage;
88 Image3: TImage;
89 Image4: TImage;
90 Image5: TImage;
91 procedure FormCreate(Sender: TObject);
92 procedure FormDestroy(Sender: TObject);
93 procedure Timer1Timer(Sender: TObject);
94 procedure FormResize(Sender: TObject);
95 procedure MenuItem4Click(Sender: TObject);
96 procedure MenuItem2Click(Sender: TObject);
97 procedure PaintBox1Tap(Sender: TObject; const Point: TPointF);
98 procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
99 Shift: TShiftState; X, Y: Single);
100 procedure PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
101 procedure MenuItem6Click(Sender: TObject);
102 procedure PaintBox1Resize(Sender: TObject);
103 procedure MenuItem8Click(Sender: TObject);
104 procedure MenuItem10Click(Sender: TObject);
105 procedure MenuItem11Click(Sender: TObject);
106 procedure Timer2Timer(Sender: TObject);
107 procedure FormDeactivate(Sender: TObject);
108 procedure FormActivate(Sender: TObject);
109 private
110 { Private ���� }
111 StoneGrid: TStoneGrid;
112 Index: TPlayer;
113 Size: integer;
114 procedure CompStone;
115 procedure GameStart;
116 procedure ChangePlayer;
117 public
118 { Public ���� }
119 end;
120
121 var
122 Player1: TPlayer;
123 Player2: TPlayer;
124
125 Form1: TForm1;
126
127 implementation
128
129 {$R *.fmx}
130 {$R *.Windows.fmx MSWINDOWS}
131 { TStoneGrid }
132
133 function TStoneGrid.CalScore(Stone: TStoneType; X, Y: integer): integer;
134 var
135 i, j: integer;
136 begin
137 result := 0;
138 if CanSetStone(Stone, X, Y, true) = true then
139 begin
140 if Stone = stEffect then
141 Stone := FEffectStone;
142 case Stone of
143 stBlack:
144 Stone := stWhite;
145 stWhite:
146 Stone := stBlack;
147 else
148 Exit;
149 end;
150 for i := 0 to Count - 1 do
151 for j := 0 to Count - 1 do
152 if CanSetStone(Stone, i, j, false) = true then
153 inc(result);
154 end;
155 FStrings := FBuffer[FTurnIndex];
156 end;
157
158 function TStoneGrid.CanSetStone(Stone: TStoneType; X, Y: integer;
159 Reverse: Boolean; const Visible: Boolean): Boolean;
160 var
161 i: integer;
162 p: Boolean;
163 q: ^TEffectData;
164 procedure Method(m, n: integer);
165 var
166 s: TStoneType;
167 j, k: integer;
168 begin
169 if p = false then
170 Exit;
171 i := 1;
172 while true do
173 begin
174 s := GetStrings(X + m * i, Y + n * i);
175 if s = stEffect then
176 s := FEffectStone;
177 if (s = stNone) or (s = stError) then
178 break
179 else if s = Stone then
180 if i > 1 then
181 begin
182 if (result = false) and (Reverse = true) then
183 SetStrings(X, Y, Stone);
184 result := true;
185 if Reverse = true then
186 begin
187 for j := 1 to i - 1 do
188 begin
189 Form1.PaintBox1.Repaint;
190 if Visible = true then
191 begin
192 FEffectStone := Stone;
193 New(q);
194 q^.Left := X + m * j;
195 q^.Top := Y + n * j;
196 q^.X := 0;
197 q^.Y := 0;
198 FList.Add(q);
199 SetStrings(q^.Left, q^.Top, stEffect);
200 for k := 1 to 100 do
201 begin
202 Sleep(1);
203 Application.ProcessMessages;
204 end;
205 end
206 else
207 SetStrings(X + m * j, Y + n * j, Stone);
208 end;
209 break;
210 end
211 else
212 begin
213 p := false;
214 break;
215 end;
216 end
217 else
218 break
219 else
220 inc(i);
221 end;
222 end;
223
224 begin
225 result := false;
226 if Visible = true then
227 begin
228 FBool := FActive;
229 FActive := false;
230 end;
231 p := true;
232 if GetStrings(X, Y) = stNone then
233 begin
234 Method(-1, -1);
235 Method(-1, 0);
236 Method(-1, 1);
237 Method(0, -1);
238 Method(0, 1);
239 Method(1, -1);
240 Method(1, 0);
241 Method(1, 1);
242 end;
243 end;
244
245 procedure TStoneGrid.Clear;
246 var
247 i, j: integer;
248 begin
249 for i := 0 to FList.Count - 1 do
250 Dispose(FList[i]);
251 FList.Clear;
252 for i := 0 to Count - 1 do
253 for j := 0 to Count - 1 do
254 Strings[i, j] := stNone;
255 Strings[3, 3] := stBlack;
256 Strings[4, 4] := stBlack;
257 Strings[4, 3] := stWhite;
258 Strings[3, 4] := stWhite;
259 FTurnNumber := 0;
260 FTurnIndex := 0;
261 FBuffer[0] := FStrings;
262 end;
263
264 constructor TStoneGrid.Create;
265 begin
266 inherited;
267 FList := TList.Create;
268 end;
269
270 destructor TStoneGrid.Destroy;
271 var
272 i: integer;
273 begin
274 for i := 0 to FList.Count - 1 do
275 Dispose(FList[i]);
276 FList.Free;
277 inherited;
278 end;
279
280 function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
281 begin
282 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
283 result := FStrings[X, Y]
284 else
285 result := stError;
286 end;
287
288 procedure TStoneGrid.ImageCount(X, Y: integer);
289 begin
290 FIndex_X := X;
291 FIndex_Y := Y;
292 end;
293
294 function TStoneGrid.ListExecute: Boolean;
295 var
296 p: ^TEffectData;
297 i: integer;
298 begin
299 if FList.Count = 0 then
300 result := false
301 else
302 begin
303 for i := 0 to FList.Count - 1 do
304 begin
305 p := FList[i];
306 if p^.X < FIndex_X - 1 then
307 p^.X := p^.X + 1
308 else if p^.Y < FIndex_Y - 1 then
309 begin
310 p^.X := 0;
311 p^.Y := p^.Y + 1;
312 end
313 else
314 begin
315 SetStrings(p^.Left, p^.Top, FEffectStone);
316 Dispose(p);
317 FList[i] := nil;
318 end;
319 end;
320 for i := FList.Count - 1 downto 0 do
321 if FList[i] = nil then
322 FList.Delete(i);
323 if FList.Count = 0 then
324 begin
325 if FTerminated = true then
326 FActive := false
327 else
328 FActive := FBool;
329 inc(FTurnIndex);
330 inc(FTurnNumber);
331 FBuffer[FTurnIndex] := FStrings;
332 end;
333 result := true;
334 end;
335 end;
336
337 function TStoneGrid.NextStone(Stone: TStoneType; var Pos: TPoint): Boolean;
338 var
339 i, j, m, n: integer;
340 begin
341 n := 0;
342 for i := 0 to Count - 1 do
343 for j := 0 to Count - 1 do
344 begin
345 m := CalScore(Stone, i, j);
346 if ((n = 0) and (m > 0)) or ((0 < m) and (m < n)) then
347 begin
348 n := m;
349 Pos := Point(i, j);
350 end;
351 end;
352 result := not(n = 0);
353 end;
354
355 procedure TStoneGrid.Paint(Canvas: TCanvas);
356 var
357 i: integer;
358 k, m, n: integer;
359 s: TBitmap;
360 p: ^TEffectData;
361 begin
362 m := Form1.Image3.Bitmap.Width;
363 n := Form1.Image3.Bitmap.Height;
364 k := Form1.Size;
365 for i := 0 to FList.Count - 1 do
366 begin
367 p := FList[i];
368 if FEffectStone = stBlack then
369 s := Form1.Image1.Bitmap
370 else
371 s := Form1.Image2.Bitmap;
372 Canvas.DrawBitmap(s, RectF(p^.X * m, p^.Y * n, (p^.X + 1) * m,
373 (p^.Y + 1) * n), RectF(p^.Left * k, p^.Top * k, (p^.Left + 1) * k,
374 (p^.Top + 1) * k), 1);
375 end;
376 end;
377
378 procedure TStoneGrid.Pause;
379 begin
380 FActive := false;
381 FTerminated := true;
382 end;
383
384 procedure TStoneGrid.Restart;
385 begin
386 FActive := true;
387 FTurnIndex := FTurnNumber;
388 FTerminated := false;
389 end;
390
391 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
392 begin
393 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
394 FStrings[X, Y] := Value;
395 end;
396
397 procedure TStoneGrid.SetTurnNumber(const Value: integer);
398 begin
399 if Value > FTurnIndex then
400 FTurnNumber := FTurnIndex
401 else if Value < 0 then
402 FTurnNumber := 0
403 else
404 FTurnNumber := Value;
405 FStrings := FBuffer[FTurnNumber];
406 end;
407
408 procedure TStoneGrid.Start;
409 begin
410 Clear;
411 FTerminated := false;
412 FActive := true;
413 end;
414
415 { TForm1 }
416
417 procedure TForm1.ChangePlayer;
418 var
419 i, j, m, n: integer;
420 s: string;
421 procedure Main;
422 begin
423 if Index = Player1 then
424 begin
425 Index := Player2;
426 s := '������������';
427 end
428 else
429 begin
430 Index := Player1;
431 s := '������������';
432 end;
433 end;
434 function Execute: Boolean;
435 var
436 i, j: integer;
437 begin
438 for i := 0 to Count - 1 do
439 for j := 0 to Count - 1 do
440 if StoneGrid.CanSetStone(Index.Stone, i, j, false) = true then
441 begin
442 result := true;
443 Exit;
444 end;
445 result := false;
446 end;
447
448 begin
449 Main;
450 if Execute = false then
451 begin
452 Main;
453 if Execute = false then
454 begin
455 StoneGrid.Pause;
456 m := 0;
457 n := 0;
458 for i := 0 to Count - 1 do
459 for j := 0 to Count - 1 do
460 case StoneGrid[i, j] of
461 stBlack:
462 inc(m);
463 stWhite:
464 inc(n);
465 end;
466 Caption := s;
467 if m > n then
468 s := 'Player1 Win:' + #13#10
469 else if m < n then
470 s := 'Player2 Win:' + #13#10
471 else
472 s := 'Draw:' + #13#10;
473 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
474 IntToStr(n));
475 end
476 else
477 Caption := s;
478 end
479 else
480 Caption := s;
481 end;
482
483 procedure TForm1.CompStone;
484 var
485 s: TPoint;
486 begin
487 if StoneGrid.NextStone(Index.Stone, s) = true then
488 begin
489 StoneGrid.CanSetStone(Index.Stone, s.X, s.Y, true, true);
490 PaintBox1.Repaint;
491 ChangePlayer;
492 end;
493 end;
494
495 procedure TForm1.GameStart;
496 begin
497 Timer1.Enabled := false;
498 Index := Player1;
499 StoneGrid.Start;
500 PaintBox1.Repaint;
501 Caption := '�������n������';
502 Timer1.Enabled := true;
503 end;
504
505 procedure TForm1.MenuItem10Click(Sender: TObject);
506 begin
507 StoneGrid.Restart;
508 end;
509
510 procedure TForm1.MenuItem11Click(Sender: TObject);
511 var
512 i: integer;
513 begin
514 with StoneGrid do
515 begin
516 i := TurnNumber;
517 if Sender = MenuItem11 then
518 TurnNumber := TurnNumber + 1
519 else
520 TurnNumber := TurnNumber - 1;
521 if (i = TurnNumber) then
522 Exit
523 else
524 Pause;
525 end;
526 PaintBox1.Repaint;
527 ChangePlayer;
528 end;
529
530 procedure TForm1.MenuItem2Click(Sender: TObject);
531 begin
532 GameStart;
533 end;
534
535 procedure TForm1.MenuItem4Click(Sender: TObject);
536 begin
537 Close;
538 end;
539
540 procedure TForm1.MenuItem6Click(Sender: TObject);
541 begin
542 Player1.Auto := MenuItem6.IsChecked;
543 Player2.Auto := MenuItem7.IsChecked;
544 end;
545
546 procedure TForm1.MenuItem8Click(Sender: TObject);
547 begin
548 StoneGrid.Pause;
549 end;
550
551 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
552 var
553 i, j: integer;
554 begin
555 if StoneGrid.Active = false then
556 StoneGrid.Paint(Canvas);
557 for i := 0 to Count - 1 do
558 begin
559 for j := 0 to Count - 1 do
560 begin
561 case StoneGrid.Strings[i, j] of
562 stWhite:
563 Canvas.DrawBitmap(Image4.Bitmap, RectF(0, 0, Image4.Bitmap.Width,
564 Image4.Bitmap.Height), RectF(i * Size, j * Size, (i + 1) * Size,
565 (j + 1) * Size), 1);
566 stBlack:
567 Canvas.DrawBitmap(Image3.Bitmap, RectF(0, 0, Image3.Bitmap.Width,
568 Image3.Bitmap.Height), RectF(i * Size, j * Size, (i + 1) * Size,
569 (j + 1) * Size), 1);
570 stEffect:
571 continue;
572 else
573 Canvas.DrawBitmap(Image5.Bitmap, RectF(0, 0, Image5.Bitmap.Width,
574 Image5.Bitmap.Height), RectF(i * Size, j * Size, (i + 1) * Size,
575 (j + 1) * Size), 1);
576 end;
577 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
578 end;
579 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
580 end;
581 Canvas.DrawLine(PointF(Count * Size, 0),
582 PointF(Count * Size, Count * Size), 1);
583 Canvas.DrawLine(PointF(0, Count * Size),
584 PointF(Count * Size, Count * Size), 1);
585 end;
586
587 procedure TForm1.PaintBox1Resize(Sender: TObject);
588 begin
589 Size := Min(ClientWidth, ClientHeight) div Count;
590 end;
591
592 procedure TForm1.FormActivate(Sender: TObject);
593 begin
594 Timer1.Enabled := true;
595 end;
596
597 procedure TForm1.FormCreate(Sender: TObject);
598 begin
599 StoneGrid := TStoneGrid.Create;
600 StoneGrid.ImageCount(Form1.Image1.Bitmap.Width div Form1.Image3.Bitmap.Width,
601 Form1.Image1.Bitmap.Height div Form1.Image3.Bitmap.Height);
602 Player1 := TPlayer.Create;
603 Player2 := TPlayer.Create;
604 Player1.Stone := stBlack;
605 Player2.Stone := stWhite;
606 Player2.Auto := true;
607 with PaintBox1.Canvas do
608 begin
609 StrokeDash := TStrokeDash.Solid;
610 Stroke.Color := TAlphaColors.Black;
611 StrokeThickness := 3;
612 end;
613 PaintBox1Resize(Sender);
614 GameStart;
615 end;
616
617 procedure TForm1.FormDeactivate(Sender: TObject);
618 begin
619 Timer1.Enabled := false;
620 end;
621
622 procedure TForm1.FormDestroy(Sender: TObject);
623 begin
624 StoneGrid.Free;
625 Player1.Free;
626 Player2.Free;
627 end;
628
629 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
630 Shift: TShiftState; X, Y: Single);
631 begin
632 PaintBox1Tap(Sender, PointF(X, Y));
633 end;
634
635 procedure TForm1.Timer1Timer(Sender: TObject);
636 begin
637 if (StoneGrid.Active = true) and (Index.Auto = true) then
638 CompStone;
639 end;
640
641 procedure TForm1.Timer2Timer(Sender: TObject);
642 begin
643 if (StoneGrid.Active = false) and (StoneGrid.ListExecute = true) then
644 PaintBox1.Repaint;
645 end;
646
647 procedure TForm1.FormResize(Sender: TObject);
648 begin
649 Size := Min(ClientWidth, ClientHeight) div Count;
650 PaintTo(Canvas);
651 end;
652
653 procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF);
654 begin
655 if Index.Auto = false then
656 begin
657 MenuItem10Click(Sender);
658 if StoneGrid.CanSetStone(Index.Stone, Floor(Point.X / Size),
659 Floor(Point.Y / Size), true, true) = true then
660 begin
661 PaintBox1.Repaint;
662 ChangePlayer;
663 end;
664 end;
665 end;
666
667 end.

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