Skip to main content

Getting Started

Jump straight into the engine with per-surface quick starts. Each tab installs the binding, spins up a "hello board" example, and links to the deeper docs when you are ready to explore advanced knobs.

  1. Install.
  2. Bootstrap a game.
    src/main.rs
    use tiletangle_engine::{GameConfig, GameState};

    fn main() -> anyhow::Result<()> {
    let cfg: GameConfig = serde_json::from_str(include_str!("../test_data/configs/classic.json"))?;
    let mut state = GameState::new(&cfg, 2)?;
    for (idx, player) in state.players.iter().enumerate() {
    println!("Player {idx} rack: {:?}", player.rack.tiles);
    }
    println!("Board is {}×{}", state.board.geom.width, state.board.geom.height);
    Ok(())
    }
  3. Run it.
    cargo run
  4. Next steps. Read through the architecture overview and the move generation deep dive for production builds.

Need a hosted sandbox?

The Playground runs entirely in-browser, exposing live move generation, adjacency switches, and CPU hints. Use it to validate dictionary builds before embedding them into any of the bindings above.

For packaging automation across all surfaces, run ./tools/package_release.py to reproduce the release-ready artifacts under dist/.