Directed Kicker Bots
Agent Algorithm
A directed kicker agent chooses a visible ball at random and tries to "kick" it so that the ball will move in the the agent's goal direction. The agent calculates the spot on the ball it needs to hit to knock the ball in the right direction. If it senses that moving directly towards the target spot will result in kicking the ball in another direction, the agent accelerates around the agent (orthagonal to the vector towards the target spot) until it can hit the target spot.
Pseudocode
visibleBalls = {} for all visibleObjects if visibleObject is ball visibleBalls <-- visibleObject if visibleBalls is not empty ball = selectRandom(visibleBalls) targetVector = vectorToBallCenter - (ball.radius + agent.radius) * goalDirection if dotProduct(targetVector, vectorToBallCenter) > 0 acceleration = targetVector else orthagonalToTarget = rotate(targetVector, 90°) if dotProduct(orthagonalToTarget, goalDirection) > 0 orthagonalToTarget = -1 * orthagonalToTarget acceleration = orthagonalToTarget else set acceleration to zero
Observed Behavior
The agents definitely do organize themselves on the correct sides of the ball, and depending on how many agents of which color are concentrating on a ball, the ball is moved in the goal direction of the team with the majority focused on that ball.
It seems, however, that the agents do a lot more "positioning to kick" than actual kicking. They all line up on their side of the ball and follow the ball around. This could be good for defense in a soccer-style game, but not aggressive enough for offense.