AAYMA
RU
Войти

QALA

Пошаговый изометрический симулятор управления Астаной: игрок за 5 ходов распределяет 100 единиц бюджета по 14 мерам и 5 районам и получает Astana…

Доведённый продукт
Команда «Söz» 3💬 0 комментариевс 8 сентября 2026 г.

О проекте

Команда: Söz
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт

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

Суть

Пошаговый изометрический симулятор управления Астаной: игрок за 5 ходов распределяет 100 единиц бюджета по 14 мерам и 5 районам и получает Astana Quality of Life Score с разбором по каждому показателю.

Как устроено

Чистый модуль src/game/engine.ts валидирует решения (ровно 5 уникальных мер, не более 2 в направлении, конфликты) и считает показатели по формуле clip(база + Σэффект×(8−лаг)/8 + синергии), затем районный балл по весам, городской по долям населения и Score = 0.7×город + 0.3×слабейший район − штрафы за показатели ниже 40. Вклад каждой меры раскладывается по Шепли, советник ищет план лучевым перебором (до 180 промежуточных планов на шаг). Интерфейс на React + Canvas (IsoCity), всё упаковано в один офлайн-HTML; опционально LLM-объяснения через локальный сервер.

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

  • распределение Шепли
  • лучевой поиск плана (до 180 кандидатов)
  • детерминированная формула Score с лагами и синергиями
  • rule-based советник
  • JSON Schema контракты AI
  • Playwright e2e

Особенности

Прозрачная модель: вклады мер по Шепли складываются ровно в изменение Score, базовое значение 52.55768 и пример организаторов (56.54307) пересчитываются из данных; вся игра работает офлайн одним HTML-файлом, есть «Лаборатория сценариев» для изменения бюджета и добавления своих мер, интерфейс на 3 языках.

Стек

TypeScript · React · Vite · Canvas (IsoCity) · Phaser · Node.js · Playwright · GitHub Actions

Модели

OpenAI (опционально)


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

README

README.md

QALA

Астана

Большой город. Пять решений.

Пошаговый симулятор управления городом.

Русский · English · Қазақша

Играть офлайн · Запустить проект · Инструкция для агента · Демо за две минуты

100 единиц бюджета · 5 решений · 5 районов · 14 мер · 3 языка

QALA — ваш город

Sauce Code · HackAlem AI 2026 · «Аким на 5 часов» · Astana Innovations

Город — это люди

Построить парк кажется простым решением. Пока не выясняется, что тот же участок нужен школе, новому району не хватает поликлиники, а бюджета должно хватить на пять решений.

QALA превращает таблицу городских показателей в понятную стратегическую игру. Изучайте районы, выбирайте карточки проектов и заранее смотрите последствия. В конце получите Astana Quality of Life Score с разбором до каждого показателя.

От Civilization — исследование районов. От Balatro — карточки и синергии. От Plague Inc — наглядные последствия. Математика соответствует выданному датасету.

Начните за 30 секунд

  1. Скачайте play/QALA.html кнопкой Download raw file на GitHub или скачайте ZIP репозитория.
  2. Откройте файл в современном браузере. Установка, интернет, аккаунт и API-ключ не нужны.
  3. Познакомьтесь с Айдой, выберите район, изучите прогноз и примите первое решение. Русский язык включён по умолчанию; EN и ҚАЗ доступны в игре.

Код, Canvas-рендерер, стили, данные и изображение включены в один HTML. Офлайн работает даже при первом открытии. Город использует Canvas и не требует WebGL. Текущая партия сохраняется в браузере, если его настройки разрешают; результат можно экспортировать в JSON.

Для разработки нужен Node.js 22.18+:

npm ci
npm run demo
npm run check       # Тесты, TypeScript и сборка
npm run test:e2e    # Браузерные сценарии, офлайн и мобильная версия
npm run package    # Готовый play/QALA.html

При необходимости установите тестовый браузер: npx playwright install chromium. Интернет нужен для установки зависимостей, но не для готовой игры.

Откройте http://localhost:8789. demo собирает игру и запускает локальный сервер с опциональным AI. .env не обязателен. Для разработки с горячим обновлением используйте npm run dev и адрес из терминала.

Для coding agent: начните с AGENTS.md. Там команды запуска, проверочные значения, границы модулей и работа с ключами. Пошаговый запуск и диагностика.

Что умеет QALA

  • Изометрическая сцена на основе IsoCity: пять районов из датасета, шесть узнаваемых зданий Астаны, движение машин, автобусов и пешеходов, масштабирование, день/ночь и видимые изменения после решений.
  • Обучение с Айдой прямо в первом ходе: выбрать потребность → проверить прогноз → принять решение → понять результат. Можно пропустить или пройти заново.
  • На основном экране — город, три варианта и компактная подсказка Айды с переходом к прогнозу. Книга, история и настройки собраны в «Кабинете мэра».
  • Достижения за устранение критических проблем, синергию и улучшение всех районов; скрытых бонусов к баллу нет.
  • Книга мэра: восемь оригинальных советов, связанных с игровыми мерами.
  • Четырнадцать карточек с ценой, задержкой, эффектом за два года и выбором района.
  • Пять ходов, контроль бюджета, запрет конфликтов, отмена последнего решения и защита от невозможности завершить партию.
  • Три синергии: полосы + светофоры, освещение + обращения, чистое топливо + зелёный пояс.
  • Прозрачный отчёт: средний балл, слабейший район, штрафы, все 50 показателей и вклад каждой меры.
  • Локальный советник, сохранение до десяти сценариев, сравнение и экспорт JSON.
  • Русский, английский и казахский интерфейсы; опциональное объяснение от LLM.

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

ИнструментЧто он даёт мэру
Паспорт районаДоля населения, все 10 показателей до и после, критический порог 40
График проблемВидно, какой дефицит по показателям до порога 40 остался и какой удалось закрыть
Сравнение и матрицаИзменения пяти районов и все 50 показателей рядом, без скрытых агрегатов
Вклад каждой мерыТочное распределение Шепли: вклады складываются в общее изменение Score до округления
Поиск планаСоветник перебирает допустимые продолжения и предлагает лучший найденный вариант
Открытая модельТекущие слагаемые формулы, веса, лаги, доли населения, синергии и ограничения

Поиск сохраняет уже принятые решения, на каждом шаге удерживает до 180 промежуточных планов и показывает число проверенных вариантов. Найденную меру можно сначала рассмотреть. Программа не расходует бюджет автоматически и не объявляет результат доказанным глобальным оптимумом.

Лаборатория сценариев

Откройте Кабинет мэра → Лаборатория сценариев или значок изменения лимита у бюджета. Здесь можно изменить бюджет от 1 до 1 000, число решений от 1 до 10 и добавить собственную проблему с мерой: описание, цена, задержка, районный или городской охват, положительные и отрицательные эффекты.

Статистика районов, график проблем, матрица и формула пересчитываются вместе. Если уменьшить лимит ниже уже потраченного, прогноз остаётся виден, а нарушение правил объясняется. Эксперимент хранится отдельно и экспортируется как песочница.

Конкурсная партия сохраняет 100 единиц и ровно пять решений. Лаборатория не меняет её сохранение, архив или официальный AI-контракт. Эффекты собственной меры — допущения автора, а не подтверждённые городские данные. Идеи аналитики и экспериментов перенесены из прототипа коллеги akim_5_hr; что и почему интегрировано.

Аналитика районов и открытый расчёт

Посмотреть матрицу и расчётную модель

Матрица показателей: до и после

Откуда берётся балл

Астана, которую узнаёшь

Используются реальные модули отрисовки и графические ресурсы IsoCity под MIT. Все нужные файлы включены в офлайн-сборку, авторство сохранено. Ось Хан Шатыр — Бәйтерек — Ақорда и переход через Есиль к Пирамиде помогают узнать город. Интеграция и лицензия · Географические ориентиры.

Бәйтерек, Ақорда, Хан Шатыр, мечеть Әзірет Сұлтан, Дворец мира и согласия и Нұр Әлем нарисованы как отдельные игровые спрайты. Застройка различается по кварталам: старый город, современная левая сторона, набережные, дворы и район EXPO. Машины, автобусы и пешеходы используют единый визуальный стиль и движутся по связанным улицам и тротуарам. Набережные, мосты, жилые дворы и площади формируют город. Новые здания занимают участки района; отмена восстанавливает прежнюю застройку. Визуальные эффекты иллюстрируют решения, а расчёт остаётся воспроизводимым.

Знакомство с советником

Советы в книге мэра — оригинальные тексты QALA по темам «100 советов мэру» Ильи Варламова и Максима Каца (2020). Предоставленный фрагмент содержит вступление и оглавление, а не полные главы. PDF книги не публикуется в репозитории.

Книга мэра

Правила без скрытой магии

У всех 100 единиц бюджета и одинаковые синтетические данные. Нужно ровно пять уникальных мер, не более двух в одном направлении. Районная мера требует район; городская действует везде. Несовместимости проверяются автоматически. Остаток бюджета не даёт бонуса.

Каждый ход — выбор, а не прошедший квартал. Горизонт всех мер — восемь кварталов, поэтому порядок решений не меняет результат.

Показатель = clip(база + Σ эффект × (8 − лаг) / 8 + синергии, 0, 100)
Район      = Σ вес показателя × показатель
Город      = Σ доля населения × балл района
Score      = 0.7 × город + 0.3 × слабейший район − критические показатели

Критический показатель — строго ниже 40. Бонусы синергии фиксированы и не уменьшаются из-за лага. Невалидный набор не получает итоговый Score; до пяти решений показывается только прогноз.

База: 52.55768. Пример организаторов (M7 Нура, M8 Нура, M10 Нура, M12 город, M5 Сарыарка) стоит 95 и даёт 56.54307. Числа вычисляются из исходных показателей, а не подставляются.

Как устроен проект и где AI

React + TypeScript + Vite + IsoCity Canvas. Чистый модуль src/game/engine.ts валидирует решения и считает все числа. Интерфейс и карта читают его результат. База данных и CDN не нужны; сборка упаковывает приложение в один HTML.

Офлайн-советник использует правила, а не LLM. Он объясняет критические показатели и предлагает допустимый следующий ход по немедленному приросту Score. Это не доказанный глобальный оптимум.

Если игра уже запущена, откройте http://localhost:8789/#ai: форма ключа появится сразу, повторно запускать сервер не нужно. В офлайн HTML есть кнопка «Открыть AI-версию»; она открывает локальную игру в другой вкладке. У файла и localhost отдельные сохранения.

В обучении и панели советника можно опционально подключить API-ключ. Ключ сессии хранится только в памяти локального сервера до отключения или перезапуска; он не попадает в хранилище браузера, JSON или HTML. Подключение само по себе не вызывает платную модель. В офлайн-файле остаётся локальный анализ.

Разработчики могут использовать .env для подключения Jev и LLM:

cp .env.example .env
# TYPESAFE_API_KEY — выбор Jev; OPENAI_API_KEY — объяснения OpenAI.
# Ключи только в .env, без префикса VITE_.
npm run demo

Откройте http://localhost:8789: Кабинет мэра → AI-советник → Получить совет. Можно подключить один или оба сервиса. Jev выбирает только из рассчитанных допустимых вариантов; OpenAI объясняет последствия. Сервер и браузер проверяют JSON Schema, а числа заново вычисляются движком. Предложение не принимается автоматически. При ошибке остаётся явно обозначенный локальный анализ.

Настраиваемые модели по умолчанию: jev-1.13.0 и gpt-4.1-mini. Ключи остаются на localhost-сервере и не попадают в офлайн-файл. Уверенность Jev не означает вероятность реального городского результата. Восемь схем и границы проверки.

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

Карта проекта

ФайлНазначение
src/game/engine.tsКонкурсные правила и точный расчёт
src/game/data.tsДатасет организаторов и тексты RU/EN/KK
src/game/planSearch.tsПоиск допустимого плана и вклады Шепли
src/game/sandbox.tsОтдельные правила лаборатории и пользовательские меры
src/components/MayorExperience.tsxИгровой цикл: прогноз → решение → последствия
src/components/CityAnalytics.tsxОбщая аналитика отчёта и лаборатории
schemas/ · server/Контракты AI, проверка ответов и локальное подключение
tests/Воспроизводимые проверки модели, API и браузера

Проверка и развитие

Тесты покрывают формулу, официальный пример, лаги, синергии, несовместимости, порог 40, все 120 перестановок примера и 60 воспроизводимых партий. Браузерные проверки проходят пять ходов, проверяют сохранение, экспорт, мобильный интерфейс, отсутствие WebGL и первый запуск HTML без сети.

npm run checkpoint проверяет проект, фиксирует завершённые изменения и отправляет их в командный репозиторий без force-push и пустых коммитов.

Данные синтетические; карта не повторяет реальные границы районов. Это учебная модель, не прогноз реальной Астаны. Следующие шаги: случайные события в лаборатории, реальные GIS-слои и общая таблица результатов.

План на пять часов · Модель · Демо для жюри · Исходный датасет

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

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

usernamx42 9Olzhas 3

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

  • 2026-09-23 17:56fix: allow ordinary navigation to the local game pageusernamx42
  • 2026-09-23 17:48docs: preserve team README edits alongside AI setup improvementsusernamx42
  • 2026-09-23 17:48fix: open AI setup directly and clarify local launch errorsusernamx42
  • 2026-09-23 17:39Update README.mdOlzhas
  • 2026-09-23 17:38Update README.mdOlzhas
  • 2026-09-23 17:30feat: integrate team analytics, scenario lab and plan search with Russian-first docsusernamx42
  • 2026-09-23 17:13feat: expand Astana and polish guided gameplay, AI setup and agent quick startusernamx42
  • 2026-09-23 16:47feat: build offline IsoCity Astana experience with guided decisions and typed AI adviceusernamx42
Все коммиты (12)
  • 2026-09-23 15:05feat: add living Phaser Astana, mayor onboarding and handbookusernamx42
  • 2026-09-23 14:27chore: polish verified core and document CI account blockerusernamx42
  • 2026-09-23 14:20feat: build QALA offline mayor simulation and trilingual pitchusernamx42
  • 2026-09-08 14:38Update README.mdOlzhas
Структура репозитория (121 файлов)
.env.example
.gitattributes
.github/workflows/check.yml
.gitignore
.prettierignore
.prettierrc.json
AGENTS.md
README.en.md
README.kk.md
README.md
README.ru.md
THIRD-PARTY-NOTICES.md
docs/AI-CONTRACTS.md
docs/ASSETS.md
docs/ASTANA-MAP.md
docs/CASE-AUDIT.md
docs/CITY-ART.md
docs/DEMO.md
docs/DESIGN.md
docs/EXPERIENCE-V3.md
docs/FINAL-HOUR.md
docs/ISOCITY.md
docs/MODEL.md
docs/NEXT-3-HOURS.md
docs/PLAN.md
docs/RUNBOOK.md
docs/TEAM-INTEGRATION.md
docs/VERIFICATION.md
docs/screenshots/ai-connection.png
docs/screenshots/analytics-mobile-ru.png
docs/screenshots/analytics-ru.png
docs/screenshots/briefing-en.png
docs/screenshots/city-en.png
docs/screenshots/city-kk.png
docs/screenshots/city-ru.png
docs/screenshots/finale-en.png
docs/screenshots/handbook-en.png
docs/screenshots/matrix-ru.png
docs/screenshots/mobile-kk.png
docs/screenshots/model-ru.png
docs/screenshots/night-en.png
docs/screenshots/onboarding-en.png
docs/screenshots/plan-search-en.png
docs/screenshots/policy-preview.png
docs/screenshots/report-en.png
docs/supplied-dataset.ru.txt
index.html
package-lock.json
package.json
play/QALA.html
playwright.config.ts
schemas/advisor-narration.schema.json
schemas/advisor-request.schema.json
schemas/advisor-response.schema.json
schemas/decision-event.schema.json
schemas/decision.schema.json
schemas/jev-request.schema.json
schemas/jev-response.schema.json
schemas/scenario.schema.json
scripts/capture.mjs
scripts/checkpoint.mjs
scripts/package.mjs
server/advisor.ts
server/decisionSupport.ts
server/sessionCredentials.ts
src/App.tsx
src/advisor-connection.css
src/analytics.css
src/assets/advisor-aida.png
src/assets/astana-key-art.png
src/assets/building-atlas.png
src/assets/city-life-atlas.png
src/assets/isocity/base.webp
src/assets/isocity/dense.webp
src/assets/isocity/manifest.json
src/assets/isocity/modern.webp
src/assets/isocity/parks.webp
src/assets/isocity/services.webp
src/assets/isocity/water.webp
src/assets/landmark-atlas.png
src/components/AdvisorConnection.tsx
src/components/CityAnalytics.tsx
src/components/GameStage.tsx
src/components/IsoCity.tsx
src/components/IsoCityPolicyArt.tsx
src/components/MayorExperience.tsx
src/components/MayorOnboarding.tsx
src/components/PhaserCity.tsx
src/components/PlanSearch.tsx
src/components/ScenarioLab.tsx
src/experience.css
src/game.css
src/game/adviceContract.ts
src/game/astanaMap.ts
src/game/cityScene.ts
src/game/data.ts
src/game/decisionSupport.ts
src/game/engine.ts
src/game/experience.ts
src/game/explanation.ts
src/game/handbook.ts
src/game/planSearch.ts
src/game/sandbox.ts
src/game/storage.ts
src/isocity.css
src/main.tsx
src/onboarding.css
src/plan-search.css
src/scenario-lab.css
src/style.css
tests/advisor.test.ts
tests/astanaMap.test.ts
tests/browser/game.spec.ts
tests/credentials.test.ts
tests/decisionSupport.test.ts
tests/engine.test.ts
tests/experience.test.ts
tests/planSearch.test.ts
tests/sandbox.test.ts
tsconfig.json
vite.config.ts
Ветки (2)

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

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

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