Ejemplo n.º 1
0
        public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest)
        {
            var moveList = new List <Position>();

            foreach (var delta in Constants.RookDeltas)
            {
                var position = Position.Clone(Position) + delta;
                while (position.IsValid())
                {
                    if (pieceMoveRequest.Pieces.ContainsKey(position) &&
                        pieceMoveRequest.Pieces[position].Colour == Colour)
                    {
                        break;
                    }

                    moveList.Add(position);

                    if (pieceMoveRequest.Pieces.ContainsKey(position))
                    {
                        break;
                    }
                    position += delta;
                }
            }

            return(moveList);
        }
Ejemplo n.º 2
0
        public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest)
        {
            var moveList = new List <Position>();

            foreach (var delta in Constants.KnightDeltas)
            {
                var position = Position.Clone(Position) + delta;
                if (pieceMoveRequest.Pieces.ContainsKey(position) && pieceMoveRequest.Pieces[position].Colour == Colour)
                {
                    continue;
                }
                if (position.IsValid())
                {
                    moveList.Add(position);
                }
            }

            return(moveList);
        }
Ejemplo n.º 3
0
        public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest)
        {
            if (!(pieceMoveRequest is PawnMoveRequest pawnMoveRequest))
            {
                throw new ArgumentException("Expected pawn move request.");
            }

            var moveList  = new List <Position>();
            var pawnDelta = Colour == Colour.White ? Constants.WhitePawnDelta : Constants.BlackPawnDelta;
            var position  = Position + pawnDelta;

            if (!pawnMoveRequest.Pieces.ContainsKey(position))
            {
                moveList.Add(position);
                position += pawnDelta;
                if (NumberMoves == 0 && !pawnMoveRequest.Pieces.ContainsKey(position))
                {
                    moveList.Add(position);
                }
            }

            var attackDeltaLeft  = Position + (Colour == Colour.White ? new Position(1, -1) : new Position(-1, -1));
            var attackDeltaRight = Position + (Colour == Colour.White ? new Position(1, 1) : new Position(-1, 1));
            var attackList       = new List <Position> {
                attackDeltaRight, attackDeltaLeft
            };

            foreach (var attackPosition in attackList)
            {
                var enPassantDelta = Colour == Colour.White
                    ? new Position(attackPosition.Row - 1, attackPosition.Column)
                    : new Position(attackPosition.Row + 1, attackPosition.Column);

                if (pawnMoveRequest.Pieces.ContainsKey(attackPosition) &&
                    pawnMoveRequest.Pieces[attackPosition].Colour != Colour ||
                    CanEnPassant(pawnMoveRequest, enPassantDelta))
                {
                    moveList.Add(attackPosition);
                }
            }
            return(moveList);
        }
Ejemplo n.º 4
0
        public override List <Position> GetMoves(PieceMoveRequest pieceMoveRequest)
        {
            var moveList = new List <Position>();

            foreach (var delta in Constants.KingDeltas)
            {
                var position = Position.Clone(Position) + delta;
                if (position.IsValid() &&
                    !(pieceMoveRequest.Pieces.ContainsKey(position) && pieceMoveRequest.Pieces[position].Colour == Colour))
                {
                    moveList.Add(position);
                }
            }

            if (CanCastle(pieceMoveRequest.Pieces, out var castleDirection))
            {
                switch (castleDirection)
                {
                case CastleDirection.None:
                    break;

                case CastleDirection.Left:
                    moveList.AddRange(GetLeftCastleSquares());
                    break;

                case CastleDirection.Right:
                    moveList.AddRange(GetRightCastleSquares());
                    break;

                case CastleDirection.Both:
                    moveList.AddRange(GetLeftCastleSquares());
                    moveList.AddRange(GetRightCastleSquares());
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            return(moveList);
        }
Ejemplo n.º 5
0
 public abstract List <Position> GetMoves(PieceMoveRequest pieceMoveRequest);