Skip to content

Repository files navigation

world-sim

Чистый Python, детерминированная симуляция экономики на графе узлов. Этап 1 (sim/ + run.py) — без игрока, без графики сверх статичного отчёта, без мультиплеера, только проверка гипотез. Этап 2 (web/ + play.py) — тот же движок, но с одним живым игроком через браузер: автотакт, рычаги управления одним узлом, счёт и итоговый отчёт по партии. Этап 3 (тот же sim//web/) — разброс населения и промышленности по размеру города, топология и вместимость рёбер от населения, платная перевозка, фронт между двумя государствами (статичный и, за флагом, подвижный), честный экран выбора узла.

Полные правила мира, включая игровой слой Этапа 2 и топологию/фронт Этапа 3, — в DESIGN.md. Спецификация Этапа 3 — в STAGE3_SPEC.md. Гипотезы Этапа 1, калибровка, итоги плейтеста Этапа 2 и журнал калибровки Этапа 3 — в HYPOTHESES.md.

Запуск (Этап 1 — прогон без игрока)

python run.py --seed 1
python run.py --seed 1 --ticks 200 --out-dir runs
python run.py --seed 1 --quiet
python run.py --seed 1 --self-test
python run.py --seed 1 --front-movement

--quiet подавляет построчный вывод по тактам, оставляя только итоговый вердикт. --self-test прогоняет один seed в двух независимых процессах python и сравнивает sha256-фингерпринт результата — межпроцессная проверка нужна, потому что Python рандомизирует хэширование строк между процессами, и внутрипроцессная проверка не ловит связанные с этим баги (подробнее — в HYPOTHESES.md, журнал калибровки M6 Этапа 1). --front-movement включает M6 Этапа 3 (движение линии фронта, за флагом, выключено по умолчанию) — см. DESIGN.md и раздел «Этап 3 — M6» в HYPOTHESES.md перед тем, как полагаться на него в длинных прогонах.

После прогона: построчный лог по тактам в консоли, блок вердикта по H1–H3, и в конце пути к runs/{seed}_{timestamp}.json (полный дамп мира + история метрик) и runs/{seed}_{timestamp}.html (тот же прогон в графиках — открыть в браузере).

Запуск (Этап 2 — игрок в браузере)

pip install -r requirements.txt
python play.py --seed 1

Открыть http://127.0.0.1:5000/ — экран выбора узла показывает по каждому узлу факты из модели (население, производство, расстояние до фронта, зависимость от соседей по еде/топливу, есть ли запасной маршрут снабжения — без оценки сложности, см. DESIGN.md), выбрать узел — дальше игра идёт на странице: автотакт с паузой/×1/×2/×4, рычаги (придержать вывоз / срочный запрос / приоритет предприятий), счёт и здоровье узла. Ссылка «Итоговый отчёт по партии» на странице игры (или напрямую /report) показывает график склада и здоровья за сессию, тепловую карту дефицита и статистику по рычагам. --port меняет порт (по умолчанию 5000).

Ссылка «Посмотреть карту» на экране выбора узла (или напрямую /map?seed=N) — та же модель мира как граф: узлы-кружки (размер = население, цвет = государство), рёбра-линии (красная = фронтовая), значки под узлом — что он производит. Подробности раскладки (и известная связка ошибок с d3.forceLink/requestAnimationFrame, если будете его трогать) — в DESIGN.md.

Требования: Python 3.10+. Этап 1 (run.py) — без зависимостей. Этап 2 (play.py) — нужен Flask (pip install -r requirements.txt).

Статус

Этап 1 (бумажная симуляция) — завершён. Все три гипотезы проверены на 12 seed: H1 и H2 подтверждены полностью (12/12), H3 подтверждена не универсально (9/12 — см. разбор в HYPOTHESES.md).

Этап 2 (игрок в браузере) — завершён: sim/ расширен тремя необязательными рычагами игрока без изменения поведения по умолчанию (self-test Этапа 1 остаётся зелёным), поверх — Flask-дашборд с автотактом и итоговым отчётом по партии.

Этап 3 (M0–M6, спека — STAGE3_SPEC.md) — завершён: диагностика существующего, разброс населения/промышленности по тирам, топология и вместимость рёбер от населения, платная перевозка, фронт между двумя государствами (статичный — распад пропускной способности, риск обрыва рёбер, доп. расход; подвижный — за флагом --front-movement, выключен по умолчанию), честный экран выбора узла. --self-test зелёный на всех проверенных seed при выключенном и включённом флаге M6. Итоги, найденные по ходу проблемы (топливный затор M1, геометрия фронта, калибровка M6) и варианты дальнейшего развития — в HYPOTHESES.md.

Журнал изменений — в CHANGELOG.md.

Лицензия

Apache 2.0.

About

Можно грабить корованы

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages