This is a splatoon-style game agent written in Rust, which was ranked as the second seed and achieved 3rd place in the 2026 ByteFight tournament. Because of game rules, the Rust code is called by a thin Python wrapper, with interoperability handled by the maturin and pyo3 crates. The agent is based on a heavily modified version of the UBMFs algorithm, with additional heuristic and monte-carlo-based search techniques applied for certain aspects of the game.
Check out our team profile and matches here!
Our algorithm is loosely inspired by Learning to Play Two-Player Perfect-Information Games without Knowledge. However, we employed a custom evaluation function tuned via genetic evolution using the CMAES black-box optimizer. The base search algorithm uses an unbounded minimax search tree and greedily explores the highest-value subtree within the allotted time limit. To deal with specialized win conditions, a second specialized search is used at leaf nodes to quickly identify terminal state lines. This approach was originally based on a monte-carlo tree search, but has since evolved into a more specialized and deterministic algorithm.
We think our algorithm is one of the best in the competition at long term planning and decision making due to the unbounded nature of base search. Based on the competition results, we also believe that our specialized winning-line search is the best at detecting and avoiding one-shots out of all teams. However, our heuristic is fairly underdeveloped and could have greatly benefited from additional training time and more sophisticated techniques.
Our game environment was also fully re-implemented in Rust and designed to be zero-copy and zero-allocation wherever possible. This allows us to reach a perf benchmark of around 130 million states per second, making it the fastest game engine implementation that we are aware of.
Here are some improvements we ran out of time for:
- replacing the hard-coded board encoding fed into the optimizer with the full board state
- more sophisticated bootstrap evaluation training
- various simd and cache line locality optimizations in our board representation and heuristic function.
clean out the old engines and games just clean
build the engines to compare against from a git branch or commit hash
just build main
just build 4a2d023f
you can run a tournament between the engines with:
cargo run -p tooling -- run --games-per-matchup 1 --cpus 8
and then open the gui to look at the games with just log-viewer