public void Generate(PlayerInfo owner, GameState state, ActionCandidates candidates) { if (!owner.IsBallOwner || owner.CanBeTackled.Any()) { return; } foreach (var direction in WalkingDirections) { var target = owner.Position + direction; // Don't try to leave the field. if (Game.Field.IsOnField(target)) { var dribble = PlayerPath.Create(owner, target, MaximumDribbleLength, Distance.Tackle); var catchUp = dribble.GetCatchUps(state.Current.OtherPlayers).FirstOrDefault(); // don't start (too) short walks. if (catchUp == null || catchUp.Turn >= MinimumDribbleLength) { if (catchUp != null) { target = dribble[catchUp.Turn - 2]; } var action = Actions.Move(owner, target); var length = catchUp == null ? dribble.Count : catchUp.Turn - 1; candidates.Add(Evaluator.GetPositionImprovement(owner, target, length), action); } } } }
public bool Apply(GameState state, PlayerQueue queue) { if (state.Current.Ball.IsOther) { var path = PlayerPath.Create(state.Current.Ball.Owner, Goal.Own.Center, 400, 40f); var sweeper = path.GetCatchUps(queue).FirstOrDefault(); if (sweeper != null) { return(queue.Dequeue(Actions.Move(sweeper.Player, sweeper.Position))); } } return(false); }
public void Create_Player_ReachesTheTargetIn44Turns() { var player = new PlayerInfo() { Position = new Position(200, 200), Velocity = new Velocity(-2, 0), }; var target = new Position(300, 200); var act = PlayerPath.Create(player, target, 100, Distance.Pickup); var exp = 44; Assert.AreEqual(exp, act.Count); }
public bool Apply(GameState state, PlayerQueue queue) { if (state.Current.Ball.IsOther) { var freeMan = state.Current.Ball.Owner.GetOther(state.Current.OtherPlayers) .OrderBy(player => player.DistanceToOwnGoal) .Skip(Rank).FirstOrDefault(); var path = PlayerPath.Create(freeMan, Goal.Own.Center, 400, 40f); var manMarker = path.GetCatchUps(queue).FirstOrDefault(); if (manMarker != null) { return(queue.Dequeue(Actions.Move(manMarker.Player, manMarker.Position))); } } return(false); }