# 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 полуходов без взятий.