No troubles with Strategy on my end:
I assigned every tile with a score and then simulated all moves ahead for 20 rounds,
I will go a bit deeper into how I approach the actual game state data beforE the next event.
The quick version is:
I store all information in a 2 Dimentional array,
Say m[y][x ]and this contains map state,
And I can go example:
m[y+1][x ] to look below.
Use for loops to scout ranges.
Then for actual strategy for 2025.
Zookeepers:
This was my highest priority, Avoiding getting caught,
I had a score offset based on my moves to a tile vs the zookeeper move to a tile if it was closer than 5,
And I also offset all tiles based on if they were closer to the zookeeper than another animal,
Seemingly staying in the zookeeper blindspot,
Which allowed me to move towards powerups without needing to navigate Zookeepers as badly.
I also adjusted points slightly based on distance from the zookeepers, So I tended to draw away from them completely.
Scavenger:
Min Maxed, If it existed I chased it down with my everything,
When i had it I looked at every possible position in the next 10 moves and calculated the best tile to set off the scavenger and moved towards it.
If I was on the best (or the best - 3 threshold) accounting for moves made (as you move you eat pellets)
Id set it off, and then while its active, set my moves according to the pellets I could eat.
Sometimes hitting 70+ pellets for the first round,
Typically getting between 70000 and 80000 points per scavenge fired.
Also only used it with momentum, That was a pretty hard rule on my end, dont ever stop to use powerups.
Power Pellet,
Treated as a normal pellet x 10,
Boostjuice
Min Maxed
Treated as pellet x 15, if i could use it, had max point gain, momentum and next tile was a pellet id use it,
Cloak,
I had a somewhat accurite function that tracked what zookeepers was chasing based on their moves,
So when i though I was being chased by a zookeeper id use the cloak to divert them,
Id use a powerup if Id run into another powerup,
Though id only use a scavenger this way if I could pick another one up,
For the best part I recycled powerups as soon as I got them, Powerups repeled powerup spawns so it was best to try and take them if they were in your territory,
I tried to not miss smaller pellets either,
The Psychology was pretty minor,
I did assume that players will not get caught too much,
After T2 I thought about the powerup aggression and scavenger availability,
But concluded that everyone was in the same environment and I got most scavengers so I should have a placement and aggression advantage going into the finals.
I also ask what will perfect bots do.
But for the best part perfect bots will avoid zookeepers, pick up scavengers, Use them well, and try and keep their score streaks going.
So I did look at minmax,
In 2019 I wrote a suicide function, Because I though another player would leave worms alive,
Thats more psycology, when you try and use what other players will do (or how the top 8 Bots will play) against them,
Sometimes strong bots have weaknesses because they are strong.
Last year is a good case study on this.
A very strong top 8 bot will never over extend early on,
So a safe bot would have claimed a 15 x 15 territory game start,
Cause you can almost assume that the top 8 bots will not be wreckless enough to jump into your territory,
So I did a 20x 20 claim gamestart,
I took more land round start assuming how safe other bots would play,
Thats also a aspect to consider,
If its rock paper scissors,
If you you need rock to beat scissors cause thats majority,
Then switching to paper in the finals can be an edge after rock took out all the scissors.
Theres always a degree of this in the challenge,
”Dont just play the AI, play the mind behind it”
Like with Battleship, where perfect probability becomes the weakest strategy.
Thats generally the levels to my approach,
I look at every individual aspect, try and minmax it,
Weigh them by priority,
And try and counter both Human and Machine nature.
As for method,
I use my own JS functions, Most years I just write everything from the ground up.
A single JS file, No external dependencies,
**Part of my goals are: How small can I make the file (Efficiency above all),
And then I use for loops, ifs, arrays,
I dont think i do anything strange, but I have been developing my own style over the last 10 years.