Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 25 - (show annotations) (download) (as text)
Mon Jul 20 00:50:13 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 15894 byte(s)
CalScoreに問題があったことが判明
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): TPoint;
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): TPoint;
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 result := Point(i, j);
350 end;
351 end;
352 if n = 0 then
353 result := Point(-1, -1);
354 end;
355
356 procedure TStoneGrid.Paint(Canvas: TCanvas);
357 var
358 i: integer;
359 k, m, n: integer;
360 s: TBitmap;
361 p: ^TEffectData;
362 begin
363 m := Form1.Image3.Bitmap.Width;
364 n := Form1.Image3.Bitmap.Height;
365 k := Form1.Size;
366 for i := 0 to FList.Count - 1 do
367 begin
368 p := FList[i];
369 if FEffectStone = stBlack then
370 s := Form1.Image1.Bitmap
371 else
372 s := Form1.Image2.Bitmap;
373 Canvas.DrawBitmap(s, RectF(p^.X * m, p^.Y * n, (p^.X + 1) * m,
374 (p^.Y + 1) * n), RectF(p^.Left * k, p^.Top * k, (p^.Left + 1) * k,
375 (p^.Top + 1) * k), 1);
376 end;
377 end;
378
379 procedure TStoneGrid.Pause;
380 begin
381 FActive := false;
382 FTerminated := true;
383 end;
384
385 procedure TStoneGrid.Restart;
386 begin
387 FActive := true;
388 FTurnIndex := FTurnNumber;
389 FTerminated := false;
390 end;
391
392 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
393 begin
394 if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then
395 FStrings[X, Y] := Value;
396 end;
397
398 procedure TStoneGrid.SetTurnNumber(const Value: integer);
399 begin
400 if Value > FTurnIndex then
401 FTurnNumber := FTurnIndex
402 else if Value < 0 then
403 FTurnNumber := 0
404 else
405 FTurnNumber := Value;
406 FStrings := FBuffer[FTurnNumber];
407 end;
408
409 procedure TStoneGrid.Start;
410 begin
411 Clear;
412 FTerminated := false;
413 FActive := true;
414 end;
415
416 { TForm1 }
417
418 procedure TForm1.ChangePlayer;
419 var
420 i, j, m, n: integer;
421 s: string;
422 procedure Main;
423 begin
424 if Index = Player1 then
425 begin
426 Index := Player2;
427 s := '������������';
428 end
429 else
430 begin
431 Index := Player1;
432 s := '������������';
433 end;
434 end;
435 function Execute: Boolean;
436 var
437 i, j: integer;
438 begin
439 for i := 0 to Count - 1 do
440 for j := 0 to Count - 1 do
441 if StoneGrid.CanSetStone(Index.Stone, i, j, false) = true then
442 begin
443 result := true;
444 Exit;
445 end;
446 result := false;
447 end;
448
449 begin
450 Main;
451 if Execute = false then
452 begin
453 Main;
454 if Execute = false then
455 begin
456 StoneGrid.Pause;
457 m := 0;
458 n := 0;
459 for i := 0 to Count - 1 do
460 for j := 0 to Count - 1 do
461 case StoneGrid[i, j] of
462 stBlack:
463 inc(m);
464 stWhite:
465 inc(n);
466 end;
467 Caption := s;
468 if m > n then
469 s := 'Player1 Win:' + #13#10
470 else if m < n then
471 s := 'Player2 Win:' + #13#10
472 else
473 s := 'Draw:' + #13#10;
474 Showmessage(s + '(Player1) ' + IntToStr(m) + #13#10 + '(Player2) ' +
475 IntToStr(n));
476 end
477 else
478 Caption := s;
479 end
480 else
481 Caption := s;
482 end;
483
484 procedure TForm1.CompStone;
485 var
486 s: TPoint;
487 begin
488 s := StoneGrid.NextStone(Index.Stone);
489 StoneGrid.CanSetStone(Index.Stone, s.X, s.Y, true, true);
490 PaintBox1.Repaint;
491 ChangePlayer;
492 end;
493
494 procedure TForm1.GameStart;
495 begin
496 Timer1.Enabled:=false;
497 Index := Player1;
498 StoneGrid.Start;
499 PaintBox1.Repaint;
500 Caption := '�������n������';
501 Timer1.Enabled:=true;
502 end;
503
504 procedure TForm1.MenuItem10Click(Sender: TObject);
505 begin
506 StoneGrid.Restart;
507 end;
508
509 procedure TForm1.MenuItem11Click(Sender: TObject);
510 var
511 i: integer;
512 begin
513 with StoneGrid do
514 begin
515 i := TurnNumber;
516 if Sender = MenuItem11 then
517 TurnNumber := TurnNumber + 1
518 else
519 TurnNumber := TurnNumber - 1;
520 if (i = TurnNumber) then
521 Exit
522 else
523 Pause;
524 end;
525 PaintBox1.Repaint;
526 ChangePlayer;
527 end;
528
529 procedure TForm1.MenuItem2Click(Sender: TObject);
530 begin
531 GameStart;
532 end;
533
534 procedure TForm1.MenuItem4Click(Sender: TObject);
535 begin
536 Close;
537 end;
538
539 procedure TForm1.MenuItem6Click(Sender: TObject);
540 begin
541 Player1.Auto := MenuItem6.IsChecked;
542 Player2.Auto := MenuItem7.IsChecked;
543 end;
544
545 procedure TForm1.MenuItem8Click(Sender: TObject);
546 begin
547 StoneGrid.Pause;
548 end;
549
550 procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
551 var
552 i, j: integer;
553 begin
554 if StoneGrid.Active = false then
555 StoneGrid.Paint(Canvas);
556 for i := 0 to Count - 1 do
557 begin
558 for j := 0 to Count - 1 do
559 begin
560 case StoneGrid.Strings[i, j] of
561 stWhite:
562 Canvas.DrawBitmap(Image4.Bitmap, RectF(0, 0, Image4.Bitmap.Width,
563 Image4.Bitmap.Height), RectF(i * Size, j * Size, (i + 1) * Size,
564 (j + 1) * Size), 1);
565 stBlack:
566 Canvas.DrawBitmap(Image3.Bitmap, RectF(0, 0, Image3.Bitmap.Width,
567 Image3.Bitmap.Height), RectF(i * Size, j * Size, (i + 1) * Size,
568 (j + 1) * Size), 1);
569 stEffect:
570 continue;
571 else
572 Canvas.DrawBitmap(Image5.Bitmap, RectF(0, 0, Image5.Bitmap.Width,
573 Image5.Bitmap.Height), RectF(i * Size, j * Size, (i + 1) * Size,
574 (j + 1) * Size), 1);
575 end;
576 Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1);
577 end;
578 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1);
579 end;
580 Canvas.DrawLine(PointF(Count * Size, 0),
581 PointF(Count * Size, Count * Size), 1);
582 Canvas.DrawLine(PointF(0, Count * Size),
583 PointF(Count * Size, Count * Size), 1);
584 end;
585
586 procedure TForm1.PaintBox1Resize(Sender: TObject);
587 begin
588 Size := Min(ClientWidth, ClientHeight) div Count;
589 end;
590
591 procedure TForm1.FormActivate(Sender: TObject);
592 begin
593 Timer1.Enabled := true;
594 end;
595
596 procedure TForm1.FormCreate(Sender: TObject);
597 begin
598 StoneGrid := TStoneGrid.Create;
599 StoneGrid.ImageCount(Form1.Image1.Bitmap.Width div Form1.Image3.Bitmap.Width,
600 Form1.Image1.Bitmap.Height div Form1.Image3.Bitmap.Height);
601 Player1 := TPlayer.Create;
602 Player2 := TPlayer.Create;
603 Player1.Stone := stBlack;
604 Player2.Stone := stWhite;
605 Player2.Auto := true;
606 with PaintBox1.Canvas do
607 begin
608 StrokeDash := TStrokeDash.Solid;
609 Stroke.Color := TAlphaColors.Black;
610 StrokeThickness := 3;
611 end;
612 PaintBox1Resize(Sender);
613 GameStart;
614 end;
615
616 procedure TForm1.FormDeactivate(Sender: TObject);
617 begin
618 Timer1.Enabled := false;
619 end;
620
621 procedure TForm1.FormDestroy(Sender: TObject);
622 begin
623 StoneGrid.Free;
624 Player1.Free;
625 Player2.Free;
626 end;
627
628 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
629 Shift: TShiftState; X, Y: Single);
630 begin
631 PaintBox1Tap(Sender, PointF(X, Y));
632 end;
633
634 procedure TForm1.Timer1Timer(Sender: TObject);
635 begin
636 if (StoneGrid.Active = true) and (Index.Auto = true) then
637 CompStone;
638 end;
639
640 procedure TForm1.Timer2Timer(Sender: TObject);
641 begin
642 if (StoneGrid.Active = false) and (StoneGrid.ListExecute = true) then
643 PaintBox1.Repaint;
644 end;
645
646 procedure TForm1.FormResize(Sender: TObject);
647 begin
648 Size := Min(ClientWidth, ClientHeight) div Count;
649 PaintTo(Canvas);
650 end;
651
652 procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF);
653 begin
654 if Index.Auto = false then
655 begin
656 MenuItem10Click(Sender);
657 if StoneGrid.CanSetStone(Index.Stone, Floor(Point.X / Size),
658 Floor(Point.Y / Size), true, true) = true then
659 begin
660 PaintBox1.Repaint;
661 ChangePlayer;
662 end;
663 end;
664 end;
665
666 end.

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