📄 mainunit.pas
字号:
end;
begin
If Depth=0 then
AlphaBeta:=Eval
else
begin
//Gen;
Best:=-INFINITY;
i:=1;
While (Best<Beta) and (i<=BOARD_SIZE) do
begin
if Best>Alpha then ALpha:=Best;
// For i:=1 to BOARD_SIZE do
if (PieceColor[i])=Side then
begin
p:=Piece[i];
j:=1;
while (j<=8) and (Best<Beta) do
//for j:=1 to 8 do
begin
if offset[p,j]=0 then break;
x:=mailbox90[i];
fcannon:=0;
if p in [ROOK,CANNON] then n:=9
else n:=1;
For k:=1 to n do
begin
if (p=PAWN) and (side=RED) then
x:=x-offset[p,j]
else
x:=x+offset[p,j];
y:=mailbox182[x];
if side=DARK then t:=y
else t:=91-y;
if (y=-1) or ((legalposition[t] and maskpiece[p])=0) then break;
if fcannon=0 then
begin
if (PieceColor[y])<>Side then
begin
case p of
KNIGHT:If PieceColor[i+knightcheck[j]]=EMPTY then common(i,y);
ELEPHANT:if PieceColor[i+elephantCheck[j]]=EMPTY then common(i,y);
CANNON:begin
If PieceColor[y]=EMPTY then common(i,y);
end;
else common(i,y);
end;
end;
if PieceColor[y]<>EMPTY then
if p=CANNON then fCannon:=1
else break;
end
else
begin
if PieceColor[y]<>EMPTY then
begin
if (PieceColor[y])=3-Side then common(i,y);
break;
end;
end
end;
j:=j+1;
end{While}
end;{If}
i:=i+1;
end;{While}
AlphaBeta:=Best;
end;
// Application.ProcessMessages;
end;
Procedure TMainForm.ComputerThink;
var Best:Integer;
x,y,x1,y1:integer;
Lost:boolean;
begin
ComputerThinking:=true;
Lost:=false;
Side:=DARK;
EvalCount:=0;
Best:=AlphaBeta(-Infinity,Infinity,Max_Fly);
x:=(NewMove.Source mod 9);
// if x=0 then x:=9;
y:=(NewMove.Source div 9) + 1;
if x=0 then
begin
x:=9;
y:=y-1;
end;
x1:=(NewMove.Dest mod 9);
//if x1=0 then x1:=9;
y1:=(NewMove.Dest div 9) + 1;
if x1=0 then
begin
x1:=9;
y1:=y1-1;
end;
if Piece[NewMove.Dest]=KING then Lost:=true;
Piece[NewMove.Dest]:=Piece[NewMove.Source];
Piece[NewMove.Source]:=EMPTY;
PieceColor[NewMove.Dest]:=PieceColor[NewMove.Source];
PieceColor[NewMove.Source]:=EMPTY;
If Piece_Pointer[y1,x1]<>nil then
Piece_Pointer[y1,x1].visible:=false
else
New(Piece_Pointer[y1,x1]);
OrinPiece_Coor.X:=Piece_Pointer[y,x].Left;
OrinPiece_Coor.Y:=Piece_Pointer[y,x].Top;
Piece_Pointer[y1,x1]^:=Piece_Pointer[y,x]^;
Piece_Pointer[y,x]:=nil;
Piece_Pointer[y1,x1].Left:=OrinPiece_Coor.X+(x1-x)*CrossPiece_Size.X;
Piece_Pointer[y1,x1].Top:=OrinPiece_Coor.y+(y1-y)*CrossPiece_Size.y;
Piece_Pointer[y1,x1].Visible:=true;
//Mainform.close;
// Edit1.text:=IntToStr(Best);
computerThinking:=false;
if lost then
begin
ShowMessage('Bạn tâm phục khẩu phục chưa.Về nhà giở vở học thêm nhé');
NewGame;
end;
;
end;
{$R *.dfm}
Procedure TMainForm.NewGame;
var i,j:integer;
begin
for i:=1 to BOARD_SIZE do
Piece[i]:=NewPiece[i];
for i:=1 to BOARD_SIZE do
PieceColor[i]:=NewPieceColor[i];
for i:=1 to 10 do
for j:=1 to 9 do
if Piece_Pointer[i,j]<>nil then
Piece_Pointer[i,j]:=nil;
for i:=0 to 1 do
begin
for j:=1 to 9 do
new(Piece_Pointer[1+9*i,j]);
for j:=0 to 4 do
new(Piece_Pointer[4+3*i,1+2*j]);
for j:=0 to 1 do
new(Piece_Pointer[3+5*i,2+6*j]);
end;
//edit1.Enabled:=(Piece_Pointer[3,1]=nil);
Piece_Pointer[1,1]^:=imgXeDen1;
Piece_Pointer[1,9]^:=imgXeDen2;
Piece_Pointer[1,2]^:=imgMaDen1;
Piece_Pointer[1,8]^:=imgmaDen2;
Piece_Pointer[1,3]^:=imgTinhDen1;
Piece_Pointer[1,7]^:=imgTinhDen2;
Piece_Pointer[1,4]^:=imgSiDen1;
Piece_Pointer[1,6]^:=imgSiDen2;
Piece_Pointer[1,5]^:=imgTuongDen;
Piece_Pointer[10,1]^:=imgXeRed1;
Piece_Pointer[10,9]^:=imgXeRed2;
Piece_Pointer[10,2]^:=imgMaRed1;
Piece_Pointer[10,8]^:=imgMaRed2;
Piece_Pointer[10,3]^:=imgTinhRed1;
Piece_Pointer[10,7]^:=imgTinhRed2;
Piece_Pointer[10,4]^:=imgSiRed1;
Piece_Pointer[10,6]^:=imgSiRed2;
Piece_Pointer[10,5]^:=imgTuongRed;
Piece_Pointer[3,2]^:=imgPhaoDen1;
Piece_Pointer[3,8]^:=imgPhaoDen2;
Piece_Pointer[8,2]^:=imgPhaoRed1;
Piece_Pointer[8,8]^:=imgPhaoRed2;
Piece_Pointer[4,1]^:=imgTotDen1;
Piece_Pointer[4,3]^:=imgTotDen2;
Piece_Pointer[4,5]^:=imgTotDen3;
Piece_Pointer[4,7]^:=imgTotDen4;
Piece_Pointer[4,9]^:=imgTotDen5;
Piece_Pointer[7,1]^:=imgTotRed1;
Piece_Pointer[7,3]^:=imgTotRed2;
Piece_Pointer[7,5]^:=imgTotRed3;
Piece_Pointer[7,7]^:=imgTotRed4;
Piece_Pointer[7,9]^:=imgTotRed5;
for i:=1 to 10 do
for j:=1 to 9 do
if Piece_Pointer[i,j]<>nil then
begin
Piece_Pointer[i,j].visible:=true;
Piece_Pointer[i,j].left:=Board_Left+(j-1)*CrossPiece_Size.X;
Piece_Pointer[i,j].top:=Board_Top+(i-1)*CrossPiece_Size.Y;
end;
if Not HumanGo then ComputerThink;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Board_Left:=ImgBoard.Left;
Board_Top:=ImgBoard.Top;
CrossPiece_Size.X:=(imgXeDen2.Left-imgXeDen1.Left) div 8;
CrossPiece_Size.Y:=(imgBoard.height) div 10;
FirstPiece_Coor.X:=Board_Left+CrossPiece_Size.X div 2;
FirstPiece_Coor.Y:=Board_Top+CrossPiece_size.Y div 2;
NewGame;
end;
procedure TMainForm.imgRedPieceMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var OK:boolean;
a:TPoint;
begin
RedPieceMouseDown:=true;
RedMouseX:=X;
RedMouseY:=Y;
OrinPiece_Coor.X:=(Sender as TImage).Left;
OrinPiece_Coor.Y:=(Sender as TImage).Top;
a.x:=(sender as TImage).Left+(sender as TImage).Width div 2;//x;//OrinPiece_Coor.X + CrossPiece_Size.X div 2;
a.y:=(sender as TImage).top+(sender as TImage).height div 2;//y;//OrinPiece_Coor.y + CrossPiece_Size.y div 2;
GetInBoardCoor(a,OrinInBoard_Coor,OK);
(Sender as TImage).BringToFront;
end;
procedure TMainForm.imgRedPieceMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if not ComputerThinking then
if RedPieceMouseDown then
begin
if (ABS(x-RedMouseX)>=10) or (ABS(y-RedMouseY)>=10) then
begin
(Sender as TImage).Left:=(Sender as TImage).Left+X-RedMouseX;
(Sender as TImage).Top:=(Sender as TImage).Top+Y-RedMouseY;
end;
end;
//
end;
procedure TMainForm.imgRedPieceMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var Mouse_Coor,InBoard_Coor:TPoint;
OK:boolean;
HumanMove:Move;
Won:boolean;
begin
Won:=false;
if ComputerThinking then
begin
(Sender as TImage).Left:=OrinPiece_Coor.x;
(Sender as TImage).Top:=OrinPiece_Coor.Y;
exit;
end;
RedPieceMouseDown:=false;
Mouse_Coor.x:=(sender as TImage).Left+(sender as TImage).Width div 2;
Mouse_Coor.y:=(sender as TImage).Top+(sender as TImage).Height div 2;
GetInBoardCoor(Mouse_Coor,InBoard_Coor,OK);
if OK and (Mouse_Coor.x<>InBoard_Coor.x) and (Mouse_Coor.y<>InBoard_Coor.y) then
begin
OK:=CheckHumanMove(OrinInBoard_Coor,InBoard_Coor);
if OK then
begin
HumanMove.Source:=(OrinInBoard_Coor.Y-1)*SIZE_X+OrinInBoard_Coor.X;
HumanMove.Dest:=(InBoard_Coor.Y-1)*SIZE_X+InBoard_Coor.x;
if Piece_Pointer[InBoard_Coor.y,InBoard_Coor.x]<>nil then
begin
Piece_Pointer[InBoard_Coor.Y,InBoard_Coor.x].Visible:=false;
end
else
new(Piece_Pointer[InBoard_Coor.Y,InBoard_Coor.x]);
Piece_Pointer[InBoard_Coor.Y,InBoard_Coor.x]^:=(Sender as TImage);
(Sender as TImage).Left:=OrinPiece_Coor.X+(InBoard_Coor.X-OrinInBoard_Coor.X)*CrossPiece_Size.X;
(Sender as TImage).top:=OrinPiece_Coor.y+(InBoard_Coor.y-OrinInBoard_Coor.y)*CrossPiece_Size.y;
(Sender as TImage).visible:=true;
if Piece[HumanMove.Dest]=KING then Won:=true;
Piece[HumanMove.Dest]:=Piece[HumanMove.Source];
Piece[HumanMove.Source]:=0;
PieceColor[HumanMove.Dest]:=PieceColor[HumanMove.Source];
PieceColor[HumanMove.Source]:=0;
Piece_Pointer[OrinInBoard_Coor.Y,OrinInBoard_Coor.X]:=nil;
if Won then
begin
ShowMessage('Tha ván này thui!Ván sau đánh cho te tua!');
NewGame;
end
else
begin
ComputerThink;
end;
end;
end;
if not OK then
begin
(Sender as TImage).Left:=OrinPiece_Coor.x;
(Sender as TImage).Top:=OrinPiece_Coor.Y;
end;
end;
procedure TMainForm.imgTuongRedClick(Sender: TObject);
begin
ShowMessage(' Ha ha bạn phải chạy tướng rùi à.Giỏi thì đứng lại chọi nhau!');
end;
procedure TMainForm.M1Click(Sender: TObject);
var
openDialog : TOpenDialog;
begin
openDialog := TOpenDialog.Create(Application);
openDialog.InitialDir := GetCurrentDir;
openDialog.Options := [ofFileMustExist];
openDialog.Filter :=
'Delphi project files|*.dpr|Delphi pascal files|*.pas';
openDialog.FilterIndex := 2;
if openDialog.Execute
then ShowMessage('Trong thời gian tới tôi sẽ hỗ tợ chức năng này ')
else ShowMessage('Bạn chưa chọn file');
openDialog.Free;
end;
procedure TMainForm.MainFormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if RedPieceMouseDown then
begin
if ABS(x-RedMouseX)>=10 then
begin
showMessage('Bạn thử đi hơn 10 nước mà vẵn chưa hiệu quả');
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -