Add Ta Yü
Rivers laid out from the centre of an 18x18 board on 1x3 tiles, each with three mouths that must line up with whatever they touch. One side runs water north and south, the other east and west, and a side's score is one edge multiplied by the other — so reaching only one of your two edges is worth nothing, which is the whole tension of the game. Two things fell out of the geometry rather than needing to be tabulated. The tile set is generated: three mouths chosen from the eight places one can sit on a 1x3 tile gives 56 arrangements, turning a tile end for end pairs them off with none fixed, so there are exactly 28 distinct tiles and the box's 84 is three of each. And because every tile joins the network by a mouth while all three of its own mouths interconnect, the board is always one connected river system — so scoring never traces connectivity, and a mouth at the edge is an exit by construction. Both properties are asserted over whole games. The placement check is one comparison doing two jobs: where a new tile abuts an old one, both sides must agree. That refuses a river dead-ending against stone and, read the other way, refuses a blank flank that would wall off a river already down. 18x18 comes out under 20dp a cell on a phone, too fine to tap, so laying a tile is a tap to line it up and a button to commit. Tapping the same cell again cycles the other legal ways the tile could cover it, which is also how it gets turned — a rotate control would have landed on illegal positions. A tap on a cell the tile cannot cover is ignored rather than treated as a deselection, so a fingertip one cell wide of the mark does not throw away a placement. Two AI settings, not three. A blocking-heavy variant was written and dropped because it played the full setting dead even over 30 games; shipping it as a step up would have been a claim that could not be backed. What ships is held to measured numbers: full strength won 20 of 20 against random placement from either axis, gentle beats random about three games in four and loses to full strength about four in five, and random against random comes out even, which is what makes the rest of those numbers mean anything. The reconstruction's uncertainties stay called out in the rules doc rather than being smoothed over now that the code exists: the 18x18 board reading, the marked exits placed at 3, 8 and 13 by choice, and the three-player flood variant left out because nothing found says how the flood scores. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015pyhC1KyFkQk6hUnnX2Tof
This commit is contained in:
+163
-109
@@ -1,59 +1,56 @@
|
||||
# Ta Yü — the ruleset to implement
|
||||
# Ta Yü — implemented rules
|
||||
|
||||
This is the ruleset the engine enforces. Anything marked **toggle** is exposed
|
||||
in the game setup screen.
|
||||
|
||||
Ta Yü is a connection game by Niek (Nicolas) Neuwahl, published by Kosmos in
|
||||
1999 and nominated for the Spiel des Jahres that year; Goliath reissued it in
|
||||
2009. It is long out of print, which is why it is being rebuilt here.
|
||||
2009. It has been out of print for years, which is why it is rebuilt here.
|
||||
|
||||
**This game is not implemented yet.** This document is the specification the
|
||||
engine will be written against, and it is deliberately explicit about which
|
||||
parts are attested by sources and which parts are reconstructed. Read the
|
||||
[Provenance](#provenance) section before treating any number here as gospel.
|
||||
Players lay 1×3 river tiles outwards from the centre of a large board. Each tile
|
||||
carries three river mouths, and a mouth may never be walled off against the
|
||||
blank flank of another tile — that constraint is what makes every placement
|
||||
depend on everything already down. One side runs water to the north and south
|
||||
edges, the other to the east and west. Scoring multiplies your two opposite
|
||||
edges together, so a river that reaches only one of them is worth nothing at
|
||||
all.
|
||||
|
||||
Players lay 1×3 river tiles outwards from the centre of a large board. Each
|
||||
tile carries three river mouths, and a river mouth may never be walled off
|
||||
against the blank flank of another tile — so every placement is constrained by
|
||||
everything already down. One side is trying to run water out to the north and
|
||||
south edges, the other to the east and west. Scoring multiplies the two
|
||||
opposite edges together, so a river that reaches only one of your edges is
|
||||
worth nothing at all.
|
||||
**The rulebook could not be obtained, so parts of this are reconstructed.**
|
||||
Which parts, and how much to trust each, is set out under
|
||||
[Provenance](#provenance). Read that before treating a number here as gospel.
|
||||
|
||||
## Table
|
||||
|
||||
- **Players — *toggle*.** Two or four.
|
||||
- **Two.** One player takes north–south, the other east–west.
|
||||
- **Two.** Seat 0 takes north–south, seat 1 east–west.
|
||||
- **Four.** Two partnerships: seats 0 and 2 play north–south, seats 1 and 3
|
||||
play east–west, so partners are never seated next to each other.
|
||||
- The three-player "flood" variant is **not** being implemented — see
|
||||
[Known gaps](#known-gaps).
|
||||
east–west, so partners are never seated next to each other.
|
||||
- **Opponent — *toggle*.** Gentle or full strength. See
|
||||
[the computer opponent](#the-computer-opponent).
|
||||
- **Tiles — *toggle*.** Two, three or four copies of every tile — 56, 84 or 112.
|
||||
Three is the reissued game and four is the 1999 original. The publisher itself
|
||||
cut it from four to three to shorten the game, which is the same reasoning
|
||||
behind offering two.
|
||||
|
||||
The three-player "flood" variant is **not** implemented — see
|
||||
[Known gaps](#known-gaps).
|
||||
|
||||
## Board
|
||||
|
||||
An **18 × 18** grid of cells. Rows are numbered from the north edge, columns
|
||||
from the west edge.
|
||||
An **18 × 18** grid of cells. Rows count from the north edge, columns from the
|
||||
west.
|
||||
|
||||
Each of the four edges has 18 possible **exits** — one per edge cell — where a
|
||||
river can run off the board. Three exits on each edge are **marked** and count
|
||||
double.
|
||||
|
||||
```
|
||||
north edge (row 0)
|
||||
┌────────────────────┐
|
||||
west │ │ east
|
||||
edge │ 18 × 18 │ edge
|
||||
│ │
|
||||
└────────────────────┘
|
||||
south edge (row 17)
|
||||
```
|
||||
Each edge has 18 possible **exits**, one per edge cell, where a river can run
|
||||
off the board. Three exits on each edge are **marked** and count double.
|
||||
|
||||
## Tiles
|
||||
|
||||
84 tiles, drawn blind from a bag. Each tile is **1 × 3** and carries exactly
|
||||
**three river mouths** on its perimeter, all joined to one another by channels
|
||||
across the face of the tile — so water entering any mouth can leave by either
|
||||
of the other two.
|
||||
Each tile is **1 × 3** and carries exactly **three river mouths** on its
|
||||
perimeter, all joined to one another across the face of the tile — so water
|
||||
entering any mouth can leave by either of the other two.
|
||||
|
||||
A 1×3 tile has eight places a mouth can sit. Taking the tile lying east–west
|
||||
and its cells numbered 0, 1, 2 from the west:
|
||||
with its cells numbered 0, 1, 2 from the west:
|
||||
|
||||
| Slot | Where |
|
||||
| --- | --- |
|
||||
@@ -67,135 +64,192 @@ end, which pairs them off: `N0↔S2`, `N1↔S1`, `N2↔S0`, `W↔E`. No arrangem
|
||||
its own mirror under that turn, so the 56 collapse to exactly **28 distinct
|
||||
tiles**.
|
||||
|
||||
**84 = 3 × 28.** The set is three copies of every tile that can exist. (The
|
||||
1999 Kosmos edition had 112 tiles — 4 × 28 — and the reissue cut it to three
|
||||
copies each to shorten the game. Both counts landing on a whole multiple of 28
|
||||
is the main reason to trust this reconstruction of the geometry.)
|
||||
**84 = 3 × 28.** The reissued set is three copies of every tile that can exist,
|
||||
and the 1999 original's 112 is four copies. Both counts landing on a whole
|
||||
multiple of 28 is the main reason to trust this reconstruction of the geometry.
|
||||
|
||||
Of the 28, **12 have their three mouths on three different flanks** of the
|
||||
rectangle, which matches the reissued tiles being marked with a concentric ring
|
||||
on the centre stud for exactly that case.
|
||||
on the centre stud — so those tiles are drawn with a ring here too.
|
||||
|
||||
The engine generates the set rather than listing it, so the tile table cannot
|
||||
drift out of step with the count.
|
||||
The engine generates the set rather than listing it, so the tiles and the count
|
||||
cannot drift apart.
|
||||
|
||||
## Turn
|
||||
|
||||
1. **Draw** one tile from the bag, face up. There are no hands and no hidden
|
||||
tiles — everyone sees what you drew, and the only concealed information in
|
||||
the game is the order of the bag.
|
||||
2. **Place** it, in any of its four orientations (east–west or north–south,
|
||||
either way round).
|
||||
3. If the drawn tile has no legal placement anywhere, it is **set aside** and
|
||||
the turn passes. It does not come back.
|
||||
tiles: everyone sees what you drew, and the only concealed information in the
|
||||
whole game is the order of the bag.
|
||||
2. **Place** it, in any of its four orientations.
|
||||
3. If the drawn tile has no legal placement anywhere it is **set aside** and the
|
||||
turn passes. It does not come back.
|
||||
|
||||
### Placing the first tile
|
||||
Because a tile is only ever drawn for a seat that can play it, the player on the
|
||||
clock always has at least one legal placement.
|
||||
|
||||
The opening tile must cover at least one of the four centre cells — (8,8),
|
||||
(8,9), (9,8), (9,9). Everything else grows out from it.
|
||||
### The opening tile
|
||||
|
||||
### Placing every tile after the first
|
||||
The first tile must cover at least one of the four centre cells — (8,8), (8,9),
|
||||
(9,8), (9,9). Every one of the 28 tiles can legally open, so the first turn can
|
||||
never jam.
|
||||
|
||||
### Every tile after the first
|
||||
|
||||
A placement is legal when all of the following hold.
|
||||
|
||||
- **The three cells are empty** and lie in a straight line on the board.
|
||||
- **Every one of the tile's three mouths is accounted for.** Take each mouth in
|
||||
turn and look at what is on the other side of it:
|
||||
- **The three cells are empty** and in a straight line on the board.
|
||||
- **Every one of the tile's three mouths is accounted for.** Take each mouth and
|
||||
look at what lies across it:
|
||||
- *an empty cell* — fine, the river runs on into open ground;
|
||||
- *off the board* — fine, and that is a scoring exit (see below);
|
||||
- *a tile that has a mouth facing back* — fine, the two join up;
|
||||
- *off the board* — fine, and that is a scoring exit;
|
||||
- *a tile with a mouth facing back* — fine, the two join up;
|
||||
- *a tile with a blank flank there* — **illegal**. A river may never dead-end
|
||||
against the side of another tile.
|
||||
- **The tile's blank edges must not wall anything off either.** If a blank part
|
||||
of the new tile lands against an existing tile's mouth, the placement is
|
||||
illegal, for the same reason read from the other direction.
|
||||
- **The tile's own blank edges must not wall anything off either.** A blank part
|
||||
of the new tile landing against an existing tile's mouth is illegal for the
|
||||
same reason read from the other direction.
|
||||
- **The tile must join the network.** At least one of its mouths must meet a
|
||||
mouth of a tile already on the board.
|
||||
mouth of a tile already down.
|
||||
|
||||
Because every tile joins the network by at least one mouth, and because all
|
||||
three mouths of a tile are connected across its face, **everything on the board
|
||||
is always one single river system** running back to the opening tile. The
|
||||
engine gets connectivity for free and never has to trace it.
|
||||
The engine enforces the two blanking rules as a single comparison: where a new
|
||||
tile abuts an existing one, both sides must agree — mouth to mouth, or blank to
|
||||
blank.
|
||||
|
||||
One consequence worth knowing, because it is what keeps the engine simple:
|
||||
since every tile joins the network by a mouth, and all three mouths of a tile
|
||||
are connected across its face, **everything on the board is always one single
|
||||
river system** running back to the opening tile. Nothing ever has to trace
|
||||
connectivity, and a mouth at the board's edge is a scoring exit by construction.
|
||||
`TayuRulesTest` and the offline verification harness both check this holds over
|
||||
whole games.
|
||||
|
||||
## End of the game
|
||||
|
||||
The game ends when the bag is empty, or when no tile left in the bag can be
|
||||
placed anywhere.
|
||||
The game ends when the bag is empty, or when nothing left in it can be placed
|
||||
anywhere. In practice a full 84-tile bag ends with a handful set aside — the
|
||||
board jams before the bag runs dry.
|
||||
|
||||
## Scoring
|
||||
|
||||
Count each side's exits — mouths that run off the board — on each of its two
|
||||
edges.
|
||||
|
||||
- An ordinary exit counts **1**.
|
||||
- One of the three **marked** exits on that edge counts **2**.
|
||||
|
||||
Then, for each side:
|
||||
Count each side's exits on each of its two edges. An ordinary exit counts **1**;
|
||||
one of the three **marked** exits on that edge counts **2**. Then, for each
|
||||
side:
|
||||
|
||||
```
|
||||
score = (exits on one edge) × (exits on the opposite edge)
|
||||
```
|
||||
|
||||
North–south multiplies its north count by its south count; east–west multiplies
|
||||
east by west. **A side that reaches only one of its two edges scores nothing**,
|
||||
which is the whole tension of the game: breadth on one edge is worthless
|
||||
without a matching breakthrough on the other.
|
||||
North–south multiplies its north count by its south; east–west multiplies east
|
||||
by west. **A side that reaches only one of its two edges scores nothing** — that
|
||||
is the whole tension of the game, and it happens in real play, not just in
|
||||
theory.
|
||||
|
||||
Higher score wins. Equal scores are a draw.
|
||||
|
||||
### Where the marked exits sit
|
||||
|
||||
Positions **3, 8 and 13** along each edge, counted clockwise from that edge's
|
||||
first cell, giving the board four-fold rotational symmetry so no side is
|
||||
better placed than another.
|
||||
first cell, giving the board four-fold rotational symmetry so no side is better
|
||||
served than another. This is a **choice, not a reproduction** — see below.
|
||||
|
||||
This is a **choice, not a reproduction** — see below.
|
||||
## Playing it on a phone
|
||||
|
||||
18 × 18 cells works out under 20dp a cell on a phone, which is too fine to tap
|
||||
accurately, so laying a tile is two steps rather than one:
|
||||
|
||||
- **Tap the board** to line a placement up. Cells that the drawn tile could
|
||||
cover are dotted, and the placement appears as an amber ghost.
|
||||
- **Tap the same cell again**, or press **Turn the tile**, to cycle through the
|
||||
other legal ways the tile could cover that cell. This is also how the tile
|
||||
gets turned — it has four orientations but only some of them fit, and a rotate
|
||||
control that landed on illegal positions would be worse than useless.
|
||||
- **Lay the tile** commits it.
|
||||
|
||||
A tap on a cell the tile cannot cover is ignored rather than treated as a
|
||||
deselection, so a fingertip landing one cell wide does not throw away a
|
||||
placement that took several taps to line up.
|
||||
|
||||
Rivers are drawn as channels running from each mouth into a pool at the middle
|
||||
of the tile. Exits show as a dot outside the board in the colour of the side
|
||||
that edge belongs to, and the four edges are tinted the same way, so it is
|
||||
possible to see at a glance which rivers are working for whom.
|
||||
|
||||
## The computer opponent
|
||||
|
||||
It rates every legal placement on the board that placement would produce,
|
||||
weighing what its own axis would score, what the opponent's would score, and
|
||||
which way the still-open river mouths are pointing.
|
||||
|
||||
That last term is what makes it play sensibly at all. Both scores sit at zero
|
||||
for most of a game — a product needs both edges — so an opponent that looked
|
||||
only at the score would have nothing to choose between its first fifty
|
||||
placements.
|
||||
|
||||
Two settings, because only two could be shown to differ:
|
||||
|
||||
| Setting | What it does | Measured |
|
||||
| --- | --- | --- |
|
||||
| **Gentle** | Rates a placement only on what it scores at that moment, which is usually nothing, so it lays a plausible but aimless river | Beats random placement about 3 games in 4; loses to full strength about 4 in 5 |
|
||||
| **Full strength** | Adds blocking, and notices which way the open mouths point | Won 20 of 20 against random placement, from either axis |
|
||||
|
||||
`TayuAiTest` holds both to those figures, and also checks that random against
|
||||
random comes out even — if it did not, the board or the scoring would favour an
|
||||
axis and every other result would be meaningless.
|
||||
|
||||
A third setting that blocked harder was written and dropped: it played full
|
||||
strength dead even over 30 games, so shipping it as a step up would have been a
|
||||
claim that could not be backed.
|
||||
|
||||
## Provenance
|
||||
|
||||
Everything above is reconstructed from secondary sources. The rulebook itself
|
||||
could not be reached from this machine: outbound web requests are blocked by
|
||||
the environment's network policy, so only search-result summaries were
|
||||
available, and BoardGameGeek's rules files were out of reach entirely.
|
||||
Everything here is reconstructed from secondary sources. The rulebook itself
|
||||
could not be reached: outbound web requests are blocked by the build
|
||||
environment's network policy, so only search-result summaries were available,
|
||||
and BoardGameGeek's rules files were out of reach entirely.
|
||||
|
||||
**Attested by sources:** designer and year; 84 tiles in the reissue and 112 in
|
||||
the original; 1×3 tiles with three connections each; the board's round
|
||||
indentations and the opening tile going in one of the four centre ones; the
|
||||
indentations, and the opening tile going in one of the four centre ones; the
|
||||
mouth-accounting placement rule and the ban on a river ending against a blank;
|
||||
north–south versus east–west; the multiplicative scoring; marked exits counting
|
||||
north–south against east–west; the multiplicative scoring; marked exits counting
|
||||
double, three to a side; the game ending when nothing can be placed; the
|
||||
three-player flood variant existing.
|
||||
existence of a three-player flood variant.
|
||||
|
||||
**Reconstructed here, and the parts to check against a real copy:**
|
||||
|
||||
- **The board is 18 × 18.** One source describes the physical board as having
|
||||
18 × 18 indentations; several others say 19 × 19. 18 × 18 is used because it
|
||||
is the one that makes "the four centre indentations" true — a 19 × 19 grid
|
||||
has a single centre cell, not four. If a rulebook ever settles this the other
|
||||
way, `BOARD_SIZE` is the only number that has to change.
|
||||
is the reading under which "the four centre indentations" is true — a 19 × 19
|
||||
grid has a single centre cell, not four. `BOARD_SIZE` in `TayuModel.kt` is the
|
||||
only thing that has to change if a rulebook settles it the other way.
|
||||
- **The 28-tile set and its geometry.** Derived, not read off a component list.
|
||||
It is trusted because 84 and 112 are both exact multiples of 28, and because
|
||||
12 of the 28 touch three flanks, matching the ringed tiles in the reissue.
|
||||
- **All three mouths on a tile interconnect.** Consistent with every
|
||||
description found, but not stated outright anywhere.
|
||||
- **All three mouths on a tile interconnect.** Consistent with every description
|
||||
found, but never stated outright.
|
||||
- **The marked exits at 3, 8 and 13.** Their real positions are unknown. Three
|
||||
mirror-symmetric marks are impossible on an even-length edge, so the real
|
||||
board cannot be reflectively symmetric per side either; a rotationally
|
||||
symmetric layout was picked as the fairest guess. This is cosmetic to the
|
||||
rules and structural only to the final score.
|
||||
- **An unplaceable drawn tile is set aside and the turn passes.** The
|
||||
alternative reading is that the game simply ends there.
|
||||
board cannot be reflectively symmetric within a side either; a rotationally
|
||||
symmetric layout was picked as the fairest guess. Cosmetic to the rules, and
|
||||
structural only to the final score.
|
||||
- **An unplaceable drawn tile is set aside and the turn passes.** The other
|
||||
reading is that the game simply ends there.
|
||||
|
||||
This is the same posture as the Sequence board layout: where the real thing
|
||||
could not be verified, ship an honest substitute and say so, rather than a
|
||||
guess dressed up as authentic.
|
||||
could not be verified, ship an honest substitute and say so, rather than a guess
|
||||
dressed up as authentic.
|
||||
|
||||
## Known gaps
|
||||
|
||||
- **The three-player flood variant is not implemented.** Sources agree it
|
||||
exists and that the third player tries to stop the other two reaching the
|
||||
edges, but nothing found says how the flood *scores*, and inventing a scoring
|
||||
rule would be making up a different game. Two- and four-player tables cover
|
||||
the family case; this can be added if the rulebook turns up.
|
||||
- **No draw-a-replacement rule.** A tile that cannot be placed is gone for
|
||||
good rather than swapped, which is the simpler of the two readings.
|
||||
- **The three-player flood variant is not implemented.** Sources agree it exists
|
||||
and that the third player tries to stop the other two reaching the edges, but
|
||||
nothing found says how the flood *scores*, and inventing a scoring rule would
|
||||
be shipping a different game. Two- and four-player tables cover the family
|
||||
case; this can be added if the rulebook turns up.
|
||||
- **No draw-a-replacement rule.** A tile that cannot be placed is gone for good
|
||||
rather than swapped, which is the simpler of the two readings.
|
||||
- **A full 84-tile game is long** — 84 placements, and every one of them is a
|
||||
real decision. The two- and three-copy settings exist for that reason.
|
||||
- **The AI does not look ahead.** It rates the board one placement deep. It
|
||||
plays a strong positional game because the heuristic is aimed at the right
|
||||
thing, not because it is searching.
|
||||
|
||||
Reference in New Issue
Block a user