Exemplo n.º 1
0
        private void AppendRayMoves(
            BoardSquare originSquare,
            Position.Position position,
            MoveDelta rayDelta,
            List <Move> moves)
        {
            var board       = position.Board;
            var moveBuilder = new MoveBuilder(piece, originSquare);

            var currentSquare = originSquare;

            while (rayDelta.IsCanApplyTo(currentSquare))
            {
                currentSquare = rayDelta.GetDestSquare(currentSquare);
                if (board.IsEmpty(currentSquare))
                {
                    moves.Add(moveBuilder.SetDestSquare(currentSquare).Build());
                }
                else
                {
                    var obstacle = board.GetPieceAt(currentSquare);
                    if (obstacle.player != position.PlayerToMove)
                    {
                        moves.Add(moveBuilder
                                  .SetDestSquare(currentSquare)
                                  .SetCapture(obstacle.piece)
                                  .Build());
                    }
                    break;
                }
            }
        }
Exemplo n.º 2
0
        public void AppendMoves(BoardSquare originSquare, Position.Position position, List <Move> moves)
        {
            var board        = position.Board;
            var playerToMove = position.PlayerToMove;
            var moveDeltas   = GetMoveDeltas();
            var moveBuilder  = new MoveBuilder(GetPiece(), originSquare);

            for (int i = 0; i < moveDeltas.Length; ++i)
            {
                if (!moveDeltas[i].IsCanApplyTo(originSquare))
                {
                    continue;
                }
                var destSquare = moveDeltas[i].GetDestSquare(originSquare);
                if (board.IsEmpty(destSquare))
                {
                    moves.Add(moveBuilder.SetDestSquare(destSquare).Build());
                }
                else
                {
                    var pieceAtDestSquare = board.GetPieceAt(destSquare);
                    if (pieceAtDestSquare.player != playerToMove)
                    {
                        moves.Add(moveBuilder
                                  .SetDestSquare(destSquare)
                                  .SetCapture(pieceAtDestSquare.piece)
                                  .Build());
                    }
                }
            }
        }
Exemplo n.º 3
0
        public void AppendMoves(BoardSquare originSquare, Position.Position position, List <Move> moves)
        {
            var board        = position.Board;
            var moveBuilder  = new MoveBuilder(Piece.Pawn, originSquare);
            var moveAppender = GetMoveAppender(originSquare);

            var moveForwardSquare = new BoardSquare(originSquare.Row + deltaRow, originSquare.Column);

            if (board.IsEmpty(moveForwardSquare))
            {
                moveAppender(moveBuilder.SetDestSquare(moveForwardSquare), moves);
                if (originSquare.Row == initialRow)
                {
                    var moveDoubleForwardSquare = GetDoubleForwardMoveSquare(originSquare);
                    if (board.IsEmpty(moveDoubleForwardSquare))
                    {
                        moves.Add(moveBuilder
                                  .SetDestSquare(moveDoubleForwardSquare)
                                  .SetPawnDoubleMove()
                                  .Build());
                    }
                }
            }

            if (originSquare.Column > 0)
            {
                AppendIfCanCapture(
                    new BoardSquare(originSquare.Row + deltaRow, originSquare.Column - 1),
                    moveBuilder,
                    board,
                    moves,
                    moveAppender);
            }
            if (originSquare.Column + 1 < Board.Board.ColumnCount)
            {
                AppendIfCanCapture(
                    new BoardSquare(originSquare.Row + deltaRow, originSquare.Column + 1),
                    moveBuilder,
                    board,
                    moves,
                    moveAppender);
            }

            if (originSquare.Row == enPassantCaptureRow &&
                position.EnPassantCaptureColumn.Exists(x => Abs(originSquare.Column - x) == 1))
            {
                var enPassantDstSquare = new BoardSquare(
                    originSquare.Row + deltaRow,
                    position.EnPassantCaptureColumn.ValueOr(0));
                moves.Add(moveBuilder
                          .SetDestSquare(enPassantDstSquare)
                          .SetEnPassantCapture()
                          .Build());
            }
        }
Exemplo n.º 4
0
        private void AppendIfCanCapture(
            BoardSquare destSquare,
            MoveBuilder moveBuilder,
            Board.Board board,
            List <Move> moves,
            Action <MoveBuilder, List <Move> > moveAppender)
        {
            if (board.IsEmpty(destSquare))
            {
                return;
            }

            var pieceAtDestSquare = board.GetPieceAt(destSquare);

            if (pieceAtDestSquare.player != player)
            {
                moveAppender(
                    moveBuilder.SetDestSquare(destSquare).SetCapture(pieceAtDestSquare.piece),
                    moves);
            }
        }