Créer un bot
Un bot de l’arène est un module WebAssembly (.wasm). Le plus simple : partir du bot de départ en Rust, qui est le bot du site lui-même.
Envoyer un bot
Chargement…
Démarrage rapide (Rust)
github.com/Sylv-Lej/traversal-rust-sdk
- Crée un crate qui dépend du SDK (traversal-bot). Pour aller plus loin, copie le bot de départ du dépôt (bots/starter) : c’est Mont Blanc, borné par le fuel.
[lib] crate-type = ["cdylib"] [dependencies] traversal-bot = { git = "https://github.com/Sylv-Lej/traversal-rust-sdk", tag = "v0.1.0" }use traversal_bot::core::MoveKind; use traversal_bot::{bot, Turn}; // turn.state : la position, turn.moves : les coups légaux, turn.seed : le hasard. fn choose(turn: &Turn) -> usize { // Une sortie si possible, sinon le premier coup. turn.moves.iter().position(|m| m.kind == MoveKind::Exit).unwrap_or(0) } bot!(choose); - Compile-le en WebAssembly :
cargo build --release --target wasm32-unknown-unknown # -> target/wasm32-unknown-unknown/release/mon_bot.wasm - Mesure-le contre un bot du site, avec l’outil de test du dépôt (Docker) :
git clone https://github.com/Sylv-Lej/traversal-rust-sdk && cd traversal-rust-sdk docker build -f arena/Dockerfile -t traversal-arena . docker run --rm -v "$PWD":/w traversal-arena duel /w/mon_bot.wasm sommet --games 20 - Envoie le fichier .wasm ci-dessous.
Autres langages (C, Zig, Go…)
Sans le SDK, le module doit exposer :
- memory — la mémoire du module ;
- traversal_buffer() → i32 : adresse d’un tampon de 16 Ko où l’arène écrit chaque tour ;
- traversal_move(len: i32) → i32 : lit le tour (len octets) et renvoie l’indice du coup choisi.
Imports permis (module « traversal ») : fuel_left() → i64 et log(ptr: i32, len: i32). Tout autre import est refusé.
Format du tour (petit-boutiste) :
0 u8 version (1)
1 u8 camp au trait (1 rouge, 2 bleu)
2 u16 demi-coups joués
4 u16 limite de demi-coups
6 u8 × 2 scores rouge, bleu
8 u8 pièces sorties
9 u8 nombre de pièces n
10 u64 graine de ce coup
18 u64 fuel de ce coup
26 u8 × 100 relief (case = y × 10 + x)
126 n × 3 pièces : camp, type (0 Explorateur,
1 Avant-garde, 2 Sentinelle), case
.. u16 nombre de coups m
.. m × 8 coups : pièce, type (0 déplacement,
1 attaque, 2 sortie, 3 passe), case,
spécial (0, 1 diag., 2 bond), coût,
attaque, défense, 0
(255 = aucune pièce / aucune case)