public static void AddAdjacentMaps(this byte[] board, bool white, int i, ref LeafList moves, bool allowCheck)
 {
     int idx = i + UP;
     byte[] temp;
     while (idx < OUTOFBOUNDSHIGH)
     {
         if (IsValidMove(board, white, idx))
         {
             temp = board.Move(i, idx);
             if (!InCheck(temp, white))
                 moves.Add(temp,idx);
             if (TakesOpponentPiece(board, white, idx))
                 break;
         }
         else break;
         idx += UP;
     }
     idx = i + DOWN;
     while (idx > OUTOFBOUNDSLOW)
     {
         if (IsValidMove(board, white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp,idx);
             if (TakesOpponentPiece(board, white, idx))
                 break;
         }
         else break;
         idx += DOWN;
     }
     idx = i % COLUMN;
     int bse = i - idx;
     while (--idx > -1)
     {
         if (IsValidMove(board, white, bse + idx))
         {
             temp = board.Move(i, bse + idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
             if (TakesOpponentPiece(board, white, bse + idx))
                 break;
         }
         else break;
     }
     idx = i % COLUMN;
     bse = i - idx;
     while (++idx < 8)
     {
         if (IsValidMove(board, white, bse + idx))
         {
             temp = board.Move(i, bse + idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
             if (TakesOpponentPiece(board, white, bse + idx))
                 break;
         }
         else break;
     }
 }
 public static LeafList GetAvailableMoves(byte[] board, ChessColor color, bool allowCheck)
 {
     bool white = color == ChessColor.White;
     LeafList moves = new LeafList();
     //iterate thru entire board {64} including row delimiters {7}
     for (int i = 0; i < OUTOFBOUNDSHIGH; ++i)
     {
         if (!white)
         {
             switch (board[i])
             {
                 case 0x02:
                     board.AddPawnMoves(white, i, ref moves, allowCheck);
                     break;
                 case 0x04:
                     board.AddAdjacentMaps(white, i, ref moves, allowCheck);
                     break;
                 case 0x06:
                     board.AddDiagonalMaps(white, i, ref moves, allowCheck);
                     break;
                 case 0x08:
                     board.AddKnightMoves(white, i, ref moves, allowCheck);
                     break;
                 case 0x0A:
                     board.AddAdjacentMaps(white, i, ref moves, allowCheck);
                     board.AddDiagonalMaps(white, i, ref moves, allowCheck);
                     break;
                 case 0x0C:
                     board.AddKingMoves(white, i, ref moves, allowCheck);
                     break;
                 default: break;
             }
         }
         else
         {
             switch (board[i])
             {
                 case 0x01:
                     board.AddPawnMoves(white, i, ref moves, allowCheck);
                     break;
                 case 0x03:
                     board.AddAdjacentMaps(white, i, ref moves, allowCheck);
                     break;
                 case 0x05:
                     board.AddDiagonalMaps(white, i, ref moves, allowCheck);
                     break;
                 case 0x07:
                     board.AddKnightMoves(white, i, ref moves, allowCheck);
                     break;
                 case 0x09:
                     board.AddAdjacentMaps(white, i, ref moves, allowCheck);
                     board.AddDiagonalMaps(white, i, ref moves, allowCheck);
                     break;
                 case 0x0B:
                     board.AddKingMoves(white, i, ref moves, allowCheck);
                     break;
                 default: break;
             }
         }
     }
     return moves;
 }
 public static void AddPawnMoves(this byte[] board, bool white, int i, ref LeafList moves, bool allowCheck)
 {
     byte[] temp;
     if (!white)
     {
         if (i / COLUMN == 1)
         {
             if (board[i + UPUP] == _ && board[i + UP] == _)
             {
                 temp = board.MovePawn(i, i + UPUP, white);
                 if (allowCheck || allowCheck || !InCheck(temp, white))
                     moves.Add(temp, i + UPUP);
             }
         }
         if (board[i + UP] == _)
         {
             temp = board.MovePawn(i, i + UP, white);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, i + UP);
         }
         if (board[i + UPLEFT].IsUpper() && (i + UPLEFT) % COLUMN != COL8)
         {
             temp = board.MovePawn(i, i + UPLEFT, white);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, i + UPLEFT);
         }
         if (i < 54 && board[i + UPRIGHT].IsUpper() && (i + UPRIGHT) % COLUMN != COL1)
         {
             temp = board.MovePawn(i, i + UPRIGHT, white);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, i + UPRIGHT);
         }
     }
     else
     {
         if (i / COLUMN == COL7)
         {
             if (board[i + DOWNDOWN] == _ && board[i + DOWN] == _)
             {
                 temp = board.MovePawn(i, i + DOWNDOWN, white);
                 if (allowCheck || !InCheck(temp, white))
                     moves.Add(temp, i + DOWNDOWN);
             }
         }
         if (board[i + DOWN] == _)
         {
             temp = board.MovePawn(i, i + DOWN, white);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, i + DOWN);
         }
         if (board[i + DOWNRIGHT].IsLower() && (i + DOWNRIGHT) % COLUMN != COL1)
         {
             temp = board.MovePawn(i, i + DOWNRIGHT, white);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, i + DOWNRIGHT);
         }
         if (i > 8 && board[i + DOWNLEFT].IsLower() && (i + DOWNLEFT) % COLUMN != COL8)
         {
             temp = board.MovePawn(i, i + DOWNLEFT, white);
             if (!InCheck(temp, white))
                 moves.Add(temp, i + DOWNLEFT);
         }
     }
 }
 public static void AddKingMoves(this byte[] board, bool white, int i, ref LeafList moves, bool allowCheck)
 {
     byte[] temp;
     int idx = i + UPLEFT;
     if (idx < OUTOFBOUNDSHIGH)
     {
         if (idx % COLUMN != COL8 && board.IsValidMove(white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
         }
         if (board.IsValidMove(white, ++idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
         }
         if (++idx % COLUMN != COL1 && board.IsValidMove(white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
         }
     }
     idx = i + RIGHT;
     if (idx % COLUMN != COL1 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + LEFT;
     if (idx % COLUMN != COL8 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + DOWNRIGHT;
     if (idx > -1)
     {
         if (i % COLUMN != COL8 && board.IsValidMove(white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
         }
         if (board.IsValidMove(white, --idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
         }
         if (i % COLUMN != COL1 && board.IsValidMove(white, --idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
         }
     }
 }
 public static void AddKnightMoves(this byte[] board, bool white, int i, ref LeafList moves, bool allowCheck)
 {
     int originRow = i % COLUMN;
     int idx = i + UPUPRIGHT;
     byte[] temp;
     if (idx < OUTOFBOUNDSHIGH && originRow < COL8 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + UPUPLEFT;
     if (idx < OUTOFBOUNDSHIGH && originRow > COL1 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + UPRIGHTRIGHT;
     if (idx < OUTOFBOUNDSHIGH && originRow < COL7 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + UPLEFTLEFT;
     if (idx < OUTOFBOUNDSHIGH && originRow > COL2 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + DOWNDOWNLEFT;
     if (idx > OUTOFBOUNDSLOW && originRow > COL1 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + DOWNDOWNRIGHT;
     if (idx > OUTOFBOUNDSLOW && originRow < COL8 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + DOWNLEFTLEFT;
     if (idx > OUTOFBOUNDSLOW && originRow > COL2 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
     idx = i + DOWNRIGHTRIGHT;
     if (idx > OUTOFBOUNDSLOW && originRow < COL7 && board.IsValidMove(white, idx))
     {
         temp = board.Move(i, idx);
         if (allowCheck || !InCheck(temp, white))
             moves.Add(temp, idx);
     }
 }
 public static void AddDiagonalMaps(this byte[] board, bool white, int i, ref LeafList moves, bool allowCheck)
 {
     byte[] temp;
     int idx = i + UPLEFT;
     while (idx < OUTOFBOUNDSHIGH && idx % COLUMN != COL8)
     {
         if (IsValidMove(board, white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
             if (board.TakesOpponentPiece(white, idx))
                 break;
         }
         else break;
         idx += UPLEFT;
     }
     idx = i + UPRIGHT;
     while (idx < OUTOFBOUNDSHIGH && idx % COLUMN != COL1)
     {
         if (IsValidMove(board, white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
             if (board.TakesOpponentPiece(white, idx))
                 break;
         }
         else break;
         idx += UPRIGHT;
     }
     idx = i + DOWNLEFT;
     while (idx > OUTOFBOUNDSLOW && idx % COLUMN != COL8)
     {
         if (board.IsValidMove(white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
             if (board.TakesOpponentPiece(white, idx))
                 break;
         }
         else break;
         idx += DOWNLEFT;
     }
     idx = i + DOWNRIGHT;
     while (idx > OUTOFBOUNDSLOW && idx % COLUMN != 0)
     {
         if (board.IsValidMove(white, idx))
         {
             temp = board.Move(i, idx);
             if (allowCheck || !InCheck(temp, white))
                 moves.Add(temp, idx);
             if (board.TakesOpponentPiece(white, idx))
                 break;
         }
         else break;
         idx += DOWNRIGHT;
     }
 }
示例#7
0
 private void BindUI()
 {
     LeafList = LeafList.GetLeafListWithErrors();
     leafListBindingSource.DataSource = LeafList;
 }