Files
SirRoboGarage/SNNBot_garage/tests/test_bullet_economy.nim
T
SirStone 26438395a8 diag(SNNBot): revert to baseline, add bias diagnostics
Reverted fire gate from 1° back to 2°, removed gridHasData cold-start
guard so bot fires on straight aim during cold-start. Added
/tmp/snnbot_bias_debug.log BIAS entries in EVALUATE phase logging
gridOffset, correctOffset, bias, vPerp, dist per cycle.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-17 08:34:04 +02:00

67 lines
2.7 KiB
Nim

## Bullet economy test: SNNBot vs WallsBot.
## Prints per-round and summary stats for tuning. No hard pass/fail.
## Requires TR server JARs (set TR_SERVER_JAR / TR_BATTLE_RUNNER env vars).
## Set TR_SAMPLE_BOTS to point to sample-bots directory (e.g. sample-bots-nim-linux-1.0.7).
import std/[os, strformat]
import test_framework/battle_result
const
DefaultServerJar = "/home/davide/Projects/tank-royale/server/build/libs/robocode-tankroyale-server-0.35.5-all.jar"
DefaultRunnerJar = "/home/davide/Projects/tank-royale/runner/examples/lib/robocode-tankroyale-runner.jar"
DefaultSampleBots = "/home/davide/Downloads/robocode-tankroyale/sample-bots-nim-linux-1.0.7"
let serverJar = getEnv("TR_SERVER_JAR", DefaultServerJar)
let runnerJar = getEnv("TR_BATTLE_RUNNER", DefaultRunnerJar)
let sampleBotsDir = getEnv("TR_SAMPLE_BOTS", DefaultSampleBots)
if not fileExists(serverJar) or not fileExists(runnerJar):
echo "Skipping: JAR files not found (set TR_SERVER_JAR / TR_BATTLE_RUNNER to override)"
quit(0)
if not dirExists(sampleBotsDir):
echo "Skipping: sample bots directory not found at ", sampleBotsDir
echo "Set TR_SAMPLE_BOTS to override"
quit(0)
import test_framework/test_framework
const
snnbotDir = currentSourcePath().parentDir.parentDir
let wallsbotDir = sampleBotsDir / "Walls"
const ROUNDS = 50
let r = runBattle(@[snnbotDir, wallsbotDir], rounds = ROUNDS)
# Per-round stats
echo "=== Per-round results ==="
var snnWins, wallsWins: int
var prevSnn, prevWalls: int
for rnd in r.rounds:
var snn, walls: BotRoundResult
for br in rnd.results:
if br.name == "SNNBot": snn = br
if br.name == "Walls (Nim)": walls = br
let snnDelta = snn.score - prevSnn
let wallsDelta = walls.score - prevWalls
prevSnn = snn.score
prevWalls = walls.score
# Use per-round score delta to determine round winner (rank field is cumulative battle rank)
let winner = if snnDelta > wallsDelta: "SNNBot" else: "Walls"
if winner == "SNNBot": inc snnWins else: inc wallsWins
echo fmt"Round {rnd.round:2}: {winner} wins | SNNBot +{snnDelta}(={snn.score}) rank={snn.rank} survived={snn.survived} | Walls +{wallsDelta}(={walls.score}) rank={walls.rank} survived={walls.survived}"
# Summary
echo ""
echo fmt"=== Summary ({ROUNDS} rounds) ==="
var snnFinal, wallsFinal: BotResult
for b in r.results:
if b.name == "SNNBot": snnFinal = b
if b.name == "Walls (Nim)": wallsFinal = b
echo fmt"SNNBot : wins={snnWins}/{ROUNDS} totalScore={snnFinal.totalScore} survivalRounds={snnFinal.survivalCount} firstPlaces={snnFinal.firstPlaces}"
echo fmt"Walls : wins={wallsWins}/{ROUNDS} totalScore={wallsFinal.totalScore} survivalRounds={wallsFinal.survivalCount} firstPlaces={wallsFinal.firstPlaces}"
echo fmt"Win rate : {snnWins * 100 div ROUNDS}%"