← Arène des bots

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

  1. 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);
  2. Compile-le en WebAssembly :
    cargo build --release --target wasm32-unknown-unknown
    # -> target/wasm32-unknown-unknown/release/mon_bot.wasm
  3. 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
  4. 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)