Initially based off the reference bot. Eventually moved away from using a state machine. Main services are:
The pathfinding service, used different algorithms based on whether bot was collecting, exploring, digging, evading or approaching.
The path traversal service to return the command to the next position
The adversarial action service decide whether to activate radar, steal, evade or approach if any opponents were in close range.
In summary the strategy was:
Send commands as fast as possible. So stored my paths as dictionaries. Keys were the positions, values being the command to reach the next position. If I happen to miss a turn I would send the same command because I would be in the same position. The engine would ignore the command if it was already queued.
Explore higher platforms first to avoid falling or digging to the bottom of the map. Also to try and collect away from everyone else because I assumed most bots would try to collect the nearest collectables first, and chances of getting stuck in steal/steal back loop were higher.
Stop exploring and start digging earlier. The assumption was that other bots would try and explore the whole map before starting to dig. If the are other bots on the map, it would then take longer to get new collectables, if any, than just getting points from digging closest solid lumps.
If an opponent is in my window, check radar. If missing from radar, run! If in radar try and approach for a steal. But did not try to focus on chasing down since that meant missing many turns. You could only check radar and steal when idle.