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), бросает сервер |
| Фишки | По одному цвету/ид на игрока |
Ход
- Активный игрок вызывает
roll_dice→ сервер возвращает(d1, d2). - Кандидаты:
(d1, d2)и(d2, d1)(если совпадают — одна клетка). - Игрок вызывает
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