Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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