public PositionLongHash CalculateHash(Position.Position position) { var result = new PositionLongHash(); result = result.CalculateXor( CalculatePiecesHash( position.Board.GetPieces(Player.Black), Player.Black)); result = result.CalculateXor( CalculatePiecesHash( position.Board.GetPieces(Player.White), Player.White)); result = result.CalculateXor(playerToMoveHashesTable[(int)position.PlayerToMove]); result = result.CalculateXor( GetEnPassantCaptureColumnHash(position.EnPassantCaptureColumn)); result = result.CalculateXor( GetCastlingAvailabilityHash( position.GetCastlingAvailability(Player.Black), Player.Black)); result = result.CalculateXor( GetCastlingAvailabilityHash( position.GetCastlingAvailability(Player.White), Player.White)); return(result); }
private void AppendCastleMoves(Position.Position position, List <Move> moves) { var availabilityFlags = position.GetCastlingAvailability(player); if (!availabilityFlags.CanCastleShort && !availabilityFlags.CanCastleLong) { return; } var board = position.Board; if (IsBoardSquareAttacked(initialKingSquare, board, otherPlayer)) { return; } if (availabilityFlags.CanCastleShort && IsLegalToCastleShort(board)) { moves.Add(shortCastleMove); } if (availabilityFlags.CanCastleLong && IsLegalToCaslteLong(board)) { moves.Add(longCastleMove); } }