⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kukoeval.pas

📁 source code for caro game on Java
💻 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 + -