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

📄 validate.c

📁 单片机c语言程序设计100例--基于PIC+PROTEUS
💻 C
📖 第 1 页 / 共 2 页
字号:
 }

//-----------------------------------------------------------------
// 搜索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 + -