这是我写的车的着法: 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;
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;
棋盘就一个二维数组呀
// 参数 要判断的棋子,开始位置,终止位置
// 返回值 布尔值,返回棋子是否可以移动
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;
}
效果:
代码:
www.dullwolf.cn/chess.rar