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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }