Replace random 2-player pairing with the full §6.1 algorithm:
- Seed selection: bot with oldest last-match timestamp (tiebreak: lowest bot ID)
- Format selection: seed's least-played player count among {2, 3, 4, 6}
- Opponent selection: Pareto 80%/16-rank skill proximity + oldest last-pairing
with seed + fewest 24h games for game-count balance
- Map selection: least-recently-used active map for the chosen player count,
with map_scores.last_used_at updated after each match
- Random player slot assignment for all participant counts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| .github/workflows | ||
| Dockerfile | ||
| go.mod | ||
| grid.go | ||
| main.go | ||
| README.md | ||
acb-starter-go
Go starter kit for AI Code Battle — a competitive bot programming platform.
Quick Start
# Run locally
export BOT_SECRET=dev-secret
go run main.go
# Run with Docker
docker build -t my-bot .
docker run -e BOT_SECRET=your-secret -p 8080:8080 my-bot
Your bot listens on port 8080 and responds to POST /turn with move commands.
Register Your Bot
Once your bot is deployed and accessible via HTTPS:
curl -X POST https://api.aicodebattle.com/api/register \
-H "Content-Type: application/json" \
-d '{
"name": "my-go-bot",
"endpoint_url": "https://my-bot.example.com",
"owner": "your-name",
"description": "My awesome bot"
}'
Save the bot_id and shared_secret from the response — the secret is shown only once.
Project Structure
main.go # HTTP server, HMAC auth, game types, and strategy entry point
grid.go # Grid utilities (toroidal distance, BFS, neighbors)
go.mod # Go module definition
Dockerfile # Multi-stage container build
Grid Helpers
grid.go provides utility functions for the toroidal grid:
ToroidalManhattan(a, b, rows, cols)— Manhattan distance with wrap-aroundToroidalChebyshev(a, b, rows, cols)— Chebyshev distance with wrap-aroundNeighbors(p, rows, cols)— 8-directional neighbors with wrapBFS(start, goal, passable, rows, cols)— BFS pathfinding, returns path ornil
Customization
Edit computeMoves() in main.go to implement your strategy. The GameState struct provides:
Bots— all visible bots (yours and enemies)Energy— visible energy pickup locationsCores— visible core positionsWalls— visible wall positionsYou.Energy— your current energy countYou.Score— your current scoreConfig— match parameters (grid size, attack range, etc.)
Return a slice of Move structs, each with the bot's current Position and a Direction ("N", "E", "S", or "W"). Bots not included in the response stay in place.
Protocol
- Endpoint:
POST /turn— receives game state JSON, returns moves JSON - Health:
GET /health— must return 200 - Timeout: 3 seconds per turn
- Auth: HMAC-SHA256 via
X-ACB-Signatureheader