📄 validate.c
字号:
}
//-----------------------------------------------------------------
// 搜索from位置上piececlour颜色的“王”当前所有可能的合法移动
//-----------------------------------------------------------------
void val_king(BYTE from[],BOOL piececolour)
{
BYTE tmp,row;
//取得对方王的位置
if (piececolour == WHITE)
{ opp_king_pos[0] = bl_king_pos[0];
opp_king_pos[1] = bl_king_pos[1];
}
else
{ opp_king_pos[0] = wh_king_pos[0];
opp_king_pos[1] = wh_king_pos[1];
}
//王可向任何方向移动,但只能形动一格(故搜索深度为1)
val_north (from,piececolour,1);
val_south (from,piececolour,1);
val_east (from,piececolour,1);
val_west (from,piececolour,1);
val_northeast(from,piececolour,1);
val_northwest(from,piececolour,1);
val_southeast(from,piececolour,1);
val_southwest(from,piececolour,1);
//尝试"王车易位",先取得白子或黑子的底线掩码及底行行号
if (piececolour & 0x08) { tmp = bl_base_cont; row = MAX_ROW; }
else { tmp = wh_base_cont; row = MIN_ROW; }
//如果王与左边的车之间的3个棋子不存在(1F->11111,11->10001)
//则设置王可移到"左边象"的位置(0x04)
if ((tmp & 0x1F)== 0x11) validmovemask[row] |= 0x04;
//如果王与右边的车之间的2个棋子不存在(F0->11110,90->10010)
//则设置王可移到"右边马"的位置(0x40)
if ((tmp & 0xF0)==0x90) validmovemask[row] |= 0x40;
}
//-----------------------------------------------------------------
// 从from位置开始向“北(即向上)”搜索当前棋子所有可能的合法移动
//-----------------------------------------------------------------
void val_north(BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0],c = from[1];
BOOL piecefound = FALSE;
//行未向上递增到最大行,目前未遇到棋子(包括本方和对方),且未完成最大深度搜索
while ((r++ < MAX_ROW) && (!piecefound) && (depth--))
{
//每遇到空格,则将该行移动掩码validmovemask[r]中的第c位设为1
if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
//如果遇到的是对方棋子
else if (is_opp_piece(r,c,piececolour))
{
//则将该行移动掩码validmovemask[r]和捕获掩码中capturemask[r]的第c位设为1
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
//在可捕获对方王时设置kingcapture = TRUE
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
//由于遇到对方棋子,故设piecefound为真(while搜索将因此而退出)
piecefound = TRUE;
}
//否则遇到了本方棋子(while搜索将因此而退出)
else piecefound = TRUE;
}
}
//-----------------------------------------------------------------
// 以下各方向的搜索函数与上面的val_north算法类似,故略去所有注释
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// 从from位置开始向“南(即向下)”搜索当前棋子所有可能的合法移动
//-----------------------------------------------------------------
void val_south (BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0], c = from[1];
BOOL piecefound = FALSE;
while ((r-- > MIN_ROW) && (!piecefound) && (depth--))
{
if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
else if (is_opp_piece(r,c,piececolour))
{
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
piecefound = TRUE;
}
else piecefound = TRUE;
}
}
//-----------------------------------------------------------------
// 从from位置开始向“向东(即右)”搜索当前棋子的所有可能合法移动
//-----------------------------------------------------------------
void val_east(BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0],c = from[1];
BOOL piecefound = FALSE;
while ((c++ < MAX_COL) && (!piecefound) && (depth--))
{ if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
else if (is_opp_piece(r,c,piececolour))
{
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
piecefound = TRUE;
}
else piecefound = TRUE;
}
}
//-----------------------------------------------------------------
// 从from位置开始向“西(即向左)”搜索当前棋子的所有可能合法移动
//-----------------------------------------------------------------
void val_west(BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0],c = from[1];
BOOL piecefound = FALSE;
while ((c-- > MIN_COL) && (!piecefound) && (depth--))
{ if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
else if (is_opp_piece(r,c,piececolour))
{
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
piecefound = TRUE;
}
else piecefound = TRUE;
}
}
//-----------------------------------------------------------------
// 从from位置开始向“西北(即向左上)”搜索当前棋子的所有可能合法移动
//-----------------------------------------------------------------
void val_northwest (BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0], c = from[1];
BOOL piecefound = FALSE;
while ((c-- > MIN_COL) && (r++ < MAX_ROW) && (!piecefound) && (depth--))
{
if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
else if ((board[r][c] & 0x08) ^ piececolour)
{
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
piecefound = TRUE;
}
else piecefound = TRUE;
}
}
//-----------------------------------------------------------------
// 从from位置开始向“东北(即向右上)”搜索当前棋子的所有可能合法移动
//-----------------------------------------------------------------
void val_northeast(BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0], c = from[1];
BOOL piecefound = FALSE;
while ((c++ < MAX_COL) && (r++ < MAX_ROW) && (!piecefound) && (depth--))
{
if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
else if ((board[r][c] & 0x08) ^ piececolour)
{
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
piecefound = TRUE;
}
else piecefound = TRUE;
}
}
//-----------------------------------------------------------------
// 从from位置开始向“东南(即向右下)”搜索当前棋子的所有可能合法移动
//-----------------------------------------------------------------
void val_southeast (BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0], c = from[1];
BOOL piecefound = FALSE;
while ((c++ < MAX_COL) && (r-- > MIN_ROW) && (!piecefound) && (depth--))
{
if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
else if ((board[r][c] & 0x08) ^ piececolour)
{
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
piecefound = TRUE;
}
else piecefound = TRUE;
}
}
//-----------------------------------------------------------------
// “从from位置开始向西南(即向左下)”搜索当前棋子的所有可能合法移动
//-----------------------------------------------------------------
void val_southwest(BYTE from[],BOOL piececolour,BOOL depth)
{
BYTE r = from[0], c = from[1];
BOOL piecefound = FALSE;
while ((c-- > MIN_COL) && (r-- > MIN_ROW) && (!piecefound) && (depth--))
{
if (board[r][c] == EMPTY) validmovemask[r] |= (1<<c);
else if ((board[r][c] & 0x08) ^ piececolour)
{
validmovemask[r] |= (1<<c);
capturemask[r] |= (1<<c);
if (capturemask[opp_king_pos[0]] & (1 << opp_king_pos[1]))
kingcapture = TRUE;
piecefound = TRUE;
}
else piecefound = TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -