I started out with a few different programming languages. As you go through the commit history you'll see different top level directories for different languages.
Notably:
javascript
contains many of the bots in my tutorialpython
early attempts at bots, eventually used as a way to bootstrap other languagesjava
basically just a simple bot before I switched to Kotlinkotlin
the majority of my bots
There are also some other projects that started as subdirectories. Some were eventually split into their own standalone community tools.
Notably:
halite-lite
became mini-haliteaws
was the source for CloudBotstournament
was a script I wrote to run local tournaments between my bots. I eventually wrote mini-halite as an alternative. It also contains some python code for quick iteration on ideas and a script to upload bots to a server of mine that was always running matches.
You'll need a Java 8+ JDK installed. I use Gradle to compile and package my bot.
To build a zip
for upload:
$ cd kotlin
$ ./gradlew cleanDistZip distZip
This will make a MyBot.zip
file in kotlin/build/distributions/
.
To build a jar
that can be used directly:
$ cd kotlin
$ ./gradlew installDist
This will make a MyBot.jar
file in kotlin/build/install/MyBot/
.
To run the jar
: java -jar MyBot.jar
These bots are my original inspiration for the "So you've Improved the Random Bot. Now what?" tutorial.
The tutorial basically chronicles my approach to building them. Notable differences were that I was using strength / (production * production)
instead of just strength / production
that I switched to later. I thought that production would be more valuable over time so it should be more heavily weighted, but it turns out that the straight ratio worked out better.
These bots had some improvements over OverkillBot:
- Joint moves so that 2 pieces next to an environment piece could capture it sooner
- Abandon moves so that a piece would move somewhere else if its objective would take too long to capture
- Assist moves so that a piece would help a neighbor capture a nearby piece
- Wastage prevention to avoid combining pieces above the 255 cap - this was super hacky and did not work great
I also played around with A* and other ways to try to get the "pathing" or "tunneling" behavior that djma has. None of them were very effective and although the code is there, it went mostly unused in my submitted bots.
Crossing the Chasm: LazyBot
I spent what felt like an eternity (but was more like 4 days) trying to move away from blob-like OverkillBot behavior and switch to something that could tunnel.
I eventually landed on building a BFS grid where I assigned a value to every border cell and then walked the BFS grid inward increasing each cells value by 1 each time. This worked much better than FrugalBot and was the starting point for the rest of my bots.
Bot | Mu | Sigma | Score | Games |
---|---|---|---|---|
disallowedshovebot | 31.848 | 0.704 | 29.735 | 643 |
disallowedshoveprodbot | 30.833 | 0.703 | 28.724 | 622 |
parametermixbot | 30.815 | 0.701 | 28.713 | 2008 |
claimcombatbot | 30.738 | 0.683 | 28.689 | 1746 |
waittoattackbot | 30.480 | 0.684 | 28.428 | 2086 |
sharpfocusbot | 30.451 | 0.687 | 28.389 | 4598 |
sharpparametermixbot | 30.218 | 0.680 | 28.178 | 1666 |
variabledirwalkbot | 30.209 | 0.683 | 28.161 | 2079 |
shovecrossnotclaimbot | 30.205 | 0.692 | 28.130 | 996 |
parametermixwaitmorebot | 29.844 | 0.732 | 27.650 | 119 |
shoveblackoutbot | 29.672 | 0.691 | 27.599 | 1148 |
punchthroughbot | 29.404 | 0.675 | 27.380 | 1547 |
sharpparametermix2bot | 29.398 | 0.683 | 27.350 | 1632 |
minvariabledirwalkbot | 29.183 | 0.672 | 27.167 | 2116 |
focusbot | 29.068 | 0.682 | 27.023 | 4901 |
purenapbot | 28.926 | 0.677 | 26.893 | 5248 |
contactsquaredbot | 28.871 | 0.672 | 26.856 | 3707 |
inbetweensquaredbot | 28.841 | 0.683 | 26.792 | 2084 |
boxofrocksblackoutbot | 28.732 | 0.683 | 26.682 | 462 |
shovestrict64mixbot | 28.775 | 0.703 | 26.667 | 207 |
shovestrict64bot | 28.794 | 0.711 | 26.661 | 192 |
finebattlebotv2-nobruise | 28.501 | 0.684 | 26.450 | 6702 |
napbot | 28.395 | 0.680 | 26.354 | 5076 |
shovecrossbot | 28.281 | 0.687 | 26.220 | 1000 |
shovebetterbattlebot | 28.220 | 0.684 | 26.169 | 1098 |
krakenbot | 28.212 | 0.682 | 26.167 | 4632 |
justsquaredbot | 28.178 | 0.684 | 26.126 | 3470 |
boxofrocksequalbot | 28.246 | 0.710 | 26.116 | 158 |
thugclassicduobot | 28.137 | 0.682 | 26.090 | 1234 |
thugclassicpunchbot | 27.943 | 0.687 | 25.882 | 1092 |
finebattlebotv2 | 27.910 | 0.688 | 25.846 | 6653 |
shoveoldstylebot | 27.944 | 0.713 | 25.805 | 146 |
thugclassicbot | 27.803 | 0.682 | 25.757 | 1188 |
spaghettistillbot | 27.785 | 0.703 | 25.675 | 594 |
shovebot | 27.675 | 0.692 | 25.600 | 161 |
spaghettibot | 27.478 | 0.727 | 25.298 | 114 |
superhungrybot | 27.313 | 0.689 | 25.244 | 5816 |
idlestrengthbotv8 | 27.261 | 0.695 | 25.175 | 6704 |
canidobetterbotv19 | 27.173 | 0.683 | 25.123 | 6952 |
purestrengthbot | 27.124 | 0.682 | 25.079 | 5158 |
thugclassicanyduobot | 26.883 | 0.690 | 24.813 | 1196 |
compressbugfixbot | 26.808 | 0.685 | 24.754 | 5229 |
lastgaspbot | 27.174 | 0.833 | 24.677 | 66 |
spartanbot | 26.639 | 0.682 | 24.594 | 5287 |
shovefinerbattlebot | 26.675 | 0.734 | 24.474 | 118 |
lastgasptoobot | 27.123 | 0.887 | 24.463 | 59 |
compressbot | 26.484 | 0.686 | 24.425 | 5411 |
hungrybot | 26.456 | 0.679 | 24.420 | 4920 |
orientationbot | 25.625 | 0.678 | 23.590 | 4732 |
fighterbot | 25.011 | 0.691 | 22.938 | 4000 |
shoveblackborderbot | 25.596 | 0.906 | 22.879 | 52 |
boxofrocksbot | 26.546 | 1.266 | 22.747 | 23 |
thugbot | 23.086 | 0.702 | 20.979 | 3544 |
blacklistbot | 21.453 | 0.735 | 19.249 | 3648 |
doublebot | 20.607 | 0.738 | 18.392 | 3844 |
swarmbot | 18.528 | 0.766 | 16.230 | 3327 |