如题 搜索了很久都找不到中国象棋的机器人脚本
delphi写的中国象棋到是很多源码,写的也非常的不错!
但是不能像其它的软件那样和电脑对战!
谁有这方面的代码?本人主要是要中国象棋的智能脚本!!
全部分压上

解决方案 »

  1.   


    BOOL EnumList(int tmap[11][12],POINT tmanposition[32],int &tside,int *chessman,POINT *move,int &count)
    {
    #define ADD(man,tx,ty) {chessman[count]=man;move[count].x=tx;move[count].y=ty;count++;if(tmap[tx][ty]==FistOfSide[!tside])goto _NOKING;}
    static int i,j,n,x,y;
    static BOOL flag;
    count=0;
    for(n=FistOfSide[tside];n<=LastOfSide[tside];n++)
    {
    x=tmanposition[n].x;
    if(!x)continue;
    y=tmanposition[n].y;
    switch(n)
    {
    case 0:
    if(tmanposition[0].x==tmanposition[16].x) //将帅在同一列
    {
    flag=FALSE;
    for(j=tmanposition[16].y+1;j<tmanposition[0].y;j++)
    {
    if(tmap[x][j]!=32)
    {
    flag=TRUE;
    break;
    }
    }
    if (!flag)
    {
    ADD(0,x,tmanposition[16].y);
    }
    }
    j=y+1;if(j<=10 && NORED(x,j)) ADD(0,x,j)
    j=y-1;if(j>=8  && NORED(x,j)) ADD(0,x,j)
    i=x+1;if(i<=6  && NORED(i,y)) ADD(0,i,y)
    i=x-1;if(i>=4  && NORED(i,y)) ADD(0,i,y)
    break;
    case 16:
    if(tmanposition[0].x==tmanposition[16].x) //将帅在同一列
    {
    flag=FALSE;
    for(j=tmanposition[16].y+1;j<tmanposition[0].y;j++)
    {
    if(tmap[x][j]!=32)
    {
    flag=TRUE;
    break;
    }
    }
    if (!flag)
    {
    ADD(16,x,tmanposition[0].y);
    }
    }
    j=y+1;if(j<=3 && NOBLACK(x,j)) ADD(16,x,j)
    j=y-1;if(j>=1  && NOBLACK(x,j)) ADD(16,x,j)
    i=x+1;if(i<=6  && NOBLACK(i,y)) ADD(16,i,y)
    i=x-1;if(i>=4  && NOBLACK(i,y)) ADD(16,i,y)
    break;
    case 1:
    case 2:
    i=x+1;j=y+1;if(i<=6 && j<=10 && NORED(i,j)) ADD(n,i,j)
    i=x+1;j=y-1;if(i<=6 && j>=8  && NORED(i,j)) ADD(n,i,j)
    i=x-1;j=y+1;if(i>=4 && j<=10 && NORED(i,j)) ADD(n,i,j)
    i=x-1;j=y-1;if(i>=4 && j>=8  && NORED(i,j)) ADD(n,i,j)
    break;
    case 17:
    case 18:
    i=x+1;j=y+1;if(i<=6 && j<=3 && NOBLACK(i,j)) ADD(n,i,j)
    i=x+1;j=y-1;if(i<=6 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
    i=x-1;j=y+1;if(i>=4 && j<=3 && NOBLACK(i,j)) ADD(n,i,j)
    i=x-1;j=y-1;if(i>=4 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
    break;
    case 3:
    case 4:
    i=x+2;j=y+2;if(i<=9 && j<=10   && NORED(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
    i=x+2;j=y-2;if(i<=9 && j>=6    && NORED(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
    i=x-2;j=y+2;if(i>=1 && j<=10   && NORED(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
    i=x-2;j=y-2;if(i>=1 && j>=6    && NORED(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
    break;
    case 19:
    case 20:
    i=x+2;j=y+2;if(i<=9 && j<=5  && NOBLACK(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
    i=x+2;j=y-2;if(i<=9 && j>=1  && NOBLACK(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
    i=x-2;j=y+2;if(i>=1 && j<=5  && NOBLACK(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
    i=x-2;j=y-2;if(i>=1 && j>=1  && NOBLACK(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
    break;
    case 5:
    case 6:
    i=x+1;
    if(NOMAN(i,y))
    {
    i=x+2;j=y+1;if(i<=9 && j<=10 && NORED(i,j)) ADD(n,i,j)
    i=x+2;j=y-1;if(i<=9 && j>=1  && NORED(i,j)) ADD(n,i,j)
    }
    i=x-1;
    if(NOMAN(i,y))
    {
    i=x-2;j=y+1;if(i>=1 && j<=10 && NORED(i,j)) ADD(n,i,j)
    i=x-2;j=y-1;if(i>=1 && j>=1  && NORED(i,j)) ADD(n,i,j)
    }
    j=y+1;
    if(NOMAN(x,j))
    {
    i=x+1;j=y+2;if(i<=9 && j<=10 && NORED(i,j)) ADD(n,i,j)
    i=x-1;j=y+2;if(i>=1 && j<=10 && NORED(i,j)) ADD(n,i,j)
    }
    j=y-1;
    if(NOMAN(x,j))
    {
    i=x+1;j=y-2;if(i<=9 && j>=1 && NORED(i,j)) ADD(n,i,j)
    i=x-1;j=y-2;if(i>=1 && j>=1 && NORED(i,j)) ADD(n,i,j)
    }
    break;
    case 21:
    case 22:
    i=x+1;
    if(NOMAN(i,y))
    {
    i=x+2;j=y+1;if(i<=9 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
    i=x+2;j=y-1;if(i<=9 && j>=1  && NOBLACK(i,j)) ADD(n,i,j)
    }
    i=x-1;
    if(NOMAN(i,y))
    {
    i=x-2;j=y+1;if(i>=1 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
    i=x-2;j=y-1;if(i>=1 && j>=1  && NOBLACK(i,j)) ADD(n,i,j)
    }
    j=y+1;
    if(NOMAN(x,j))
    {
    i=x+1;j=y+2;if(i<=9 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
    i=x-1;j=y+2;if(i>=1 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
    }
    j=y-1;
    if(NOMAN(x,j))
    {
    i=x+1;j=y-2;if(i<=9 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
    i=x-1;j=y-2;if(i>=1 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
    }
    break; case 7:
    case 8:
    i=x+1;
    while(i<=9)
    {
    if (NOMAN(i,y)) ADD(n,i,y)
    else
    {
    if(NORED(i,y)) ADD(n,i,y)
    break;
    }
    i++;
    }
    i=x-1;
    while(i>=1)
    {
    if (NOMAN(i,y)) ADD(n,i,y)
    else
    {
    if(NORED(i,y)) ADD(n,i,y)
    break;
    }
    i--;
    }
    j=y+1;
    while(j<=10)
    {
    if (NOMAN(x,j)) ADD(n,x,j)
    else
    {
    if(NORED(x,j)) ADD(n,x,j)
    break;
    }
    j++;
    }
    j=y-1;
    while(j>=1)
    {
    if (NOMAN(x,j)) ADD(n,x,j)
    else
    {
    if(NORED(x,j)) ADD(n,x,j)
    break;
    }
    j--;
    }
    break;
    case 23:
    case 24:
    i=x+1;
    while(i<=9)
    {
    if (NOMAN(i,y)) ADD(n,i,y)
    else
    {
    if(NOBLACK(i,y)) ADD(n,i,y)
    break;
    }
    i++;
    }
    i=x-1;
    while(i>=1)
    {
    if (NOMAN(i,y)) ADD(n,i,y)
    else
    {
    if(NOBLACK(i,y)) ADD(n,i,y)
    break;
    }
    i--;
    }
    j=y+1;
    while(j<=10)
    {
    if (NOMAN(x,j)) ADD(n,x,j)
    else
    {
    if(NOBLACK(x,j)) ADD(n,x,j)
    break;
    }
    j++;
    }
    j=y-1;
    while(j>=1)
    {
    if (NOMAN(x,j)) ADD(n,x,j)
    else
    {
    if(NOBLACK(x,j)) ADD(n,x,j)
    break;
    }
    j--;
    }
    break;
    case 9:
    case 10:
    i=x+1;flag=FALSE;
    while(i<=9)
    {
    if(NOMAN(i,y))
    {
    if(!flag) ADD(n,i,y)
    }
    else
    {
    if(!flag)flag=TRUE;
    else 
    {
    if(NORED(i,y)) ADD(n,i,y)
    break;
    }
    }
    i++;
    } i=x-1;flag=FALSE;
    while(i>=1)
    {
    if(NOMAN(i,y)) 
    {
    if(!flag) ADD(n,i,y)
    }
    else
    {
    if(!flag)flag=TRUE;
    else 
    {
    if(NORED(i,y)) ADD(n,i,y)
    break;
    }
    }
    i--;
    } j=y+1;flag=FALSE;
    while(j<=10)
    {
    if(NOMAN(x,j)) 
    {
    if(!flag) ADD(n,x,j)
    }
    else
    {
    if(!flag)flag=TRUE;
    else 
    {
    if(NORED(x,j)) ADD(n,x,j)
    break;
    }
    }
    j++;
    } j=y-1;flag=FALSE;
    while(j>=1)
    {
    if(NOMAN(x,j)) 
    {
    if(!flag) ADD(n,x,j)
    }
    else
    {
    if(!flag)flag=TRUE;
    else 
    {
    if(NORED(x,j)) ADD(n,x,j)
    break;
    }
    }
    j--;
    }
    break; case 25:
    case 26:
    i=x+1;flag=FALSE;
    while(i<=9)
    {
    if(NOMAN(i,y))
    {
    if(!flag) ADD(n,i,y)
    }
    else
    {
    if(!flag)flag=TRUE;
    else
    {
    if(NOBLACK(i,y)) ADD(n,i,y)
    break;
    }
    }
    i++;
    } i=x-1;flag=FALSE;
    while(i>=1)
    {
    if(NOMAN(i,y)) 
    {
    if(!flag) ADD(n,i,y)
    }
    else
    {
    if(!flag)flag=TRUE;
    else 
    {
    if(NOBLACK(i,y)) ADD(n,i,y)
    break;
    }
    }
    i--;
    } j=y+1;flag=FALSE;
    while(j<=10)
    {
    if(NOMAN(x,j))
    {
    if(!flag) ADD(n,x,j)
    }
    else
    {
    if(!flag)flag=TRUE;
    else 
    {
    if(NOBLACK(x,j)) ADD(n,x,j)
    break;
    }
    }
    j++;
    } j=y-1;flag=FALSE;
    while(j>=1)
    {
    if(NOMAN(x,j))
    {
    if(!flag) ADD(n,x,j)
    }
    else
    {
    if(!flag)flag=TRUE;
    else 
    {
    if(NOBLACK(x,j)) ADD(n,x,j)
    break;
    }
    }
    j--;
    }
    break;
    case 11:
    case 12:
    case 13:
    case 14:
    case 15:
    j=y-1;
    if(j>=1 && NORED(x,j)) ADD(n,x,j)
    if(y<=5)
    {
    i=x+1;if(i<=9 && NORED(i,y)) ADD(n,i,y)
    i=x-1;if(i>=1 && NORED(i,y)) ADD(n,i,y)
    }
    break; case 27:
    case 28:
    case 29:
    case 30:
    case 31:
                     ....................
    }
      

  2.   

    求一delphi的!!!最好是高水平的那种 不要人轻而易举就把电脑给灭了!!!
      

  3.   

    Const
      Len = 8;  { 棋盘的大小是 8×8 }
      Jump : array[1..8,1..2] of integer =  { 向8个方向跳马时,棋盘上位置的变化 }
         ( (2,1),(2,-1),(-2,1),(-2,-1),(1,2),(-1,2),(1,-2),(-1,-2) );
    Var
      Map : array[1..Len,1..Len] of integer;  { 定义棋盘 }procedure Try( Step, Row,Col : integer );  { 递归过程 }
      var
        i, j : integer;
    begin
      if Step>Len*Len then
        begin   { 所有棋盘已经走完 }
            输出结果;    
        end
      else
        for i:= 1 to 8 do  { 8个方向逐一试试 }
          if ( Row+Jump[i,1] > 0 ) and ( Row+Jump[i,1] <= Len ) and 
             ( Col+Jump[i,2] > 0 ) and ( Row+Jump[i,2] <= Len ) and   { 检查是否跳出边界 }
             ( Map[ Row+Jump[i,1], Col+Jump[i,2] ] = 0 ) { 检查该位置是否已经走过 }
          then 
            begin    
              Map[ Row+Jump[i,1], Col+Jump[i,2] ] = Step; { 表示第Step步走在该位置 }
              Try( Step+1, Row+Jump[i,1], Col+Jump[i,2] ); {试下一步,同时棋子的位置也相应改变 }
              Map[ Row+Jump[i,1], Col+Jump[i,2] ] = 0; {该位置清0,即认为没有走过}
              { 通过 for 循环,试走下一个方向 }
            end;
    end;BEGIN  { 主程序 }
      FillChar( Map,SizeOf(Map),0);  {给Map数组中各个元素赋初值0,表示没有走过}
      Try(1,1,4);   {  try( 步骤, 行,列 ),  }
    END.
    你可以把程序拓宽就能实现你的功能了
      

  4.   

    www.dullwolf.cn/chess/
    效果:
    代码:
    www.dullwolf.cn/chess.rar 
      

  5.   

    大笨狼的ajax象棋,今天下午拉风了