private static Point GetClosestEnemyPosition(BattleNetClient client, List <List <Point> > checkedPoints, List <List <Movement> > movements, List <Point> currentRangePoints, out List <Movement> road) { if (client.IsAnyOfEnemyAt(currentRangePoints)) { for (int index = 0; index < currentRangePoints.Count; index++) { if (client.IsEnemyAt(currentRangePoints[index])) { road = new List <Movement>(movements[index]); return(currentRangePoints[index]); } } } var iterationMap = MapUtility.IterationMap; var nextRangePoints = new List <Point>(); var nextMovements = new List <List <Movement> >(); var nextCheckedPoints = new List <List <Point> >(); for (int index = 0; index < movements.Count; index++) { foreach (var iteration in iterationMap) { var nextPosition = iteration.Value(currentRangePoints[index]); var movement = iteration.Key.ToMovement(); if (checkedPoints[index].Exists(x => x.X == nextPosition.X && x.Y == nextPosition.Y)) { continue; } if (client.IsOutOf(nextPosition) || client.IsObstacleAt(nextPosition)) { continue; } nextRangePoints.Add(nextPosition); var move = new List <Movement>(movements[index]); move.Add(iteration.Key.ToMovement()); nextMovements.Add(move); var nextChecked = new List <Point>(checkedPoints[index]); nextChecked.Add(currentRangePoints[index]); nextCheckedPoints.Add(nextChecked); } } checkedPoints.Clear(); checkedPoints.AddRange(nextCheckedPoints); movements.Clear(); movements.AddRange(nextMovements); currentRangePoints.Clear(); currentRangePoints.AddRange(nextRangePoints); road = new List <Movement>(); return(PointUtility.CreateNegativePoint()); }
private static List <Movement> GetRoad(BattleNetClient client, Point targetPoint, List <List <Point> > checkedPoints, List <List <Movement> > movements, List <Point> currentRangePoints) { if (currentRangePoints.Exists(x => x.X == targetPoint.X && x.Y == targetPoint.Y)) { for (int index = 0; index < currentRangePoints.Count; index++) { if (currentRangePoints[index].X == targetPoint.X && currentRangePoints[index].Y == targetPoint.Y) { return(movements[index]); } } } var iterationMap = MapUtility.IterationMap; var nextRangePoints = new List <Point>(); var nextMovements = new List <List <Movement> >(); var nextCheckedPoints = new List <List <Point> >(); for (int index = 0; index < movements.Count; index++) { foreach (var iteration in iterationMap) { var nextPosition = iteration.Value(currentRangePoints[index]); var movement = iteration.Key.ToMovement(); if (checkedPoints[index].Exists(x => x.X == nextPosition.X && x.Y == nextPosition.Y)) { continue; } if (client.IsOutOf(nextPosition) || client.IsObstacleAt(nextPosition)) { continue; } nextRangePoints.Add(nextPosition); var move = new List <Movement>(movements[index]); move.Add(iteration.Key.ToMovement()); nextMovements.Add(move); var nextChecked = new List <Point>(checkedPoints[index]); nextChecked.Add(currentRangePoints[index]); nextCheckedPoints.Add(nextChecked); } } checkedPoints.Clear(); checkedPoints.AddRange(nextCheckedPoints); movements.Clear(); movements.AddRange(nextMovements); currentRangePoints.Clear(); currentRangePoints.AddRange(nextRangePoints); return(new List <Movement>()); }
public Movement GetPartialMovementToClosestEnemy(int turns) { if (_moveType == MoveType.PartialMovementToClosestEnemy && _movementRoad?.Count > 0 && _movementTarget != null) { var movement = _movementRoad.First(); _movementRoad.RemoveAt(0); return(movement); } var player = _client.GetPlayerTank(); var enemies = new List <Point>(); enemies.AddRange(_client.GetBotsTanks()); enemies.AddRange(_client.GetOtherPlayersTanks()); var closestEnemy = enemies.OrderBy(x => x.GetDistance(player)).First(); var deltaX = player.X - closestEnemy.X; var deltaY = player.Y - closestEnemy.Y; var turnsToEnemy = deltaX + deltaY; var speedX = (float)deltaX / turnsToEnemy; var speedY = (float)deltaY / turnsToEnemy; var targetX = (int)(speedX * turns); var targetY = (int)(speedY * turns); var target = new Point(targetX, targetY); var horisontalCorrectionIteration = MapUtility.IterationMap[target.GetHorisontalDirectionTo(player).ToDirection(_client)]; var verticalCorrectionIteration = MapUtility.IterationMap[target.GetVerticalDirectionTo(player).ToDirection(_client)]; var horisontalCorrectedPoint = target; var verticalCorrectedPoint = target; while (_client.IsObstacleAt(horisontalCorrectedPoint) && _client.IsObstacleAt(verticalCorrectedPoint)) { horisontalCorrectedPoint = horisontalCorrectionIteration(horisontalCorrectedPoint); verticalCorrectedPoint = verticalCorrectionIteration(verticalCorrectedPoint); } target = _client.IsObstacleAt(horisontalCorrectedPoint) ? verticalCorrectedPoint : horisontalCorrectedPoint; var road = PlayerUtility.GetRoad(_client, target); _moveType = MoveType.PartialMovementToClosestEnemy; _movementRoad = road; _movementTarget = target; { var movement = _movementRoad.First(); _movementRoad.RemoveAt(0); return(movement); } }
private static bool IsInClosureArea(BattleNetClient client, Point position, Region area, List <Point> checkedPoints) { if (checkedPoints.Exists(x => x.X == position.X && x.Y == position.Y)) { return(true);//skip checking. As far as we checking closure area by "&&" true equivalent to skipping } if (client.IsOutOf(position)) { return(true); } var iterationMap = MapUtility.IterationMap; var topPosition = iterationMap[Direction.Up](position); var bottomPosition = iterationMap[Direction.Down](position); var leftPosition = iterationMap[Direction.Left](position); var rightPosition = iterationMap[Direction.Right](position); checkedPoints.Add(position); if (client.IsObstacleAt(position)) { return(true); } if (position.IsOutOf(area)) { return(false); } return(IsInClosureArea(client, topPosition, area, checkedPoints) && IsInClosureArea(client, bottomPosition, area, checkedPoints) && IsInClosureArea(client, leftPosition, area, checkedPoints) && IsInClosureArea(client, rightPosition, area, checkedPoints)); }
private static Point GetClosestPosition(BattleNetClient client, Point position, Func <Point, bool> successCheck, List <Point> checkedPoints, List <Movement> movements) { if (checkedPoints.Exists(x => x.X == position.X && x.Y == position.Y)) { return(PointUtility.CreateNegativePoint());//skip checking. } if (client.IsOutOf(position) || client.IsObstacleAt(position)) { return(PointUtility.CreateNegativePoint()); } var iterationMap = MapUtility.IterationMap; var topPosition = iterationMap[Direction.Up](position); var bottomPosition = iterationMap[Direction.Down](position); var leftPosition = iterationMap[Direction.Left](position); var rightPosition = iterationMap[Direction.Right](position); checkedPoints.Add(position); if (successCheck(position)) { return(position); } var topChildMovements = new List <Movement>(movements); var bottomChildMovements = new List <Movement>(movements); var rightChildMovements = new List <Movement>(movements); var leftChildMovements = new List <Movement>(movements); var topEnemyPosition = GetClosestPosition(client, topPosition, successCheck, new List <Point>(checkedPoints), topChildMovements); var bottomEnemyPosition = GetClosestPosition(client, bottomPosition, successCheck, new List <Point>(checkedPoints), bottomChildMovements); var leftEnemyPosition = GetClosestPosition(client, leftPosition, successCheck, new List <Point>(checkedPoints), leftChildMovements); var rightEnemyPosition = GetClosestPosition(client, rightPosition, successCheck, new List <Point>(checkedPoints), rightChildMovements); var topMovements = topChildMovements.Count; var bottomMovements = bottomChildMovements.Count; var leftMovements = leftChildMovements.Count; var rightMovements = rightChildMovements.Count; if (topMovements < bottomMovements && topMovements < leftMovements && topMovements < rightMovements) { movements.Add(Movement.Up); movements.AddRange(topChildMovements); return(topEnemyPosition); } if (bottomMovements < topMovements && bottomMovements < leftMovements && bottomMovements < rightMovements) { movements.Add(Movement.Down); movements.AddRange(bottomChildMovements); return(bottomEnemyPosition); } if (leftMovements < topMovements && leftMovements < bottomMovements && leftMovements < rightMovements) { movements.Add(Movement.Left); movements.AddRange(leftChildMovements); return(leftEnemyPosition); } if (rightMovements < topMovements && rightMovements < bottomMovements && rightMovements < leftMovements) { movements.Add(Movement.Right); movements.AddRange(rightChildMovements); return(rightEnemyPosition); } return(PointUtility.CreateNegativePoint()); }