📄 mainunit.pas
字号:
if a mod CrossPiece_Size.X>=2*k then
P2.x:=P2.x+1
else
if a mod CrossPiece_Size.x>=k then OK:=false;
if b>=0 then
if b mod CrossPiece_Size.y>=2*l then
P2.y:=P2.y+1
else
if b mod CrossPiece_Size.y>=l then OK:=false;
str(p2.X,s);
end
else
OK:=false;
end;
procedure TMainForm.Hard1Click(Sender: TObject);
begin
NewGame;
MAX_FLY:=4;
ShowMessage('Cấp độ khó ruig>Chúc bạn may mắn!');
end;
procedure TMainForm.Hardest1Click(Sender: TObject);
begin
NewGame;
MAX_FLY:=7;
ShowMessage(' Bạn sẽ không bao giờ thắng nổi tôi!');
end;
procedure TMainForm.hngtintcgi1Click(Sender: TObject);
var
tt:TICTU_K5H;
begin
tt:=TICTU_K5H.Create(Application);
tt.ShowModal;
end;
procedure TMainForm.hot1Click(Sender: TObject);
begin
close;
end;
Function TMainForm.KingFace(Source,Dest:Integer):Boolean;
var i,k,t:integer;
begin
KingFace:=false;
i:=Source mod 9;
if i=0 then i:=9;
if (i>=4) and (i<=6) and (Piece[dest]<>KING) then
begin
t:=Piece[dest];
Piece[Dest]:=Piece[Source];
Piece[Source]:=EMPTY;
i:=1;
repeat
k:=KingPalace[i];
inc(i);
Until Piece[k]=KING;
k:=k+SIZE_X;
while (k<BOARD_SIZE) and (Piece[k]=EMPTY) do
k:=k+SIZE_X;
if Piece[k]=KING then KingFace:=true;
Piece[Source]:=Piece[Dest];
Piece[Dest]:=t;
end;
end;
procedure TMainForm.Level11Click(Sender: TObject);
begin
NewGame;
MAX_FLY:=1;
ShowMessage('Bạn đang chọn trình độ gà nhất!');
end;
procedure TMainForm.Level21Click(Sender: TObject);
begin
Newgame;
MAX_FLY:=2;
ShowMessage('Trình mới tập chơi.Muốn học hỏi.');
end;
procedure TMainForm.Level31Click(Sender: TObject);
begin
NewGame;
MAX_FLY:=3;
ShowMessage('Bạn đã đạt đẳng cấp Beginer.Chúc thắng lợi nhé!.Hí hí');
end;
Function TMainForm.Eval:Integer;
const PieceValue:array[1..7] of integer=(10,20,20,40,45,90,100);
pointtable: array[1..7, 1..2, 1..90] of byte =
(((0, 0, 0, 0, 0, 0, 0, 0, 0, { tốt xanh }
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
10, 0, 12, 0, 15, 0, 12, 0, 10,
10, 0, 13, 0, 10, 0, 13, 0, 10,
20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 21, 21, 22, 22, 22, 21, 21, 20,
20, 21, 21, 23, 23, 23, 21, 21, 20,
20, 21, 21, 23, 22, 23, 21, 21, 20,
11, 12, 13, 14, 14, 14, 13, 12, 11),
(11, 12, 13, 14, 14, 14, 13, 12, 11, { Tốt đỏ }
20, 21, 21, 23, 22, 23, 21, 21, 20,
20, 21, 21, 23, 23, 23, 21, 21, 20,
20, 21, 21, 22, 22, 22, 21, 21, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20,
10, 0, 13, 0, 10, 0, 13, 0, 10,
10, 0, 12, 0, 15, 0, 12, 0, 10,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0)),
((0, 0, 0, 20, 0, 20, 0, 0, 0, {sĩ xanh }
0, 0, 0, 0, 22, 0, 0, 0, 0,
0, 0, 0, 19, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0, { Sĩ đỏ }
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 19, 0, 19, 0, 0, 0,
0, 0, 0, 0, 22, 0, 0, 0, 0,
0, 0, 0, 20, 0, 20, 0, 0, 0)),
((0, 0, 25, 0, 0, 0, 25, 0, 0, { Tịnh xanh }
0, 0, 0, 0, 0, 0, 0, 0, 0,
23, 0, 0, 0, 28, 0, 0, 0, 23,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 22, 0, 0, 0, 22, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0, { Tịnh đỏ }
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 22, 0, 0, 0, 22, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
23, 0, 0, 0, 28, 0, 0, 0, 23,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 25, 0, 0, 0, 25, 0, 0)),
((40, 35, 40, 40, 40, 40, 40, 35, 40, {Mã xanh}
40, 41, 42, 40, 20, 40, 42, 41, 40,
40, 42, 43, 40, 40, 40, 43, 42, 40,
40, 42, 43, 43, 43, 43, 43, 42, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 41, 42, 42, 42, 42, 42, 41, 40,
40, 40, 40, 40, 40, 40, 40, 40, 40),
(40, 40, 40, 40, 40, 40, 40, 40, 40, { Mã đỏ }
40, 41, 42, 42, 42, 42, 42, 41, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 43, 44, 44, 44, 44, 44, 43, 40,
40, 42, 43, 43, 43, 43, 43, 42, 40,
40, 42, 43, 40, 40, 40, 43, 42, 40,
40, 41, 42, 40, 20, 40, 42, 41, 40,
40, 35, 40, 40, 40, 40, 40, 35, 40)),
((50, 50, 50, 50, 50, 50, 50, 50, 50, { Pháo xanh}
50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 51, 53, 53, 55, 53, 53, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 51, 51, 51, 51, 51, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50),
(50, 50, 50, 50, 50, 50, 50, 50, 50, { Pháo đỏ }
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 51, 51, 51, 51, 51, 51, 50,
50, 51, 50, 50, 50, 50, 50, 51, 50,
50, 51, 53, 53, 55, 53, 53, 51, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50)),
((89, 92, 90, 90, 90, 90, 90, 92, 89, { Xe xanh }
91, 92, 90, 93, 90, 93, 90, 92, 91,
90, 92, 90, 91, 90, 91, 90, 92, 90,
90, 91, 90, 91, 90, 91, 90, 91, 90,
90, 94, 90, 94, 90, 94, 90, 94, 90,
90, 93, 90, 91, 90, 91, 90, 93, 90,
90, 91, 90, 91, 90, 91, 90, 91, 90,
90, 91, 90, 90, 90, 90, 90, 91, 90,
90, 92, 91, 91, 90, 91, 91, 92, 90,
90, 90, 90, 90, 90, 90, 90, 90, 90),
(90, 90, 90, 90, 90, 90, 90, 90, 90, { Xe đỏ }
90, 92, 91, 91, 90, 91, 91, 92, 90,
90, 91, 90, 90, 90, 90, 90, 91, 90,
90, 91, 90, 91, 90, 91, 90, 91, 90,
90, 93, 90, 91, 90, 91, 90, 93, 90,
90, 94, 90, 94, 90, 94, 90, 94, 90,
90, 91, 90, 91, 90, 91, 90, 91, 90,
90, 92, 90, 91, 90, 91, 90, 92, 90,
91, 92, 90, 93, 90, 93, 90, 92, 91,
89, 92, 90, 90, 90, 90, 90, 92, 89)),
((0, 0, 0, 30, 35, 30, 0, 0, 0, { Tướng xanh}
0, 0, 0, 15, 15, 15, 0, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0, { Tướng đỏ }
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 0, 15, 15, 15, 0, 0, 0,
0, 0, 0, 30, 35, 30, 0, 0, 0)));
var i,s:integer;
function Bonous: integer;
const pn: array[0..6] of integer = (0,-2, -3, -3, -4, -4, -5); { There is not King }
var bn: array[1..2, 0..6] of integer;
i: integer;
s:longint;
begin
for i := 0 to 6 do
begin
bn[DARK, i] := pn[i];
bn[RED, i] := pn[i];
end;
for i := 1 to 2 do
begin { Scan DARK and RED }
if materialnumber[i, BISHOP] < 2 then
begin
inc(bn[3-i, ROOK], 4);
inc(bn[3-i, KNIGHT], 2);
inc(bn[3-i, PAWN], 1);
end;
if materialnumber[i, ELEPHANT] < 2 then
begin
inc(bn[3-i, ROOK], 2);
inc(bn[3-i, CANNON], 2);
inc(bn[3-i, PAWN], 1);
end;
end;
if (piececolor[1]=DARK) and (PieceColor[2]=DARK) and (Piece[1]=ROOK) and (Piece[2]=KNIGHT) then
dec(bn[DARK, 0], 10);
if (PieceColor[8]=DARK) and (PieceColor[9]=DARK) and (Piece[9]=ROOK) and (Piece[8]=KNIGHT) then
dec(bn[DARK, 0], 10);
if (PieceColor[82]=RED) and (PieceColor[83]=RED) and (Piece[82]=ROOK) and (Piece[83]=KNIGHT) then
dec(bn[RED, 0], 10);
if (PieceColor[89]=RED) and (PieceColor[90]=RED) and (Piece[90]=ROOK) and (Piece[89]=KNIGHT) then
dec(bn[RED, 0], 10);
s := bn[DARK, 0] - bn[RED, 0];
for i := 1 to 6 do
s := s + materialnumber[DARK, i] * bn[DARK, i]
- materialnumber[RED, i] * bn[RED, i];
Bonous := s;
end;
begin
inc(EvalCOunt);
s := 0;
for i := 1 to BOARD_SIZE do
begin
// a:=Piece[i] div 10;
if PieceColor[i]= DARK then s := s + PieceValue[Piece[i]]+pointtable[Piece[i], DARK, i]
else if PieceColor[i] = RED then s := s - PieceValue[Piece[i]]-pointtable[Piece[i], RED, i];;
end;
Eval := s + Bonous;
end;
Function TMainForm.AlphaBeta(Alpha,Beta:Integer;Depth:byte):integer;
Var i,Best,Value,p,j,n,k,fcannon,x,y,t:Integer;
Procedure Common(s,d:integer);
var FACEKING:boolean;
CL,PIE:byte;
begin
if KingFace(s,d) then exit;
FACEKING:=(Piece[D]=KING);
PIE:=Piece[d];
CL:=PieceColor[d];
Piece[d]:=Piece[s];
Piece[s]:=EMPTY;
PieceColor[d]:=PieceColor[s];
PieceColor[s]:=EMPTY;
side:=3-side;
if FACEKING then value:=1000-MAX_FLY+Depth
else value:=-AlphaBeta(-Beta,-Alpha,Depth-1);
side:=3-side;
Piece[s]:=Piece[d];
Piece[d]:=PIE;
PieceColor[s]:=PieceCOlor[d];
PieceColor[d]:=CL;
if value>best then
begin
best:=value;
if Depth=Max_Fly then
begin
NewMove.Source:=i;
NewMove.dest:=y;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -