/// <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); } }
/// <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)); }
/// <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); }
/// <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)))); }