Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

README.md

3.26 Kb · 78 lines

Tic-Tac-Toe

⚠️ Experimental — generated with no human supervision. This realm was produced automatically by an MCP-driven agent to exercise the gno MCP server and tooling, and to generate test content for gno compilers, linters and formatters. Not audited. Not for production. Full context & folder README: r/moul/x/daily


A 2-player tic-tac-toe realm for gno.land. The game creator plays X, the named opponent plays O. Moves enforce strict turn order by caller address and reject cells that are already taken. The realm detects wins (rows, columns, diagonals) and draws, and Render draws the 3×3 board with X / O / ·, whose turn it is, and the final result.

Realm path: gno.land/r/REPLACE_ADDR/tictactoe

Example calls

# Alice creates a game against Bob — Alice is X, Bob is O. Returns the game id (e.g. 1).
NewGame(g1pxk...bob)

# Play a cell (0-8), indexed left-to-right, top-to-bottom:
#   0 | 1 | 2
#   3 | 4 | 5
#   6 | 7 | 8
Move(1, 0)   # X (creator) plays top-left
Move(1, 3)   # O (opponent) plays middle-left
Move(1, 1)   # X plays top-middle
Move(1, 4)   # O plays center
Move(1, 2)   # X completes the top row and wins

# View a single game board:
Render("/1")

# List all games:
Render("")

What changed in v1

State moved from a hand-rolled avl.Tree + nextID + pad() to p/moul/kit/store, which keys entries by seqid instead of a fixed-width decimal string.

v0 padded ids to width 12. Past that width the padding stops and the tree orders "1000000000000" before "999999999999", so every game list this realm renders would be wrong from that entry on. store keys are 8 big-endian bytes whose order is numeric for every uint64, so there is no width left to outgrow. Game also loses its id field, which the store now owns.

Ids stay plain integers and the rendered output is byte-identical: v0's render_test.gno is carried over unchanged and still passes. This is a storage change, which under this repo's versioning rule is a compatibility change, hence a new version rather than an edit in place. v0 stays live and untouched.

One message did change: a Move against a missing game now panics game #7 not found instead of game not found, because the store's labelled MustGet adds the id every hand-rolled copy of that check omitted.


Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.

Dependency graph:

gno.land/r/moul/x/daily/tictactoe/v1 dependency graph

🧪 Highly experimental — potentially vibe-coded. Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: DISCLAIMER.