AAYMA
RU
Войти

Моя Астана

Браузерная игра-симулятор акима на карте центра Астаны: размещение объектов 5 услуг, бюджет, охват жителей, пять дней решений, советник и отчёт с…

Прототип
Команда «Chicks» 10💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Chicks
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Прототип

Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам

Суть

Браузерная игра-симулятор акима на карте центра Астаны: размещение объектов 5 услуг, бюджет, охват жителей, пять дней решений, советник и отчёт с альтернативой. Есть AI-чат на OpenAI.

Как устроено

По README ядро engine.js проверяет бюджет, участок и лимит дней. Индекс города — среднее по 12 домам (20 базовых + 16 баллов за каждую из 5 услуг), охват по радиусу в нормализованных координатах. Алгоритмический советник перебирает доступные участки, итоговая альтернатива пробует перенос одного объекта. server.py проксирует AI-консультанта на OpenAI. В дереве репозитория нет папки dist/ с кодом игры: есть только server.py, тесты и README.

Ключевые решения

  • brute-force placement advisor
  • radius coverage model
  • 243-strategy tests
  • WebMCP agent-tools
  • localStorage saves

Особенности

Используется реальная карта OSM с правильной атрибуцией CC BY-SA. Игру можно запустить без сборки двойным щелчком. Код игры (dist/) в репозиторий, судя по дереву, не попал.

Стек

HTML · CSS · JavaScript · Python · Node.js

Модели

OpenAI gpt-4.1-mini


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-f84ee748-chicks.

README

README.md

Моя Астана — командный проект

Игра на чистых HTML, CSS и JavaScript с изображением реальной карты центра Астаны. Дома, участки строительства, жители, цены и эффекты — условные игровые данные. AI-модель не подключена; советник алгоритмический, реплики сценарные.

Запуск без установки

  1. Распакуйте весь ZIP.
  2. Откройте dist/index.html в браузере.
  3. Не перемещайте один HTML отдельно: рядом нужны папки core, shared, features.

Карта и весь код находятся в архиве. Интернет для игры не нужен. Не используются npm, сборщик, внешние библиотеки и API-ключи. Обычные <script> оставлены специально для запуска двойным щелчком.

AI-консультант

Для работы чата нужен Python 3 и серверный ключ OpenAI. Из корневой папки проекта задайте ключ только в переменных окружения, затем запустите сервер:

PowerShell:

$env:OPENAI_API_KEY = "ваш_ключ"
python server.py

Командная строка Windows:

set OPENAI_API_KEY=ваш_ключ
python server.py

Откройте http://127.0.0.1:3000. Не вставляйте ключ в файлы клиентского приложения и не публикуйте его. Модель по умолчанию — gpt-4.1-mini; при необходимости её можно задать переменной OPENAI_MODEL. Без ключа или при недоступности OpenAI игра продолжает работать, а чат сообщает о недоступности AI.

Где что находится

akim-site/
├── dist/
│   ├── index.html                 # Структура страницы, подключения модулей
│   ├── core/
│   │   ├── app.js                 # Сборка модулей и общее состояние
│   │   ├── engine.js              # Бюджет, размещение, охват, формула
│   │   └── registry.js            # Пространство имён GameFeatures
│   ├── shared/style.css           # Общие цвета, типографика, адаптивная сетка
│   └── features/
│       ├── map/                   # Карта, метки, масштаб, координаты, картинка
│       ├── building/              # Строительство, выбор размера, каталог цен
│       ├── residents/             # Жители, потребности и сценарные реплики
│       ├── advisor/               # Советник и поиск лучшего участка
│       ├── report/                # Итоги, сравнение альтернативы, экспорт
│       ├── progress/              # Бюджет, показатели и пять дней
│       ├── storage/               # Сохранение и загрузка игры
│       ├── help/                  # Инструкция и новая игра
│       └── agent-tools/           # Необязательная интеграция WebMCP
├── tests/game.test.cjs            # Проверки модели, 243 стратегии
├── КОМАНДА.md                     # Кто что меняет и как объединяться
└── README.md

В каждой папке функции есть своя краткая инструкция README.md. CSS отделён там, где у функции есть собственное оформление. Небольшие блоки без своего оформления используют shared/style.css.

Распределение на троих

  • Участница 1: карта и оформление — features/map/, shared/.
  • Участница 2: строительство, жители, показатели — features/building/, features/residents/, features/progress/.
  • Участница 3: советник, отчёт, сохранения, помощь — features/advisor/, features/report/, features/storage/, features/help/.

Одна выбранная участница собирает итог. Только она меняет общий index.html, core/ и порядок подключений. Подробнее — КОМАНДА.md.

Как связаны функции

Каждая функция регистрирует фабрику GameFeatures.имя = function(ctx) { ... }. core/app.js создаёт одно общее состояние и передаёт его через ctx всем функциям.

  • ctx.state.decisions — принятые решения; null означает пропуск дня.
  • ctx.staged — предпросмотр, деньги ещё не потрачены.
  • ctx.tier — выбранный размер: 0, 1 или 2.
  • ctx.inspected — номер выбранного дома, от 0 до 11.
  • ctx.render() — перерисовать все блоки.
  • ctx.afterDecision(message) — сохранить решение и обновить страницу.
  • City.place(state, {x, y, tier}) — проверить решение и вернуть новое состояние.

Нельзя создавать отдельную копию бюджета внутри модуля. Вызов City.place валидирует свободный участок, размер, деньги и число дней. HTML-шаблоны содержат только контролируемые проектом тексты; если позже появится ввод пользователя или ответ AI, выводите его через textContent, а не innerHTML.

Модель карты

Картинка — реальный статичный снимок карты от 25 марта 2025 года, а не актуальная GIS-система. Метки и радиусы условные. map/config.js задаёт положение каждой игровой точки в процентах изображения. Плюсы — разрешённые игровые точки, не подтверждённые свободные земельные участки.

Радиус измеряется в игровых единицах: одна единица = 12,5% ширины и высоты картинки. Охват считается по прямой между нормализованными координатами, не по дорогам. Круг радиуса использует ту же геометрию. Метки и карта увеличиваются в одной системе координат.

У каждого дома 20 базовых баллов + 16 за каждую из 5 услуг. Индекс города — среднее по 12 домам, в каждом условно по 40 жителей. Если вместимость исчерпана, обслуживаются ближайшие дома. При равном расстоянии приоритет у меньшего номера дома.

Советник перебирает доступные участки для выбранного размера. Итоговая альтернатива перебирает перенос одного объекта без изменения расходов и не меняет исходный город.

Из-за изменения геометрии сохранения имеют новый ключ astana-map-builder-v3. Сохранения предыдущей версии не удалены, но не загружаются в карту с новой моделью.

Проверка после изменения

Без инструментов: открыть игру → выбрать участок → изменить размер → проверить предпросмотр → построить → проверить бюджет → отменить → пройти пять дней → открыть альтернативу и отчёт → обновить страницу, убедиться, что город сохранён.

Если установлен Node.js, из папки проекта выполнить:

node tests/game.test.cjs

Тесты проверяют размещение, радиус, вместимость, 243 комбинации размеров, отсутствие перерасхода, лимит пяти дней, сохранения, альтернативный расчёт и наличие подключённых файлов.

Карта и атрибуция

Файл: dist/features/map/assets/astana-map.jpg. Автор изображения: Sj1mor. Дата: 25.03.2025. Источник: https://commons.wikimedia.org/wiki/File:OSM_Astana_central_map.jpg Лицензия: CC BY-SA 4.0, https://creativecommons.org/licenses/by-sa/4.0/ Данные карты: © OpenStreetMap contributors, https://www.openstreetmap.org/copyright

Оригинальный JPEG не редактировался; в игре он масштабируется, поверх отображаются отдельные интерактивные игровые метки. Производное визуальное представление карты с наложениями доступно на условиях CC BY-SA 4.0. Сохраняйте атрибуцию при распространении и демонстрации.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
6
Авторы
4
Файлы
5
Ветки
2

Авторы коммитов

aruzanbolatova 3ardak2020aktau-star 1Aruzhanbolatova 1whoisaii 1

История коммитов

  • 2026-09-23 17:26Add AI city advisor backendardak2020aktau-star
  • 2026-09-23 16:22main aiymwhoisaii
  • 2026-09-23 17:54Add game-style Astana maparuzanbolatova
  • 2026-09-23 17:02Merge pull request #1 from BAITC-Hacks/aruzhan-mapAruzhanbolatova
  • 2026-09-23 16:21Replace MVP with new Astana city simulatoraruzanbolatova
  • 2026-09-23 15:19Implement initial Akim city simulator MVParuzanbolatova
Структура репозитория (5 файлов)
.gitignore
README.md
server.py
tests/game.test.cjs
КОМАНДА.md
Ветки (2)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.