113 lines
8.2 KiB
Markdown
113 lines
8.2 KiB
Markdown
# Go Games Collection
|
||
|
||
Коллекция консольных карточных игр и настольных игр на Go с текстовым интерфейсом (TUI) на [Bubble Tea](https://github.com/charmbracelet/bubbletea). Играете против ботов (кроме пасьянса — он на одного) прямо в терминале.
|
||
|
||
```
|
||
____ ___ ____ _ __ __ _____ ____
|
||
/ ___|/ _ \ / ___| / \ | \/ | ____/ ___|
|
||
| | _| | | | | | _ / _ \ | |\/| | _| \___ \
|
||
| |_| | |_| | | |_| |/ ___ \| | | | |___ ___) |
|
||
\____|\___/ \____/_/ \_\_| |_|_____|____/
|
||
____ ___ _ _ _____ ____ _____ ___ ___ _ _
|
||
/ ___/ _ \| | | | | ____/ ___|_ _|_ _/ _ \| \ | |
|
||
| | | | | | | | | | _|| | | | | | | | | \| |
|
||
| |__| |_| | |___| |___| |__| |___ | | | | |_| | |\ |
|
||
\____\___/|_____|_____|_____\____| |_| |___\___/|_| \_|
|
||
```
|
||
|
||
## Игры в коллекции
|
||
|
||
| Игра | Игроков | Особенности |
|
||
|---|---|---|
|
||
| **Тонк (Tonk)** | 1 человек + 3 бота | Денежная система: капитал, ставка, банкротство и замена бота |
|
||
| **Дурак (Durak)** | 2–6 | Полноценное подкидывание любым игроком (не только атакующим) |
|
||
| **Блэкджек (Blackjack)** | 1–6 (можно соло) | Каждый играет против дилера отдельно, hit/stand/double |
|
||
| **101** | 2–6 | Избавься от карт первым; выбывание по достижении 101 очка |
|
||
| **1000 (Тысяча)** | строго 3 | Торги, прикуп, взятки и марьяжи с динамическим козырем |
|
||
| **Косынка (Klondike)** | 1 (без ботов) | Классический пасьянс с отменой хода |
|
||
| **Шашки (Checkers)** | 1 человек + бот | Русские шашки, бот на минимаксе с 2 уровнями сложности |
|
||
|
||
Каждая игра — со своим набором специально подобранных упрощений там, где у оригинала слишком много вариантов правил (например, «1000» реализована только на троих, а Дурак — без «тузового марьяжа» и бочки). Полный список правил и упрощений — в разделе «Правила» самого приложения или через `--help`.
|
||
|
||
## Запуск
|
||
|
||
Требуется Go 1.22+.
|
||
|
||
```bash
|
||
go run . # открыть меню коллекции
|
||
go run . --help # показать правила всех игр, не заходя в TUI
|
||
go run . -sim # headless-симуляция ботов Тонка (для проверки баланса)
|
||
go run . -sim-durak # то же для Дурака
|
||
go run . -sim-blackjack # то же для Блэкджека
|
||
go run . -sim-101 # то же для 101
|
||
go run . -sim-1000 # то же для Тысячи
|
||
```
|
||
|
||
Или собрать бинарник:
|
||
|
||
```bash
|
||
go build -o games .
|
||
./games
|
||
```
|
||
|
||
## Общее управление в меню
|
||
|
||
- `↑↓` / `k j` — навигация по пунктам меню
|
||
- `enter` — выбрать / подтвердить
|
||
- `esc` / `q` — назад
|
||
- Внутри игры `q` всегда возвращает в меню (не закрывает программу); `ctrl+c` закрывает приложение целиком
|
||
|
||
У части игр перед стартом есть экран настроек: ставка и капитал (Тонк), число игроков (Дурак, 101), число игроков + ставка (Блэкджек), уровень сложности бота (Шашки).
|
||
|
||
Управление в конкретной игре не дублируется здесь — оно всегда показано внизу экрана самой игры, а также доступно целиком через пункт «Правила» в меню или `--help`.
|
||
|
||
## Структура проекта
|
||
|
||
Каждая игра — самостоятельный набор из 3 файлов (движок / бот / TUI) плюс тесты; общая для всех инфраструктура (меню, карты, колода) вынесена отдельно.
|
||
|
||
```
|
||
card.go, deck.go — общие типы карт и стандартная колода на 52 карты
|
||
menu.go, banner.go — главное меню, ASCII-баннер, экраны настроек игр
|
||
rules.go — тексты правил всех игр (для TUI и --help)
|
||
main.go — точка входа, флаги -sim-*, --help
|
||
|
||
game.go, bot.go, — Тонк: движок, боты трёх уровней сложности,
|
||
bot_heuristics.go, банкротство и замена бота, TUI
|
||
tui.go, player.go,
|
||
meld.go
|
||
|
||
durak_*.go — Дурак: движок с полным подкидыванием, бот, TUI
|
||
|
||
blackjack_*.go — Блэкджек: движок дилера, бот, TUI
|
||
|
||
oneohone_*.go — 101: движок, бот, TUI
|
||
|
||
thousand_*.go — 1000: движок торгов/взяток/марьяжей, бот, TUI
|
||
|
||
klondike_*.go — Косынка: движок пасьянса с отменой хода, TUI
|
||
(ботов нет — играть некому, кроме человека)
|
||
|
||
checkers_*.go — Шашки: движок русских шашек, бот на минимаксе, TUI
|
||
|
||
*_test.go — тесты (юнит-тесты правил + стресс-симуляции
|
||
полных партий ботами)
|
||
```
|
||
|
||
## Тестирование
|
||
|
||
```bash
|
||
go test ./... # весь пакет
|
||
go test ./... -v # подробный вывод по каждому тесту
|
||
```
|
||
|
||
В пакете 215 тестов: юнит-тесты игровой логики (раздача, ходы, подсчёт очков, крайние случаи вроде взятия дамкой или марьяжа на первой взятке) и отдельные стресс-тесты, прогоняющие сотни-тысячи симулированных партий ботами подряд — они специально написаны, чтобы ловить редкие зависания, потерю/дублирование карт и прочие тонкие баги, которые не всегда видны в единичном ручном тесте.
|
||
|
||
## Известные упрощения
|
||
|
||
У традиционных карточных игр обычно много региональных вариантов правил. Там, где выбор был сделан осознанно (а не по ошибке), это явно прокомментировано в соответствующем `*_game.go` и продублировано в тексте правил игры. Коротко:
|
||
|
||
- **Дурак** — полные правила (подкидывать может любой игрок, не только атакующий).
|
||
- **101** — туз пропускает ход, 6/7/пиковый король дают штрафные карты; десятка не меняет направление хода.
|
||
- **1000** — только на 3 игроков; нет бочки, золотого кона, самосвала, тузового марьяжа и игры втёмную.
|
||
- **Косынка** — добор по одной карте, неограниченные пересдачи; возврата карт с фундамента в игру нет.
|
||
- **Шашки** — русские правила (взятие в любом направлении простой шашкой, «летающая» дамка), без официальных 15/30-ходовых правил ничьей — вместо них простой лимит в 60 полуходов без взятий.
|