CLI-проект для симуляции партии и аудита стратегий по игре "Кубовая Тыща". Кодовая база собрана как Python-пакет cubes, а корневые скрипты main.py и plot_report.py оставлены как совместимые точки входа.
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python main.py --seed 42 --json-out reports/report.json --csv-out reports/report.csv
python plot_report.py --json reports/report.json --out-dir reports/chartsПроект использует только стандартную библиотеку Python, поэтому requirements.txt не тянет внешние зависимости.
Официальный способ запуска:
python -m unittest discover -s tests -vИменно этот сценарий используется в CI.
cubes/game.py— игровое ядро, правила броска, булки, небитки и бочки.cubes/strategies.py— стратегии, registry алиасов и фабрика создания игроков.cubes/tournament.py— orchestration аудита, агрегаты и экспорт.cubes/reporting.py— загрузка отчётов и генерация SVG-графиков.cubes/models.py— доменные dataclass-модели и типизированные записи истории.main.py,plot_report.py— совместимые CLI-оболочки.
- Побеждает участник, набравший 1000 или больше очков.
- Игроки ходят по очереди.
- У каждого игрока есть три броска и 5 кубиков.
- Если на всех кубах есть очки, это небитка: сумма не сгорает и игрок получает ещё три броска.
- Если очков за бросок не выпало вообще, это булка: все очки текущего хода сгорают.
- В каждом броске игрок может записать очки или отложить любое количество очковых кубов и перебросить остальные.
- 5 одинаковых кубов — 1000 очков.
- 4 одинаковых куба —
10x + 100очков. - 3 одинаковых куба —
10xочков, кроме трёх единиц: это 100 очков. - Один куб: единица — 10 очков, пятёрка — 5 очков.
- Дубли из двоек, троек, четвёрок и шестёрок очков не дают, но могут закрывать небитку, если остальные кубы очковые.
Если игрок набрал от 900 до 999 очков, сумма замораживается. Дальше нужно закрыться до 1000 в рамках одного хода; иначе счёт возвращается к замороженному значению.
python main.py
python main.py --tours 200
python main.py --player greedy --player cautious:80 --player hopness:70:Риск
python main.py --seed 42 --json-out reports/report.json --csv-out reports/report.csv
python main.py --seed 42 --summary-only --json-out reports/summary.json
python main.py --seed 42 --show-game-history --json-out reports/history.json
python plot_report.py --json reports/report.json --out-dir reports/charts
python plot_report.py --csv reports/report.csv --out-dir reports/chartsПо умолчанию main.py запускает независимые серии партий для каждой стратегии, а --tours задаёт число партий на каждую стратегию.
Формат --player:
greedycautious:80hopness:70:ИмяИгрокаadaptive:60:ИмяИгрокаbarrel:55:ИмяИгрока
Неизвестная стратегия теперь считается ошибкой конфигурации и приводит к ValueError, а не к молчаливому переходу на жадную стратегию.
greedy— берёт максимум здесь и сейчас и почти всегда сразу записывает ход. Базовыйthreshold:1.cautious— раньше фиксирует очки и сильнее учитывает остаток бросков и риск булки. Базовыйthreshold:50.hopness— играет на небитку и старается оставлять минимум кубов на столе. Базовыйthreshold:70.adaptive— двигает порог записи в зависимости от риска булки и количества оставшихся бросков. Базовыйthreshold:60.barrel— отдельно оптимизирует вход в бочку и закрытие партии. Базовыйthreshold:55.
Registry стратегий находится в cubes/strategies.py. Если добавляется новая стратегия, нужно:
- Добавить класс стратегии.
- Зарегистрировать её в
STRATEGY_REGISTRY. - При необходимости добавить тесты на алиасы, default threshold и поведение.
- Обновить README, если стратегия становится частью публичного CLI.
- Верхний уровень содержит
schema_version. - В полном экспорте есть
summaryиgames. - В
summaryсодержатся агрегаты аудита иplayer_specs. - При
--show-game-historyкаждая игра получает полеhistory.
Пример полей в history:
movestepplayerrollcube_countholdhold_scoreturn_scoretotal_scorecheck_strikecheck_foulbanked
summary-режим сохраняет строки видаsection,name,value.fullиper-gameсохраняют построчную статистику по каждой партии.- История ходов в CSV сейчас не выгружается; для неё используйте JSON.
Загрузчики в plot_report.py и cubes/reporting.py сохраняют обратную совместимость со старыми CSV/JSON без schema_version.
plot_report.py строит SVG-графики:
turns_to_win_by_player.svgaverage_score_by_player.svgscores_by_game.svg
scores_by_game.svg сейчас особенно полезен для старых многопользовательских отчётов; в новом режиме аудита основной график — turns_to_win_by_player.svg.
- Основной стиль имён в коде и в JSON history —
snake_case. - Публичные стратегии регистрируются централизованно через registry.
- Изменения в экспортных схемах должны сопровождаться обновлением
schema_version, README и тестов загрузчиков. - Новые пользовательские сценарии CLI должны иметь smoke-test или unit-тест.