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 | ||
| src/main/java/com/acb/starter | ||
| Dockerfile | ||
| pom.xml | ||
| README.md | ||
acb-starter-java
Java starter kit for AI Code Battle — a competitive bot programming platform.
Uses Javalin for the HTTP server, Jackson for JSON, and javax.crypto for HMAC authentication.
Quick Start
# Build
mvn package
# Run locally
BOT_SECRET=dev-secret java -jar target/starter-bot-1.0.0.jar
# 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-java-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
src/main/java/com/acb/starter/App.java # Server, auth, types, and strategy
src/main/java/com/acb/starter/Grid.java # Grid utilities (toroidal distance, BFS, neighbors)
pom.xml # Maven build configuration
Dockerfile # Multi-stage container build
Grid Helpers
Grid.java provides static utility methods for the toroidal grid:
Grid.toroidalManhattan(r1, c1, r2, c2, rows, cols)— Manhattan distance with wrap-aroundGrid.toroidalChebyshev(r1, c1, r2, c2, rows, cols)— Chebyshev distance with wrap-aroundGrid.neighbors(row, col, rows, cols)— 8-directional neighbors with wrapGrid.bfs(start, goal, passable, rows, cols)— BFS pathfinding, returns path ornull
Customization
Edit computeMoves() in App.java to implement your strategy. The GameState object provides:
bots— all visible bots (yours and enemies)energy— visible energy pickup locationscores— visible core positionswalls— visible wall positionsyouEnergy— your current energy countyouScore— your current scoreconfig— match parameters (grid size, etc.)
Return a List<Map<String, Object>>, each entry with position (your bot's current position) and 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