public static void GenerateCastlingMoves(Board board, MovesList movesList) { int kingSideCastle = board.side == white ? whiteKingSideCastle : blackKingSideCastle; int queenSideCastle = board.side == white ? whiteQueenSideCastle : blackQueenSideCastle; int kingSquare = board.pieces[board.side + kingBits][0]; if ((board.castlePermission & kingSideCastle) > 0) { if (board[kingSquare + 1] == empty && board[kingSquare + 2] == empty) { if (!Attack.SquareAttacked(board, kingSquare, enemy) && !Attack.SquareAttacked(board, kingSquare + 1, enemy)) { AddMove.QuietMove(board, Move.Write(kingSquare, kingSquare + 2, 0, 0, false, false, true), movesList); } } } if ((board.castlePermission & queenSideCastle) > 0) { if (board[kingSquare - 1] == empty && board[kingSquare - 2] == empty && board[kingSquare - 3] == empty) { if (!Attack.SquareAttacked(board, kingSquare, enemy) && !Attack.SquareAttacked(board, kingSquare - 1, enemy)) { AddMove.QuietMove(board, Move.Write(kingSquare, kingSquare - 2, 0, 0, false, false, true), movesList); } } } }
public static void GenerateMovesForPiece(Board board, MovesList movesList, int piece, bool slider) { for (int i = 0; i < board.pieces[piece].Count; i++) { int square = board.pieces[piece][i]; for (int j = 0; j < Directions[piece].Length; j++) { int toSquare = square + Directions[piece][j]; do { if ((board[toSquare] & border) > 0) { if ((board[toSquare] & border) == enemy) { AddMove.CaptureMove(board, Move.Write(square, toSquare, board[toSquare], 0, false, false, false), movesList); } break; } AddMove.QuietMove(board, Move.Write(square, toSquare, 0, 0, false, false, false), movesList); toSquare += Directions[piece][j]; } while (slider); } } }