📄 kukoeval.pas
字号:
type
Pole = record
x,y,w : Integer;
end;
const
SLEN = 238;
S1 : array[1..SLEN*3] of Integer = (
100,0,0,
0,5,0,
0,4,0,
0,3,1,
0,2,KukoX,
0,1,0,
0,0,0,
100,0,0,
5,5,0,
4,4,0,
3,3,1,
2,2,KukoX,
1,1,0,
0,0,0,
100,0,0,
0,6,KukoO,
0,5,0,
0,4,3,
0,3,KukoX,
0,2,KukoX,
0,1,0,
0,0,0,
100,0,0,
6,6,KukoO,
5,5,0,
4,4,3,
3,3,KukoX,
2,2,KukoX,
1,1,0,
0,0,0,
100,0,0,
0,6,KukoO,
0,5,1,
0,4,KukoX,
0,3,3,
0,2,KukoX,
0,1,5,
0,0,1,
100,0,0,
6,6,KukoO,
5,5,1,
4,4,KukoX,
3,3,3,
2,2,KukoX,
1,1,5,
0,0,1,
100,0,0,
0,6,0,
0,5,0,
0,4,KukoX,
0,3,3,
0,2,KukoX,
0,1,5,
0,0,1,
100,0,0,
6,6,0,
5,5,0,
4,4,KukoX,
3,3,3,
2,2,KukoX,
1,1,5,
0,0,1,
100,0,0,
0,5,0,
0,4,KukoX,
0,3,5,
0,2,0,
0,1,KukoX,
0,0,0,
100,0,0,
5,5,0,
4,4,KukoX,
3,3,5,
2,2,0,
1,1,KukoX,
0,0,0,
100,0,0,
0,5,0,
0,4,5,
0,3,6,
0,2,KukoX,
0,1,KukoX,
0,0,0,
100,0,0,
5,5,0,
4,4,5,
3,3,6,
2,2,KukoX,
1,1,KukoX,
0,0,0,
100,0,0,
0,5,KukoO,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,9,
0,0,9,
100,0,0,
5,5,KukoO,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,9,
0,0,9,
100,0,0,
0,5,9,
0,4,25,
0,3,KukoX,
0,2,KukoX,
0,1,KukoX,
0,0,0,
100,0,0,
5,5,9,
4,4,25,
3,3,KukoX,
2,2,KukoX,
1,1,KukoX,
0,0,0,
100,0,0,
0,4,KukoX,
0,3,15,
0,2,KukoX,
0,1,0,
0,0,KukoX,
100,0,0,
4,4,KukoX,
3,3,15,
2,2,KukoX,
1,1,0,
0,0,KukoX,
100,0,0,
0,5,9,
0,4,KukoX,
0,3,9,
0,2,KukoX,
0,1,KukoX,
0,0,KukoO,
100,0,0,
5,5,9,
4,4,KukoX,
3,3,9,
2,2,KukoX,
1,1,KukoX,
0,0,KukoO,
100,0,0,
0,6,KukoO,
0,5,9,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,0,
0,0,KukoO,
100,0,0,
6,6,KukoO,
5,5,9,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,0,
0,0,KukoO,
100,0,0,
0,5,10,
0,4,KukoX,
0,3,KukoX,
0,2,9,
0,1,KukoX,
0,0,KukoO,
100,0,0,
5,5,10,
4,4,KukoX,
3,3,KukoX,
2,2,9,
1,1,KukoX,
0,0,KukoO,
100,0,0,
0,5,KukoX,
0,4,10,
0,3,10,
0,2,KukoX,
0,1,KukoX,
100,0,0,
5,5,KukoX,
4,4,10,
3,3,10,
2,2,KukoX,
1,1,KukoX,
100,0,0,
0,5,9,
0,4,KukoX,
0,3,25,
0,2,KukoX,
0,1,KukoX,
0,0,9,
100,0,0,
5,5,9,
4,4,KukoX,
3,3,25,
2,2,KukoX,
1,1,KukoX,
0,0,9,
100,0,0,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,KukoX,
0,0,75,
100,0,0,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,KukoX,
0,0,75,
100,0,0,
0,4,KukoX,
0,3,KukoX,
0,2,36,
0,1,KukoX,
0,0,KukoX,
100,0,0,
4,4,KukoX,
3,3,KukoX,
2,2,36,
1,1,KukoX,
0,0,KukoX,
100,0,0,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,75,
0,0,KukoX,
100,0,0,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,75,
0,0,KukoX,
100,0,0,
150,0,0);
{------------------------}
S2 : array[1..SLEN*3] of Integer = (
100,0,0,
0,5,0,
0,4,0,
0,3,1,
0,2,KukoX,
0,1,0,
0,0,0,
100,0,0,
5,5,0,
4,4,0,
3,3,1,
2,2,KukoX,
1,1,0,
0,0,0,
100,0,0,
0,6,KukoO,
0,5,0,
0,4,3,
0,3,KukoX,
0,2,KukoX,
0,1,0,
0,0,0,
100,0,0,
6,6,KukoO,
5,5,0,
4,4,3,
3,3,KukoX,
2,2,KukoX,
1,1,0,
0,0,0,
100,0,0,
0,6,KukoO,
0,5,1,
0,4,KukoX,
0,3,3,
0,2,KukoX,
0,1,5,
0,0,1,
100,0,0,
6,6,KukoO,
5,5,1,
4,4,KukoX,
3,3,3,
2,2,KukoX,
1,1,5,
0,0,1,
100,0,0,
0,6,0,
0,5,0,
0,4,KukoX,
0,3,3,
0,2,KukoX,
0,1,5,
0,0,1,
100,0,0,
6,6,0,
5,5,0,
4,4,KukoX,
3,3,3,
2,2,KukoX,
1,1,5,
0,0,1,
100,0,0,
0,5,0,
0,4,KukoX,
0,3,5,
0,2,0,
0,1,KukoX,
0,0,0,
100,0,0,
5,5,0,
4,4,KukoX,
3,3,5,
2,2,0,
1,1,KukoX,
0,0,0,
100,0,0,
0,5,0,
0,4,5,
0,3,6,
0,2,KukoX,
0,1,KukoX,
0,0,0,
100,0,0,
5,5,0,
4,4,5,
3,3,6,
2,2,KukoX,
1,1,KukoX,
0,0,0,
100,0,0,
0,5,KukoO,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,9,
0,0,9,
100,0,0,
5,5,KukoO,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,9,
0,0,9,
100,0,0,
0,5,9,
0,4,27,
0,3,KukoX,
0,2,KukoX,
0,1,KukoX,
0,0,0,
100,0,0,
5,5,9,
4,4,27,
3,3,KukoX,
2,2,KukoX,
1,1,KukoX,
0,0,0,
100,0,0,
0,4,KukoX,
0,3,15,
0,2,KukoX,
0,1,0,
0,0,KukoX,
100,0,0,
4,4,KukoX,
3,3,15,
2,2,KukoX,
1,1,0,
0,0,KukoX,
100,0,0,
0,5,9,
0,4,KukoX,
0,3,9,
0,2,KukoX,
0,1,KukoX,
0,0,KukoO,
100,0,0,
5,5,9,
4,4,KukoX,
3,3,9,
2,2,KukoX,
1,1,KukoX,
0,0,KukoO,
100,0,0,
0,6,KukoO,
0,5,9,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,0,
0,0,KukoO,
100,0,0,
6,6,KukoO,
5,5,9,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,0,
0,0,KukoO,
100,0,0,
0,5,10,
0,4,KukoX,
0,3,KukoX,
0,2,9,
0,1,KukoX,
0,0,KukoO,
100,0,0,
5,5,10,
4,4,KukoX,
3,3,KukoX,
2,2,9,
1,1,KukoX,
0,0,KukoO,
100,0,0,
0,5,KukoX,
0,4,10,
0,3,10,
0,2,KukoX,
0,1,KukoX,
100,0,0,
5,5,KukoX,
4,4,10,
3,3,10,
2,2,KukoX,
1,1,KukoX,
100,0,0,
0,5,9,
0,4,KukoX,
0,3,27,
0,2,KukoX,
0,1,KukoX,
0,0,9,
100,0,0,
5,5,9,
4,4,KukoX,
3,3,27,
2,2,KukoX,
1,1,KukoX,
0,0,9,
100,0,0,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,KukoX,
0,0,99,
100,0,0,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,KukoX,
0,0,99,
100,0,0,
0,4,KukoX,
0,3,KukoX,
0,2,75,
0,1,KukoX,
0,0,KukoX,
100,0,0,
4,4,KukoX,
3,3,KukoX,
2,2,75,
1,1,KukoX,
0,0,KukoX,
100,0,0,
0,4,KukoX,
0,3,KukoX,
0,2,KukoX,
0,1,99,
0,0,KukoX,
100,0,0,
4,4,KukoX,
3,3,KukoX,
2,2,KukoX,
1,1,99,
0,0,KukoX,
100,0,0,
150,0,0);
var
S : array[0..SLEN] of Pole;
KukoMark : array[1..SIZE_X,1..SIZE_Y] of Integer;
{---------------------------------------------------------}
function ZA(ppx,ppy,co:Integer):Integer;
begin
if (ppx<1) or (ppx>SIZE_X) or (ppy<1) or (ppy>SIZE_Y) then
begin
if co=KukoX then ZA:=KukoO else ZA:=KukoX;
Exit;
end
else ZA:=KukoPiece[ppy,ppx];
end;
{---------------------------------------------------------}
procedure UpdateValueTable(co:Integer);
var
px,py,p3 : Integer;
ok,ok1,ok2,ok3,ok4,ok5,ok6,ok7 : Boolean;
x3,y3,w3,xx,yy,pr : Integer;
begin
px:=0;
py:=0;
for xx:=1 to SIZE_X do
for yy:=1 to SIZE_Y do if KukoPiece[yy,xx]=co then
begin
pr:=0;
while S[pr+1].x<>150 do
begin
Inc(pr); {?}
p3:=pr;
ok :=True; ok1:=True; ok2:=True; ok3:=True;
ok4:=True; ok5:=True; ok6:=True; ok7:=True;
while (S[p3].x<>100) do
begin
if S[p3].w=KukoX then
begin
px:=S[p3].x;
py:=S[p3].y;
Break;
end;
Inc(p3); {truoc hay sau ?}
end;
p3:=pr;
while (S[p3].x<>100) do
begin
x3:=S[p3].x;
y3:=S[p3].y;
w3:=S[p3].w;
if (co=KukoO) then if w3=KukoX then w3:=KukoO;
if (co=KukoX) then if w3=KukoO then w3:=KukoX;
if w3<100 then w3:=0;
if ZA(xx+(px-x3),yy+(py-y3),co)<>w3 then ok:=False;
if ZA(xx+(px-x3),yy-(py-y3),co)<>w3 then ok1:=False;
if ZA(xx-(px-x3),yy+(py-y3),co)<>w3 then ok2:=False;
if ZA(xx-(px-x3),yy-(py-y3),co)<>w3 then ok3:=False;
if ZA(xx+(py-y3),yy+(px-x3),co)<>w3 then ok4:=False;
if ZA(xx+(py-y3),yy-(px-x3),co)<>w3 then ok5:=False;
if ZA(xx-(py-y3),yy+(px-x3),co)<>w3 then ok6:=False;
if ZA(xx-(py-y3),yy-(px-x3),co)<>w3 then ok7:=False;
Inc(p3);
end;
if ok then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx+(px-x3),yy+(py-y3)],S[p3].w);
Inc(p3);
end;
end;
if ok1 then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx+(px-x3),yy-(py-y3)],S[p3].w);
Inc(p3);
end;
end;
if ok2 then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx-(px-x3),yy+(py-y3)],S[p3].w);
Inc(p3);
end;
end;
if ok3 then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx-(px-x3),yy-(py-y3)],S[p3].w);
Inc(p3);
end;
end;
if ok4 then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx+(py-y3),yy+(px-x3)],S[p3].w);
Inc(p3);
end;
end;
if ok5 then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx+(py-y3),yy-(px-x3)],S[p3].w);
Inc(p3);
end;
end;
if ok6 then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx-(py-y3),yy+(px-x3)],S[p3].w);
Inc(p3);
end;
end;
if ok7 then
begin
p3:=pr;
while S[p3].x<>100 do
begin
x3:=S[p3].x;
y3:=S[p3].y;
if S[p3].w<100 then Inc(KukoMark[xx-(py-y3),yy-(px-x3)],S[p3].w);
Inc(p3);
end;
end;
pr:=p3;
end;
end;
end;
{---------------------------------------------------------}
procedure Kuko(who:Integer;var m:Move);
var
count,maxw,i,j,super : Integer;
BestMove : array[1..16] of Move;
begin
FillChar(KukoMark,SizeOf(KukoMark),0);
if who=KukoX then super:=KukoO else super:=KukoX;
for i:=0 to SLEN-1 do
begin
S[i].x:=S1[i*3+1];
S[i].y:=S1[i*3+2];
S[i].w:=S1[i*3+3];
end;
UpdateValueTable(super);
for i:=0 to SLEN-1 do
begin
S[i].x:=S2[i*3+1];
S[i].y:=S2[i*3+2];
S[i].w:=S2[i*3+3];
end;
UpdateValueTable(who);
count:=0;
maxw:=0;
for i:=1 to SIZE_X do
for j:=1 to SIZE_Y do
if KukoPiece[j,i]=EMPTY then
begin
if KukoMark[i,j]>maxw then
begin
count:=1;
maxw:=KukoMark[i,j];
BestMove[1].Row:=j;
BestMove[1].Col:=i;
end
else if (KukoMark[i,j]=maxw) and (count<16) then
begin
Inc(count);
BestMove[count].Row:=j;
BestMove[count].Col:=i;
end;
end;
if count>0 then m:=BestMove[Random(count)+1] else m.Row:=0;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -