feat(robot): occasional off-strategy deviation, strict in the endgame
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Has been skipped
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m9s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Has been skipped
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m9s
The robot followed its per-game playToWin/lose intent on every move, which made the outcome too predictable. It now flips that intent for a single move on ~20% of opening/midgame turns (a winning robot eases off, a losing one surges ahead), so the chosen strategy may not pan out — which favours the human. The chance tapers linearly to 0 over the last 14 tiles in the bag and is 0 once the bag is empty, so the endgame follows the chosen strategy strictly. The decision is deterministic from the seed (mix(seed,"deviate",moveCount)) and applies to both robot paths via the shared selectMove; the per-game play-to-win intent the admin card shows is unchanged. Adds deviateProb/deviates helpers and unit tests (taper bounds + monotonicity, never-in-endgame, determinism, ~20% distribution); bakes the behaviour into ARCHITECTURE §7, FUNCTIONAL (+_ru), backend/README, PRERELEASE and PLAN Stage 5.
This commit is contained in:
+7
-4
@@ -141,8 +141,10 @@ When auto-match finds no human within the wait window (1.5–3 minutes), a robot
|
||||
takes the empty seat of the game you are already waiting in. It is meant to feel like a person: it
|
||||
decides once per game whether to play to win (about 40% of the time, so the human
|
||||
wins most games), aims for a close score rather than crushing or throwing the game,
|
||||
and plays at a human pace — short thinking times for most moves, the occasional long
|
||||
one, and a night-time pause that tracks the player's own day. It answers a nudge
|
||||
now and then plays a single move against that plan — a surprise lead or a slack move —
|
||||
yet holds to the plan once the bag empties, and plays at a human pace — short thinking
|
||||
times for most moves, the occasional long one, and a night-time pause that tracks the
|
||||
player's own day. It answers a nudge
|
||||
within a few minutes and nudges back when the player has been away a long time. It
|
||||
carries a human-like, language-appropriate name (a Russian game draws mostly Russian
|
||||
names); it does not chat, and **silently ignores friend requests** — a request to a
|
||||
@@ -150,8 +152,9 @@ robot stays pending and expires, exactly like a human who never responds.
|
||||
|
||||
The same robot also backs the **honest-AI quick game** the player chooses directly (above). There
|
||||
it makes no pretence: it is shown as **🤖** everywhere, joins and moves at once (no thinking time
|
||||
or night pause), keeps the same strength (it still plays to win only about 40% of the time), and
|
||||
chat, nudge and add-friend are off. AI games are **practice** — they never count toward a player's
|
||||
or night pause), keeps the same strength (it still plays to win only about 40% of the time, with
|
||||
the same occasional move against its plan that fades out by the endgame), and chat, nudge and
|
||||
add-friend are off. AI games are **practice** — they never count toward a player's
|
||||
statistics.
|
||||
|
||||
### Social: friends, block, chat, nudge
|
||||
|
||||
Reference in New Issue
Block a user