| 31 |
FBuffer: array [0 .. Count * Count - 4] of TGridData; |
FBuffer: array [0 .. Count * Count - 4] of TGridData; |
| 32 |
FTurnNumber: integer; |
FTurnNumber: integer; |
| 33 |
FTurnIndex: integer; |
FTurnIndex: integer; |
| 34 |
|
FActive: Boolean; |
| 35 |
function GetStrings(X, Y: integer): TStoneType; |
function GetStrings(X, Y: integer): TStoneType; |
| 36 |
procedure SetStrings(X, Y: integer; const Value: TStoneType); |
procedure SetStrings(X, Y: integer; const Value: TStoneType); |
| 37 |
procedure SetTurnNumber(const Value: integer); |
procedure SetTurnNumber(const Value: integer); |
| 38 |
|
property TurnIndex: integer read FTurnIndex write FTurnIndex; |
| 39 |
public |
public |
| 40 |
procedure Clear; |
procedure Clear; |
|
procedure BackUp; |
|
| 41 |
function CalScore(Player: TPlayer; X, Y: integer): integer; |
function CalScore(Player: TPlayer; X, Y: integer): integer; |
| 42 |
function CanSetStone(Player: TPlayer; X, Y: integer; Reverse: Boolean; |
function CanSetStone(Player: TPlayer; X, Y: integer; Reverse: Boolean; |
| 43 |
const Visible: Boolean = false): Boolean; |
const Visible: Boolean = false): Boolean; |
| 44 |
function NextStone(Player: TPlayer): TPoint; |
function NextStone(Player: TPlayer): TPoint; |
| 45 |
|
procedure Start; |
| 46 |
|
procedure Restart; |
| 47 |
|
procedure Pause; |
| 48 |
property Strings[X, Y: integer]: TStoneType read GetStrings |
property Strings[X, Y: integer]: TStoneType read GetStrings |
| 49 |
write SetStrings; default; |
write SetStrings; default; |
| 50 |
property TurnNumber: integer read FTurnNumber write SetTurnNumber; |
property TurnNumber: integer read FTurnNumber write SetTurnNumber; |
| 51 |
property TurnIndex: integer read FTurnIndex write FTurnIndex; |
property Active: Boolean read FActive write FActive; |
| 52 |
end; |
end; |
| 53 |
|
|
| 54 |
TForm1 = class(TForm) |
TForm1 = class(TForm) |
| 86 |
{ Private 宣言 } |
{ Private 宣言 } |
| 87 |
StoneGrid: TStoneGrid; |
StoneGrid: TStoneGrid; |
| 88 |
Index: TPlayer; |
Index: TPlayer; |
|
Active: Boolean; |
|
| 89 |
Size: integer; |
Size: integer; |
| 90 |
procedure CompStone; |
procedure CompStone; |
| 91 |
procedure GameStart; |
procedure GameStart; |
| 107 |
|
|
| 108 |
{ TStoneGrid } |
{ TStoneGrid } |
| 109 |
|
|
|
procedure TStoneGrid.BackUp; |
|
|
begin |
|
|
FBuffer[FTurnNumber] := FStrings; |
|
|
if FTurnNumber < Count * Count - 4 then |
|
|
begin |
|
|
FTurnIndex := FTurnNumber + 1; |
|
|
inc(FTurnNumber); |
|
|
FBuffer[FTurnNumber] := FStrings; |
|
|
end; |
|
|
end; |
|
|
|
|
| 110 |
function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer; |
function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer; |
| 111 |
var |
var |
| 112 |
i, j: integer; |
i, j: integer; |
| 122 |
for j := 0 to Count - 1 do |
for j := 0 to Count - 1 do |
| 123 |
if CanSetStone(Player, i, j, false) = true then |
if CanSetStone(Player, i, j, false) = true then |
| 124 |
inc(result); |
inc(result); |
| 125 |
FStrings := FBuffer[FTurnNumber]; |
FStrings := FBuffer[FTurnIndex]; |
| 126 |
end |
end |
| 127 |
else |
else |
| 128 |
begin |
begin |
| 129 |
FStrings := FBuffer[FTurnNumber]; |
FStrings := FBuffer[FTurnIndex]; |
| 130 |
result := -1; |
result := -1; |
| 131 |
end; |
end; |
| 132 |
end; |
end; |
| 217 |
Dispose(list[i]); |
Dispose(list[i]); |
| 218 |
list.Free; |
list.Free; |
| 219 |
end; |
end; |
| 220 |
|
if Visible = true then |
| 221 |
|
begin |
| 222 |
|
inc(FTurnIndex); |
| 223 |
|
inc(FTurnNumber); |
| 224 |
|
FBuffer[FTurnIndex]:=FStrings; |
| 225 |
|
end; |
| 226 |
end; |
end; |
| 227 |
|
|
| 228 |
procedure TStoneGrid.Clear; |
procedure TStoneGrid.Clear; |
| 238 |
Strings[3, 4] := stWhite; |
Strings[3, 4] := stWhite; |
| 239 |
FTurnNumber := 0; |
FTurnNumber := 0; |
| 240 |
FTurnIndex := 0; |
FTurnIndex := 0; |
| 241 |
|
FBuffer[0]:=FStrings; |
| 242 |
end; |
end; |
| 243 |
|
|
| 244 |
function TStoneGrid.GetStrings(X, Y: integer): TStoneType; |
function TStoneGrid.GetStrings(X, Y: integer): TStoneType; |
| 268 |
result := Point(-1, -1); |
result := Point(-1, -1); |
| 269 |
end; |
end; |
| 270 |
|
|
| 271 |
|
procedure TStoneGrid.Pause; |
| 272 |
|
begin |
| 273 |
|
FActive:=false; |
| 274 |
|
end; |
| 275 |
|
|
| 276 |
|
procedure TStoneGrid.Restart; |
| 277 |
|
begin |
| 278 |
|
if FActive = false then |
| 279 |
|
begin |
| 280 |
|
FActive:=true; |
| 281 |
|
FStrings:=FBuffer[FTurnIndex]; |
| 282 |
|
end; |
| 283 |
|
end; |
| 284 |
|
|
| 285 |
procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType); |
procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType); |
| 286 |
begin |
begin |
| 287 |
if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then |
if (X >= 0) and (X < Count) and (Y >= 0) and (Y < Count) then |
| 297 |
FStrings := FBuffer[FTurnNumber]; |
FStrings := FBuffer[FTurnNumber]; |
| 298 |
end; |
end; |
| 299 |
|
|
| 300 |
|
procedure TStoneGrid.Start; |
| 301 |
|
begin |
| 302 |
|
Clear; |
| 303 |
|
FActive := true; |
| 304 |
|
end; |
| 305 |
|
|
| 306 |
{ TForm1 } |
{ TForm1 } |
| 307 |
|
|
| 308 |
procedure TForm1.ChangePlayer; |
procedure TForm1.ChangePlayer; |
| 335 |
end; |
end; |
| 336 |
|
|
| 337 |
begin |
begin |
|
StoneGrid.BackUp; |
|
| 338 |
Main; |
Main; |
| 339 |
if Execute = false then |
if Execute = false then |
| 340 |
begin |
begin |
| 341 |
Main; |
Main; |
| 342 |
if Execute = false then |
if Execute = false then |
| 343 |
begin |
begin |
| 344 |
with StoneGrid do |
StoneGrid.Pause; |
|
if TurnIndex < Count * Count - 4 then |
|
|
begin |
|
|
TurnIndex := TurnIndex - 1; |
|
|
TurnNumber := TurnNumber - 1; |
|
|
end; |
|
| 345 |
Timer1.Enabled := false; |
Timer1.Enabled := false; |
|
Active := false; |
|
| 346 |
m := 0; |
m := 0; |
| 347 |
n := 0; |
n := 0; |
| 348 |
for i := 0 to Count - 1 do |
for i := 0 to Count - 1 do |
| 377 |
|
|
| 378 |
procedure TForm1.GameStart; |
procedure TForm1.GameStart; |
| 379 |
begin |
begin |
| 380 |
StoneGrid.Clear; |
StoneGrid.Start; |
|
StoneGrid.BackUp; |
|
| 381 |
PaintBox1.Repaint; |
PaintBox1.Repaint; |
| 382 |
Index := Player1; |
Index := Player1; |
|
Active := true; |
|
| 383 |
Timer1.Enabled := true; |
Timer1.Enabled := true; |
| 384 |
end; |
end; |
| 385 |
|
|
| 386 |
procedure TForm1.MenuItem10Click(Sender: TObject); |
procedure TForm1.MenuItem10Click(Sender: TObject); |
| 387 |
begin |
begin |
| 388 |
with StoneGrid do |
StoneGrid.Restart; |
|
begin |
|
|
if TurnIndex > TurnNumber then |
|
|
TurnIndex := TurnNumber; |
|
|
end; |
|
|
Active := true; |
|
| 389 |
Timer1.Enabled := true; |
Timer1.Enabled := true; |
| 390 |
end; |
end; |
| 391 |
|
|
| 419 |
|
|
| 420 |
procedure TForm1.MenuItem8Click(Sender: TObject); |
procedure TForm1.MenuItem8Click(Sender: TObject); |
| 421 |
begin |
begin |
| 422 |
if (Player1.Auto = true) and (Player2.Auto = true) then |
StoneGrid.Pause; |
| 423 |
Timer1.Enabled := false; |
Timer1.Enabled := false; |
| 424 |
end; |
end; |
| 425 |
|
|
| 426 |
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); |
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); |
| 488 |
|
|
| 489 |
procedure TForm1.Timer1Timer(Sender: TObject); |
procedure TForm1.Timer1Timer(Sender: TObject); |
| 490 |
begin |
begin |
| 491 |
if (Active = true) and (Index.Auto = true) then |
if (StoneGrid.Active = true)and( Index.Auto = true) then |
| 492 |
begin |
begin |
| 493 |
Timer1.Enabled := false; |
Timer1.Enabled := false; |
| 494 |
CompStone; |
CompStone; |
| 504 |
|
|
| 505 |
procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF); |
procedure TForm1.PaintBox1Tap(Sender: TObject; const Point: TPointF); |
| 506 |
begin |
begin |
| 507 |
if Timer1.Enabled = false then |
MenuItem10Click(Sender); |
|
Timer1.Enabled := true; |
|
|
if (Active = false) and (StoneGrid.TurnIndex < Count * Count - 4) then |
|
|
Active := true; |
|
| 508 |
if (Active = true) and (Index.Auto = false) then |
if (Active = true) and (Index.Auto = false) then |
| 509 |
begin |
begin |
| 510 |
if StoneGrid.CanSetStone(Index, Floor(Point.X / Size), |
if StoneGrid.CanSetStone(Index, Floor(Point.X / Size), |