public void Generate(PlayerInfo owner, GameState state, ActionCandidates candidates)
        {
            if (!owner.IsBallOwner)
            {
                return;
            }

            foreach (var pass in Velocities)
            {
                var path = BallPath.Create(owner.Position, pass, PickUpTimer, MaximumPathLength);

                // We don't want to risk passes ending up in our own goal.
                if (path.End != BallPath.Ending.GoalOwn)
                {
                    var catchUp = path.GetCatchUps(state.Current.Players).FirstOrDefault();

                    // safe to pass.
                    if (catchUp == null || catchUp.Player.IsOwn && catchUp.Player != owner)
                    {
                        var length = catchUp == null ? path.Count : catchUp.Turn;
                        var target = catchUp == null?path.Last() : catchUp.Position;

                        if (Distance.Between(target, owner) > MinimumPassDistance)
                        {
                            candidates.Add(
                                Evaluator.GetPositionImprovement(owner, target, length),
                                Actions.Shoot(owner, owner.Position + pass, PassPower));
                        }
                    }
                }
            }
        }
		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 void Generate(PlayerInfo owner, GameState state, ActionCandidates candidates)
		{
			if (!owner.IsBallOwner) { return; }

			foreach (var pass in Velocities)
			{
				var path = BallPath.Create(owner.Position, pass, PickUpTimer, MaximumPathLength);

				// We don't want to risk passes ending up in our own goal.
				if (path.End != BallPath.Ending.GoalOwn)
				{
					var catchUp = path.GetCatchUps(state.Current.Players).FirstOrDefault();

					// safe to pass.
					if (catchUp == null || catchUp.Player.IsOwn && catchUp.Player != owner)
					{
						var length = catchUp == null ? path.Count : catchUp.Turn;
						var target = catchUp == null ? path.Last() : catchUp.Position;

						if (Distance.Between(target, owner) > MinimumPassDistance)
						{
							candidates.Add(
								Evaluator.GetPositionImprovement(owner, target, length),
								Actions.Shoot(owner, owner.Position + pass, PassPower));
						}
					}
				}
			}
		}
        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);
                    }
                }
            }
        }
Exemplo n.º 5
0
		public bool Apply(GameState state, PlayerQueue queue)
		{
			var owner = queue.FirstOrDefault(player => player.IsBallOwner);

			if (owner == null) { return false; }

			var candidates = new ActionCandidates();
			// Just in case, if we don't find anything better.
			candidates.Add(-20000, Actions.ShootOnGoal(owner, Power.Maximum));
			foreach (var generator in Generators)
			{
				generator.Generate(owner, state, candidates);
			}
			return queue.Dequeue(candidates.Best.Action);
		}
Exemplo n.º 6
0
        public bool Apply(GameState state, PlayerQueue queue)
        {
            var owner = queue.FirstOrDefault(player => player.IsBallOwner);

            if (owner == null)
            {
                return(false);
            }

            var candidates = new ActionCandidates();

            // Just in case, if we don't find anything better.
            candidates.Add(-20000, Actions.ShootOnGoal(owner, Power.Maximum));
            foreach (var generator in Generators)
            {
                generator.Generate(owner, state, candidates);
            }
            return(queue.Dequeue(candidates.Best.Action));
        }
        public void Generate(PlayerInfo owner, GameState state, ActionCandidates candidates)
        {
            if (!owner.IsBallOwner || owner.DistanceToOtherGoal > MaximumShootDistance)
            {
                return;
            }

            var veloTop    = Goal.Other.Top - owner.Position;
            var veloBot    = Goal.Other.Bottom - owner.Position;
            var goalAngle  = Angle.Between(veloTop, veloBot);
            var power95Per = Power.Maximum * (0.5f * (float)goalAngle / (float)TwoStandardDeviation);

            var target = owner.Position + veloBot.Rotate((double)goalAngle * 0.5);

            var turns = (float)Distance.Between(owner, target) / (float)power95Per;

            if (turns <= PickUpTimer)
            {
                candidates.Add(float.MaxValue, Actions.Shoot(owner, target, power95Per));
                return;
            }
            else
            {
                foreach (var power in ShootPowers)
                {
                    foreach (var goal in GoalTargets)
                    {
                        var velocity = Shoot.ToTarget(owner, goal, power);
                        var path     = BallPath.Create(owner.Position, velocity, 7, 200);
                        var catchUp  = path.GetCatchUps(state.Current.OtherPlayers).FirstOrDefault();
                        if (catchUp == null)
                        {
                            candidates.Add(1000, Actions.Shoot(owner, goal, power));
                            return;
                        }
                    }
                }
            }
        }
		public void Generate(PlayerInfo owner, GameState state, ActionCandidates candidates)
		{
			if (!owner.IsBallOwner || owner.DistanceToOtherGoal > MaximumShootDistance) { return; }

			var veloTop = Goal.Other.Top - owner.Position;
			var veloBot = Goal.Other.Bottom - owner.Position;
			var goalAngle = Angle.Between(veloTop, veloBot);
			var power95Per = Power.Maximum * (0.5f * (float)goalAngle / (float)TwoStandardDeviation);

			var target = owner.Position + veloBot.Rotate((double)goalAngle * 0.5);

			var turns = (float)Distance.Between(owner, target) / (float)power95Per;

			if (turns <= PickUpTimer)
			{
				candidates.Add(float.MaxValue, Actions.Shoot(owner, target, power95Per));
				return;
			}
			else
			{
				foreach(var power in ShootPowers)
				{
					foreach (var goal in GoalTargets)
					{
						var velocity = Shoot.ToTarget(owner, goal, power);
						var path = BallPath.Create(owner.Position, velocity, 7, 200);
						var catchUp = path.GetCatchUps(state.Current.OtherPlayers).FirstOrDefault();
						if (catchUp == null)
						{
							candidates.Add(1000, Actions.Shoot(owner, goal, power));
							return;
						}
					}
				}
			}
		}