go_games_collection/README.md
2026-07-04 13:51:04 +03:00

113 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Go Games Collection
Коллекция консольных карточных игр и настольных игр на Go с текстовым интерфейсом (TUI) на [Bubble Tea](https://github.com/charmbracelet/bubbletea). Играете против ботов (кроме пасьянса — он на одного) прямо в терминале.
```
____ ___ ____ _ __ __ _____ ____
/ ___|/ _ \ / ___| / \ | \/ | ____/ ___|
| | _| | | | | | _ / _ \ | |\/| | _| \___ \
| |_| | |_| | | |_| |/ ___ \| | | | |___ ___) |
\____|\___/ \____/_/ \_\_| |_|_____|____/
____ ___ _ _ _____ ____ _____ ___ ___ _ _
/ ___/ _ \| | | | | ____/ ___|_ _|_ _/ _ \| \ | |
| | | | | | | | | | _|| | | | | | | | | \| |
| |__| |_| | |___| |___| |__| |___ | | | | |_| | |\ |
\____\___/|_____|_____|_____\____| |_| |___\___/|_| \_|
```
## Игры в коллекции
| Игра | Игроков | Особенности |
|---|---|---|
| **Тонк (Tonk)** | 1 человек + 3 бота | Денежная система: капитал, ставка, банкротство и замена бота |
| **Дурак (Durak)** | 26 | Полноценное подкидывание любым игроком (не только атакующим) |
| **Блэкджек (Blackjack)** | 16 (можно соло) | Каждый играет против дилера отдельно, hit/stand/double |
| **101** | 26 | Избавься от карт первым; выбывание по достижении 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 полуходов без взятий.