我在写一个中国象棋组件,我写到判断炮的着法是否合法,炮的着法与车差不多,就是吃子的方式不一样,车的着法我倒写好了,但是炮的着法我写不出,有人知道吗?可否分享一下代码?
我的QQ:414695474
谢谢

解决方案 »

  1.   

    这是我写的车的着法:
    function TCChess.CheckLegalRookMove(oldcr, newcr: Cross): Boolean;   //判断车着法是否法
    var
        x,y,r,n,p: Integer;
        v: Cross;//枚举类型,表示所有90个交叉点;
    begin
        Result:=TRUE;    x:=XPos(oldcr);
        y:=YPos(oldcr);
        p:=ColorOfPieceOncross(oldcr);     //黑子,红子,或无子;    for n:=-1 to 1 do
         if (n<>0) then
            for r:=1 to 8 do
             begin
                v:=MouseTocross(x+n*r,y);       //横向着法
                if ((ColorOfPieceOncross(v)=NoPiece)or(ColorOfPieceOncross(v)<>p))then //要么无子,要么是对方的子;
                begin
                    if (v=newcr) then Exit;
                end;
                if (ColorOfPieceOncross(v)<>NoPiece) then Break;
            end;    for n:=-1 to 1 do
         if (n<>0) then
            for r:=1 to 9 do
            begin
                v:=MouseTocross(x,y+n*r);        //纵向着法;
                if ((ColorOfPieceOncross(v)=NoPiece)or(ColorOfPieceOncross(v)<>p))then
                begin
                    if (v=newcr) then Exit;
                end;
                if (ColorOfPieceOncross(v)<>NoPiece) then Break;
            end;    Result:=FALSE;
    end;
      

  2.   

    v: Cross;//枚举类型,表示所有90个交叉点;------------------------这是什么意思?
    棋盘就一个二维数组呀
      

  3.   

    没有这么复杂,去网上搜索一下有delphi的象棋棋盘控件,好像叫TXiangQi?还是啥的,忘了
      

  4.   

    // 判断是否可以移动
    // 参数 要判断的棋子,开始位置,终止位置
    // 返回值 布尔值,返回棋子是否可以移动
    bool CChessComm::ChessCanMove( WORD wdChess, POINT ptMoveFrom, POINT ptMoveTo )
    {
    long i,j,k,x; // 循环临时变量
    switch(wdChess)
    {
    // 将帅走法
    case RED_KING:
    case BLACK_KING:
    // 不能斜着走
    if(ptMoveFrom.x != ptMoveTo.x && ptMoveFrom.y != ptMoveTo.y)
    return false;
    // 一次不能移动超过两格
    if(ZhengShu((ptMoveFrom.x - ptMoveTo.x)) > 1 || ZhengShu((ptMoveFrom.y - ptMoveTo.y)) > 1)
    return false;
    // 不能超出宫
    if(( wdChess == BLACK_KING) && ((ptMoveTo.x < 3 || ptMoveTo.x >5) || (ptMoveTo.y < 0 || ptMoveTo.y > 2)))
    return false;
    if(( wdChess == RED_KING) && ((ptMoveTo.x < 3 || ptMoveTo.x >5) || (ptMoveTo.y < 7 || ptMoveTo.y > 9)))
    return false;
    break;
    // 士走法
    case RED_SHI:
    case BLACK_SHI:
    // 不能超出宫
    if(( wdChess == BLACK_SHI) && ((ptMoveTo.x < 3 || ptMoveTo.x >5) || (ptMoveTo.y < 0 || ptMoveTo.y > 2)))
    return false;
    if(( wdChess == RED_SHI) && ((ptMoveTo.x < 3 || ptMoveTo.x >5) || (ptMoveTo.y < 7 || ptMoveTo.y > 9)))
    return false;
    // 只能斜线一格
    if(ZhengShu((ptMoveFrom.x - ptMoveTo.x)) == 1 && ZhengShu((ptMoveFrom.y - ptMoveTo.y)) == 1)
    return true;
    else
    return false;
    break;
    // 象相走法
    case RED_XIANG:
    case BLACK_XIANG:
    // 不能过河
    if(( wdChess == BLACK_XIANG) && (ptMoveTo.y < 0 || ptMoveTo.y > 4))
    return false;
    if(( wdChess == RED_XIANG) && (ptMoveTo.y > 10 || ptMoveTo.y < 5))
    return false;
    // 只能斜线两格
    if(ZhengShu((ptMoveFrom.x - ptMoveTo.x)) == 2 && ZhengShu((ptMoveFrom.y - ptMoveTo.y)) == 2)
    {
    // 象脚判断
    if(g_pChessBoard->ChessBoard[(ptMoveFrom.y + ptMoveTo.y)/2][(ptMoveFrom.x + ptMoveTo.x)/2] != NOCHESS)
    return false;
    return true;
    }
    else
    return false;
    break;
    // 兵卒走法
    case RED_BING:
    case BLACK_ZU:
    // 不能斜着走
    if(ptMoveFrom.x != ptMoveTo.x && ptMoveFrom.y != ptMoveTo.y)
    {
    return false;
    }
    // 一次不能移动超过两格
    if(ZhengShu((ptMoveFrom.x - ptMoveTo.x)) > 1 || ZhengShu((ptMoveFrom.y - ptMoveTo.y)) > 1)
    return false; // 无法后退
    if((wdChess == BLACK_ZU && ptMoveFrom.y > ptMoveTo.y) || (wdChess == RED_BING && ptMoveFrom.y < ptMoveTo.y))
    return false;

    // 没过河不能横走
    if(wdChess == BLACK_ZU && ptMoveFrom.y < 5 && ptMoveFrom.x != ptMoveTo.x)
    return false;
    if(wdChess == RED_BING && ptMoveFrom.y > 4 && ptMoveFrom.x != ptMoveTo.x)
    return false;
    break;
    // 车的走法
    case RED_JU:
    case BLACK_JU:
    // 不能斜着走
    if(ptMoveFrom.x != ptMoveTo.x && ptMoveFrom.y != ptMoveTo.y)
    return false;
    // 中间是否有棋子
    if(ptMoveFrom.x != ptMoveTo.x)
    {
    j = ptMoveFrom.x;
    k = ptMoveTo.x;
    if(j>k)
    SwapNumber(&j,&k);
    for( i=j+1; i<k; i++ )
    {
    if(g_pChessBoard->ChessBoard[ptMoveFrom.y][i] != NOCHESS)
    return false;
    }
    }
    if(ptMoveFrom.y != ptMoveTo.y)
    {
    j = ptMoveFrom.y;
    k = ptMoveTo.y;
    if(j>k)
    SwapNumber(&j,&k);
    for( i=j+1; i<k; i++ )
    {
    if(g_pChessBoard->ChessBoard[i][ptMoveFrom.x] != NOCHESS)
    return false;
    }
    }
    break;
    // 马的走法
    case RED_MA:
    case BLACK_MA:
    // 限制位置
    if( ZhengShu(ptMoveFrom.x - ptMoveTo.x) == 1 )
    {
    // 是否在日字内
    if(ZhengShu(ptMoveFrom.y - ptMoveTo.y) != 2)
    return false;
    // 马脚判断
    if(ptMoveFrom.y < ptMoveTo.y && g_pChessBoard->ChessBoard[ptMoveFrom.y+1][ptMoveFrom.x] != NOCHESS)
    return false;
    if(ptMoveFrom.y > ptMoveTo.y && g_pChessBoard->ChessBoard[ptMoveFrom.y-1][ptMoveFrom.x] != NOCHESS)
    return false;
    }
    else if( ZhengShu(ptMoveFrom.y - ptMoveTo.y) == 1 )
    {
    // 是否在日字内
    if(ZhengShu(ptMoveFrom.x - ptMoveTo.x) != 2)
    return false;
    // 马脚判断
    if(ptMoveFrom.x < ptMoveTo.x && g_pChessBoard->ChessBoard[ptMoveFrom.y][ptMoveFrom.x+1] != NOCHESS)
    return false;
    if(ptMoveFrom.x > ptMoveTo.x && g_pChessBoard->ChessBoard[ptMoveFrom.y][ptMoveFrom.x-1] != NOCHESS)
    return false;

    }
    else
    return false;
    break;
    // 炮的走法
    case RED_PAO:
    case BLACK_PAO:
    // 不能斜着走
    if(ptMoveFrom.x != ptMoveTo.x && ptMoveFrom.y != ptMoveTo.y)
    return false;
    // 如果目标有棋子,判断中间是否有个棋子
    if(g_pChessBoard->ChessBoard[ptMoveTo.y][ptMoveTo.x] != NOCHESS)
    {
    if(ptMoveFrom.x == ptMoveTo.x)
    {
    j = ptMoveFrom.y;
    k = ptMoveTo.y;
    if(j>k)
    SwapNumber(&j,&k);
    x = 0;
    for( i=j+1; i<k; i++ )
    {
    if(g_pChessBoard->ChessBoard[i][ptMoveFrom.x] != NOCHESS)
    x++;
    }
    if(x != 1)
    return false;
    }
    else
    {
    j = ptMoveFrom.x;
    k = ptMoveTo.x;
    if(j>k)
    SwapNumber(&j,&k);
    x = 0;
    for( i=j+1; i<k; i++ )
    {
    if(g_pChessBoard->ChessBoard[ptMoveFrom.y][i] != NOCHESS)
    x++;
    }
    if(x != 1)
    return false;
    }
    }
    else// 目标不是有对方棋子
    {
    if(ptMoveFrom.x == ptMoveTo.x)
    {
    j = ptMoveFrom.y;
    k = ptMoveTo.y;
    if(j>k)
    SwapNumber(&j,&k);
    for( i=j+1; i<k; i++ )
    {
    if(g_pChessBoard->ChessBoard[i][ptMoveFrom.x] != NOCHESS)
    return false;
    }
    }
    else
    {
    j = ptMoveFrom.x;
    k = ptMoveTo.x;
    if(j>k)
    SwapNumber(&j,&k);
    for( i=j+1; i<k; i++ )
    {
    if(g_pChessBoard->ChessBoard[ptMoveFrom.y][i] != NOCHESS)
    return false;
    }

    }
    }
    break;
    default:
    return false;
    }
    return true;
    }
      

  5.   

    看看 王 晓春的 那本书 很经典的 呵呵 想要 代码 的话给我 邮箱 [email protected]
      

  6.   

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