示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }