Esempio n. 1
0
        /// <summary>
        /// Get vector path points.
        /// </summary>
        /// <param name="vector">Vector value.</param>
        /// <returns>Points on the path.</returns>
        protected IEnumerable <ChessPoint> GetVectorPathPoints(ChessVector vector)
        {
            var  currentPos = Position;
            bool opponent   = false;

            while (CanMove(currentPos = ChessPoint.Add(currentPos, vector)) && !opponent)
            {
                yield return(currentPos);

                var targetPlace    = Field[currentPos.X, currentPos.Y];
                var targetSideName = targetPlace.GetPlayerColor();
                opponent = targetSideName.HasValue && SideName != targetSideName && !IsIgnoreEnemyKing(targetPlace);
            }
        }
Esempio n. 2
0
        /// <inheritdoc/>
        protected override IEnumerable <ChessPoint> GetAvailableMovements(bool onlySteps = false)
        {
            var movements = new[]
            {
                new ChessVector(-2, -1),
                new ChessVector(-1, -2),
                new ChessVector(1, -2),
                new ChessVector(2, -1),
                new ChessVector(2, 1),
                new ChessVector(1, 2),
                new ChessVector(-1, 2),
                new ChessVector(-2, 1),
            };

            return(movements.Select(vector => ChessPoint.Add(Position, vector)).Where(CanMove));
        }
Esempio n. 3
0
        /// <inheritdoc/>
        protected override IEnumerable <ChessPoint> GetAvailableMovements(bool onlySteps = false)
        {
            /*******************
            * (-1,-1)(0,-1)(1,-1)
            * (-1,0) (King) (1,0)
            * (-1,1) (0,1) (1,1)
            *******************/

            // АЛГОРИТМ
            // Выясняем куда ВСЕ фигуры могу ходить, затем создаём поле где проставляем все движения всех фигур и выясняем куда можно куда нельзя ходить. НЕ ЗАБЫВАЕМ что
            // Стоит не забывать что фигура достающая до союзной - защищает НО НАМ ЭТО НЕ НАДО
            // Check cells around
            var movements = new[]
            {
                new ChessVector(-1, -1),
                new ChessVector(0, -1),
                new ChessVector(1, -1),
                new ChessVector(-1, 0),
                new ChessVector(1, 0),
                new ChessVector(-1, 1),
                new ChessVector(0, 1),
                new ChessVector(1, 1),
            };

            var avaliableMovements =
                movements.Select(vector => ChessPoint.Add(Position, vector))
                .Where(CanMove);

            if (onlySteps)
            {
                return(avaliableMovements);
            }

            var piecePlayerColor       = Field[Position].GetPlayerColor().Value;
            var opponentColorInitiator = piecePlayerColor.Invert();
            var underAttackPoints      = CheckMateLogic.UnderAttackPoints(opponentColorInitiator, Field, new PieceMasterFactory());
            var r = avaliableMovements.Where(point => !underAttackPoints.Contains(point));

            var d = r.ToArray();

            return(d);
        }
Esempio n. 4
0
        /// <inheritdoc/>
        protected override IEnumerable <ChessPoint> GetAvailableMovements(bool onlySteps = false)
        {
            // Black (top)

            /*******************
            *       (Pawn)
            * (-1,1) (0,1)(1,1)
            *******************/

            // White (bottom)

            /*******************
            * (-1,-1)(0,-1) (1,-1)
            *       (Pawn)
            *******************/

            IEnumerable <ChessVector> movementsVectors;
            IEnumerable <ChessVector> attackMovementsVectors;
            PlayerColor opponent;

            // 1. Ходит тока в перёд
            // 2. В бок может тока есть
            // 3. Если на исходной позиции тогда может прыгнуть на 2
            if (SideName == PlayerColor.White)
            {
                opponent = PlayerColor.Black;
                attackMovementsVectors = new[]
                {
                    new ChessVector(-1, -1),
                    new ChessVector(1, -1)
                };

                movementsVectors = new[]
                {
                    new ChessVector(0, -1)
                };

                // If we do first one move as white
                if (Position.Y == 6)
                {
                    movementsVectors = movementsVectors.Union(
                        new[]
                    {
                        new ChessVector(0, -2)
                    });
                }
            }
            else
            {
                opponent = PlayerColor.White;
                attackMovementsVectors = new[]
                {
                    new ChessVector(-1, 1),
                    new ChessVector(1, 1)
                };

                movementsVectors = new[]
                {
                    new ChessVector(0, 1),
                };

                // If we do first one move as black
                if (Position.Y == 1)
                {
                    movementsVectors = movementsVectors.Union(
                        new[]
                    {
                        new ChessVector(0, 2)
                    });
                }
            }

            return
                (movementsVectors.Select(vector => ChessPoint.Add(Position, vector)).TakeWhile(point => CanMove(point) && Field[point] == ChessPiece.Empty)
                 .Union(
                     attackMovementsVectors.Select(vector => ChessPoint.Add(Position, vector))
                     .Where(CanMove)
                     .Where(point => CheckPrefix(Field[point], opponent))));
        }