Перейти к содержанию

dice_board — Кубики на поле

Поле Значение
plugin_id dice_board
Выпуск шоу 8 сезон, «От одного до одиннадцати»
Версия spec 0.1
Игроки 2–4 (TBD, MVP: 2)

Цель

Первый в ряд — 3 фишки по горизонтали, вертикали или диагонали на поле 6×6.

Компоненты

Элемент Описание
Поле 6×6, координаты 1–6 (row, col)
Кубики 2× d6 (1–6), бросает сервер
Фишки По одному цвету/ид на игрока

Ход

  1. Активный игрок вызывает roll_dice → сервер возвращает (d1, d2).
  2. Кандидаты: (d1, d2) и (d2, d1) (если совпадают — одна клетка).
  3. Игрок вызывает choose_cell с {row, col}.

Дубль (d1 = d2): после постановки/захвата на кандидат-клетку — повторный бросок в том же ходу (лимит см. ниже).

Постановка в центр без дубля повторного броска не даёт (например, кубики 3 и 4 → клетки (3,4)/(4,3) в центре, но ход переходит сопернику).

Постановка

Клетка Действие
Пустая Ставится фишка игрока
Соперник Фишка соперника снимается, ставится своя
Своя Запрещено, если другая кандидат-клетка свободна (FR-016)

Центр

Центральные клетки: (3,3), (3,4), (4,3), (4,4) — особая зона поля, но сама по себе не даёт повторный бросок. Повтор только при дубле на кубиках.

  • Лимит reroll при дублях: 3 (default, TBD по выпуску)
  • После reroll снова фаза AwaitCellChoice (после нового броска)

Победа

После хода без дубля (или после исчерпания reroll при дублях) — проверка 3 в ряд.

При победе: GameInstance.status = finished, winner_id установлен.

FSM

stateDiagram-v2
    [*] --> RollDice: turnStart
    RollDice --> AwaitCellChoice: diceRolled
    AwaitCellChoice --> PlaceToken: cellEmpty
    AwaitCellChoice --> CaptureToken: cellOccupiedByOpponent
    PlaceToken --> CheckCenter: tokenPlaced
    CaptureToken --> CheckCenter: tokenCaptured
    CheckCenter --> RollDice: isDoubles
    CheckCenter --> CheckWin: notDoubles
    CheckWin --> GameOver: threeInRow
    CheckWin --> NextTurn: noWin
    GameOver --> [*]
    NextTurn --> [*]

GameState (JSON schema, conceptual)

{
  "phase": "AwaitCellChoice",
  "board": [[null, "p1", ...], ...],
  "dice": [4, 2],
  "candidates": [[4, 2], [2, 4]],
  "current_player_id": "uuid",
  "player_order": ["uuid1", "uuid2"],
  "reroll_count": 0,
  "max_rerolls": 3
}

Actions

type payload phase
roll_dice {} RollDice
choose_cell {row, col} AwaitCellChoice
pass {} TBD edge cases

TBD

  • Обе клетки заняты соперниками — выбор любой vs пропуск
  • Обе заняты своими — пропуск хода?
  • Ничья при заполнении поля
  • Точное определение центра по видео выпуска

Связанные FR

FR-011–FR-017, FR-035–FR-037