О проекте
Команда: 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-модель не подключена; советник алгоритмический, реплики сценарные.
Запуск без установки
- Распакуйте весь ZIP.
- Откройте
dist/index.htmlв браузере. - Не перемещайте один 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. Сохраняйте атрибуцию при распространении и демонстрации.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.