Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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