| 1 |
unit Unit1; |
unit Unit1; |
| 2 |
|
|
| 3 |
interface |
interface |
| 4 |
|
|
| 5 |
uses |
uses |
| 6 |
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
System.SysUtils, System.Types, System.UITypes, System.Classes, |
| 7 |
Dialogs, Menus, ExtCtrls, Math; |
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 |
const |
| 12 |
Count = 8; |
Count = 8; |
| 49 |
TForm1 = class(TForm) |
TForm1 = class(TForm) |
| 50 |
Timer1: TTimer; |
Timer1: TTimer; |
| 51 |
MainMenu1: TMainMenu; |
MainMenu1: TMainMenu; |
| 52 |
Game1: TMenuItem; |
MenuItem1: TMenuItem; |
| 53 |
Start1: TMenuItem; |
MenuItem2: TMenuItem; |
| 54 |
N1: TMenuItem; |
MenuItem3: TMenuItem; |
| 55 |
End1: TMenuItem; |
MenuItem4: TMenuItem; |
| 56 |
Com1: TMenuItem; |
MenuItem5: TMenuItem; |
| 57 |
Player11: TMenuItem; |
MenuItem6: TMenuItem; |
| 58 |
Player21: TMenuItem; |
MenuItem7: TMenuItem; |
| 59 |
|
PaintBox1: TPaintBox; |
| 60 |
procedure FormCreate(Sender: TObject); |
procedure FormCreate(Sender: TObject); |
| 61 |
procedure FormDestroy(Sender: TObject); |
procedure FormDestroy(Sender: TObject); |
|
procedure FormPaint(Sender: TObject); |
|
|
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; |
|
|
Shift: TShiftState; X, Y: integer); |
|
| 62 |
procedure Timer1Timer(Sender: TObject); |
procedure Timer1Timer(Sender: TObject); |
| 63 |
procedure FormResize(Sender: TObject); |
procedure FormResize(Sender: TObject); |
| 64 |
procedure Player(Sender: TObject); |
procedure MenuItem4Click(Sender: TObject); |
| 65 |
procedure Start1Click(Sender: TObject); |
procedure MenuItem2Click(Sender: TObject); |
| 66 |
procedure End1Click(Sender: TObject); |
procedure FormTap(Sender: TObject; const Point: TPointF); |
| 67 |
|
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; |
| 68 |
|
Shift: TShiftState; X, Y: Single); |
| 69 |
|
procedure PaintBox1Paint(Sender: TObject; Canvas: TCanvas); |
| 70 |
|
procedure MenuItem6Click(Sender: TObject); |
| 71 |
private |
private |
| 72 |
{ Private 宣言 } |
{ Private ?錾 } |
| 73 |
StoneGrid: TStoneGrid; |
StoneGrid: TStoneGrid; |
| 74 |
Index: TPlayer; |
Index: TPlayer; |
| 75 |
Active: Boolean; |
Active: Boolean; |
| 79 |
procedure ChangePlayer; |
procedure ChangePlayer; |
| 80 |
procedure CheckGame; |
procedure CheckGame; |
| 81 |
public |
public |
| 82 |
{ Public 宣言 } |
{ Public ?錾 } |
| 83 |
end; |
end; |
| 84 |
|
|
| 85 |
var |
var |
| 90 |
|
|
| 91 |
implementation |
implementation |
| 92 |
|
|
| 93 |
{$R *.dfm} |
{$R *.fmx} |
| 94 |
{ TStoneGrid } |
{ TStoneGrid } |
| 95 |
|
|
| 96 |
procedure TStoneGrid.BackUp; |
procedure TStoneGrid.BackUp; |
| 364 |
begin |
begin |
| 365 |
s := StoneGrid.NextStone(Index); |
s := StoneGrid.NextStone(Index); |
| 366 |
StoneGrid.CanSetStone(Index, s.X, s.Y, true); |
StoneGrid.CanSetStone(Index, s.X, s.Y, true); |
| 367 |
FormPaint(nil); |
PaintBox1.Repaint; |
| 368 |
CheckGame; |
CheckGame; |
| 369 |
end; |
end; |
| 370 |
|
|
| 372 |
begin |
begin |
| 373 |
StoneGrid.Clear; |
StoneGrid.Clear; |
| 374 |
StoneGrid.BackUp; |
StoneGrid.BackUp; |
| 375 |
FormPaint(nil); |
PaintBox1.Repaint; |
| 376 |
Index := Player1; |
Index := Player1; |
| 377 |
Active := true; |
Active := true; |
| 378 |
Timer1.Enabled := true; |
Timer1.Enabled := true; |
| 379 |
end; |
end; |
| 380 |
|
|
| 381 |
procedure TForm1.FormCreate(Sender: TObject); |
procedure TForm1.MenuItem2Click(Sender: TObject); |
| 382 |
begin |
begin |
|
StoneGrid := TStoneGrid.Create; |
|
|
Player1 := TPlayer.Create; |
|
|
Player2 := TPlayer.Create; |
|
|
Player1.Stone := stBlack; |
|
|
Player2.Stone := stWhite; |
|
|
Player2.Auto := true; |
|
| 383 |
GameStart; |
GameStart; |
| 384 |
end; |
end; |
| 385 |
|
|
| 386 |
procedure TForm1.FormDestroy(Sender: TObject); |
procedure TForm1.MenuItem4Click(Sender: TObject); |
| 387 |
begin |
begin |
| 388 |
StoneGrid.Free; |
Close; |
|
Player1.Free; |
|
|
Player2.Free; |
|
| 389 |
end; |
end; |
| 390 |
|
|
| 391 |
procedure TForm1.FormPaint(Sender: TObject); |
procedure TForm1.MenuItem6Click(Sender: TObject); |
| 392 |
|
begin |
| 393 |
|
Player1.Auto:=MenuItem6.IsChecked; |
| 394 |
|
Player2.Auto:=MenuItem7.IsChecked; |
| 395 |
|
end; |
| 396 |
|
|
| 397 |
|
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); |
| 398 |
var |
var |
| 399 |
i, j: integer; |
i, j: integer; |
| 400 |
begin |
begin |
| 401 |
Canvas.Brush.Color := clWhite; |
Canvas.Fill.Color := TAlphaColors.White; |
| 402 |
Canvas.Rectangle(0, 0, Count * Size, Count * Size); |
Canvas.FillRect(RectF(0, 0, Count * Size, Count * Size), 0, 0, [], 1); |
| 403 |
for i := 0 to Count - 1 do |
for i := 0 to Count do |
| 404 |
begin |
begin |
| 405 |
Canvas.MoveTo(i * Size, 0); |
Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Size * Count), 1); |
| 406 |
Canvas.LineTo(i * Size, Size * Count); |
for j := 0 to Count do |
|
for j := 0 to Count - 1 do |
|
| 407 |
begin |
begin |
| 408 |
Canvas.MoveTo(0, j * Size); |
Canvas.DrawLine(PointF(0, j * Size), PointF(Count * Size, j * Size), 1); |
|
Canvas.LineTo(Count * Size, j * Size); |
|
| 409 |
case StoneGrid.Strings[i, j] of |
case StoneGrid.Strings[i, j] of |
| 410 |
stWhite: |
stWhite: |
| 411 |
begin |
Canvas.DrawEllipse(RectF(i * Size, j * Size, (i + 1) * Size, |
| 412 |
Canvas.Brush.Color := clWhite; |
(j + 1) * Size), 1); |
|
Canvas.Ellipse(i * Size, j * Size, (i + 1) * Size, (j + 1) * Size); |
|
|
end; |
|
| 413 |
stBlack: |
stBlack: |
| 414 |
begin |
begin |
| 415 |
Canvas.Brush.Color := clBlack; |
Canvas.Fill.Color := TAlphaColors.Black; |
| 416 |
Canvas.Ellipse(i * Size, j * Size, (i + 1) * Size, (j + 1) * Size); |
Canvas.FillEllipse(RectF(i * Size, j * Size, (i + 1) * Size, |
| 417 |
|
(j + 1) * Size), 1); |
| 418 |
end; |
end; |
| 419 |
end; |
end; |
| 420 |
end; |
end; |
| 421 |
end; |
end; |
| 422 |
end; |
end; |
| 423 |
|
|
| 424 |
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; |
procedure TForm1.FormCreate(Sender: TObject); |
|
Shift: TShiftState; X, Y: integer); |
|
| 425 |
begin |
begin |
| 426 |
if (Active = true) and (Index.Auto = false) and (X <= Count * Size) and |
StoneGrid := TStoneGrid.Create; |
| 427 |
(Y <= Count * Size) then |
Player1 := TPlayer.Create; |
| 428 |
|
Player2 := TPlayer.Create; |
| 429 |
|
Player1.Stone := stBlack; |
| 430 |
|
Player2.Stone := stWhite; |
| 431 |
|
Player2.Auto := true; |
| 432 |
|
with PaintBox1.Canvas do |
| 433 |
begin |
begin |
| 434 |
X := X div Size; |
StrokeDash := TStrokeDash.Solid; |
| 435 |
Y := Y div Size; |
Stroke.Color := TAlphaColors.Black; |
| 436 |
if StoneGrid.CanSetStone(Index, X, Y, true) = true then |
StrokeThickness := 3; |
|
begin |
|
|
FormPaint(Sender); |
|
|
CheckGame; |
|
|
end; |
|
| 437 |
end; |
end; |
| 438 |
|
Size := ClientHeight div Count; |
| 439 |
|
GameStart; |
| 440 |
|
end; |
| 441 |
|
|
| 442 |
|
procedure TForm1.FormDestroy(Sender: TObject); |
| 443 |
|
begin |
| 444 |
|
StoneGrid.Free; |
| 445 |
|
Player1.Free; |
| 446 |
|
Player2.Free; |
| 447 |
|
end; |
| 448 |
|
|
| 449 |
|
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; |
| 450 |
|
Shift: TShiftState; X, Y: Single); |
| 451 |
|
begin |
| 452 |
|
FormTap(Sender, PointF(X, Y)); |
| 453 |
end; |
end; |
| 454 |
|
|
| 455 |
procedure TForm1.Timer1Timer(Sender: TObject); |
procedure TForm1.Timer1Timer(Sender: TObject); |
| 465 |
procedure TForm1.FormResize(Sender: TObject); |
procedure TForm1.FormResize(Sender: TObject); |
| 466 |
begin |
begin |
| 467 |
Size := Min(ClientWidth, ClientHeight) div Count; |
Size := Min(ClientWidth, ClientHeight) div Count; |
| 468 |
FormPaint(Sender); |
PaintTo(Canvas); |
| 469 |
end; |
end; |
| 470 |
|
|
| 471 |
procedure TForm1.Player(Sender: TObject); |
procedure TForm1.FormTap(Sender: TObject; const Point: TPointF); |
| 472 |
begin |
begin |
| 473 |
(Sender as TMenuItem).Checked := not(Sender as TMenuItem).Checked; |
if (Active = true) and (Index.Auto = false) and (Point.X <= Count * Size) and |
| 474 |
if Sender = Player11 then |
(Point.Y <= Count * Size) then |
| 475 |
Player1.Auto := Player11.Checked |
begin |
| 476 |
else |
if StoneGrid.CanSetStone(Index, Floor(Point.X / Size), |
| 477 |
Player2.Auto := Player21.Checked; |
Floor(Point.Y / Size), true) = true then |
| 478 |
end; |
begin |
| 479 |
|
PaintBox1.Repaint; |
| 480 |
procedure TForm1.Start1Click(Sender: TObject); |
CheckGame; |
| 481 |
begin |
end; |
| 482 |
GameStart; |
end; |
|
end; |
|
|
|
|
|
procedure TForm1.End1Click(Sender: TObject); |
|
|
begin |
|
|
Close; |
|
| 483 |
end; |
end; |
| 484 |
|
|
| 485 |
end. |
end. |