Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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