267 lines
26 KiB
Markdown
267 lines
26 KiB
Markdown
\mainpage
|
||

|
||
# NeurOX: Крестики‑нолики с ИИ или войти в IT
|
||
|||
|
||
|-:|:-|
|
||
|**Документация:** | [https://neurox.su](https://neurox.su) |
|
||
| **Блог:** | [https://felexdev.ru](https://felexdev.ru) |
|
||
|
||
## Цель проекта
|
||
|
||
Разработка экосистемы многопользовательской игры крестики-нолики в классическом исполнении с полным стеком технологий от С до Android и Web.
|
||
|
||
## Для кого этот проект
|
||
* **Для своих детей** — наследие, объяснение основных парадигм и принципов программирования.
|
||
* **Для себя** — восстановление навыков.
|
||
* **Для остальных** — подойдёт для изучения новичкам.
|
||
|
||
## Парадигмы
|
||
|
||
* **KISS** — должен оставаться донельзя простым для понимания.
|
||
* **YAGNI** — время и ресурсы дороже излишеств.
|
||
|
||
## Технологии
|
||
|
||
### Сервер
|
||
|
||
**Back-end Core (C)**
|
||
* **Игровой движок** — базовая логика игры: проверка ходов, определение победы/ничьей, управление состоянием доски 3×3.
|
||
* **Нейросеть 9-18-9** — ИИ‑противник: полносвязная сеть (9 входных нейронов — состояние доски, 18 скрытых, 9 выходных — оценка ходов). Обучается на партиях.
|
||
* **TCP/IP со сквозным шифрованием** — защищённая передача данных между клиентом и сервером (RSA + XOR).
|
||
* **Аллокатор** — кастомное управление памятью для повышения производительности и контроля утечек.
|
||
* **Очереди** — буферизация и синхронизация входящих/исходящих сообщений между потоками.
|
||
|
||
**Back-end Web (PHP + CodeIgniter)**
|
||
* **NGINX** — веб‑сервер для статического фронтенда (HTML/CSS/JS) и проксирования.
|
||
* **PHP + CodeIgniter** — бэкенд веб‑интерфейса и «мост» между веб‑клиентом (JS) и C‑ядром. Обрабатывает AJAX‑запросы, передаёт команды в ядро через Unix‑сокеты/пайпы, возвращает ответы в формате JSON.
|
||
* **MySQL** — хранение данных пользователей, статистики игр, логов. Используется веб‑сервером для отображения информации.
|
||
|
||
**Front-end (Web)**
|
||
* **HTML/CSS** — структура и визуальное оформление веб‑версии игры: доска, кнопки, индикаторы.
|
||
* **JavaScript** — интерактивность веб‑интерфейса: обработка кликов, обновление доски, анимация ходов, связь с сервером через AJAX/WebSocket.
|
||
|
||
### Клиент
|
||
* **Core (С-ядро):**
|
||
* **XOGame** — оффлайн игровая логика (проверка ходов, определение победы);
|
||
* **NeurOXNet** — нейросеть (обучается на игре против пользователя);
|
||
* **epoll** — сетевая коммуникация (TCP/IP, Linux/Android);
|
||
* **WSAPoll+IOCP** — сетевая коммуникация (TCP/IP, Windows);
|
||
* **SQLite** — хранилище локальных настроек интерфейса, весов нейросети.
|
||
* **GUI:**
|
||
* **PC‑Desktop** — нативное приложение с графическим интерфейсом на базе SFML (Simple Fast Media Library);
|
||
* **Android — Kotlin + Jetpack** — мобильная версия игры с реактивным UI на базе Jetpack Compose:
|
||
* **ViewModel** — управление состоянием UI и бизнес‑логикой;
|
||
* **Репозиторий** — абстракция доступа к данным (локальные данные + сетевые запросы);
|
||
* **Data Binding** — синхронизация данных между UI и ViewModel.
|
||
|
||
### Инфраструктура
|
||
* **Postfix** — почтовый сервер для отправки уведомлений (подтверждение регистрации, напоминания о ходе игры).
|
||
|
||
## Оборудование
|
||
|
||
* **Сервер:**
|
||
* OS: Ubuntu Server 24.04;
|
||
* CPU: Intel Core i5‑3470, 4 @ 3.2 GHz;
|
||
* RAM: 8 GB;
|
||
* ROM: noname 256 GB SSD;
|
||
* WiFi: 2.4 GHz, прямая видимость до 6 м (~32 Mbit/s).
|
||
|
||
* **Рабочая станция (ПК):**
|
||
* OS: Windows 10;
|
||
* CPU: Intel Core i5‑3470, 4 @ 3.2 GHz;
|
||
* RAM: 16 GB;
|
||
* ROM: noname 256 GB SSD.
|
||
* WiFi: 2.4 GHz, прямая видимость до 6 м (~32 Mbit/s).
|
||
|
||
* **Ноутбук:**
|
||
* OS: Dual boot (Windows 10 / Ubuntu 24.04);
|
||
* CPU: noname AMD‑Like, 4 @ 1.6 GHz;
|
||
* RAM: noname 16 GB;
|
||
* ROM: noname 1 TB SSD.
|
||
|
||
* **Смартфон:**
|
||
* Модель: Xiaomi Redmi Note 14 Pro;
|
||
* OS: HyperOS 3.0.5.0 (Android 14);
|
||
* CPU: MediaTek Helio G100, 8 @ 2.2 GHz;
|
||
* RAM: 12 GB;
|
||
* ROM: 512 GB SSD.
|
||
|
||
## Стандарты и спецификации
|
||
|
||
* **C11** (ISO/IEC 9899:2011) — для C‑ядра и десктоп‑клиента.
|
||
* **C++11** (ISO/IEC 14882:2011) — для десктоп‑клиента (SFML).
|
||
* **POSIX** — поддержка Unix‑подобных систем (Linux/Android):
|
||
* `epoll` — асинхронный ввод‑вывод для масштабирования сервера;
|
||
* `pthreads` (POSIX Threads) — управление потоками.
|
||
* **WinAPI** (Windows Vista+) — поддержка Windows‑платформы:
|
||
* **WSAPoll** — асинхронный ввод‑вывод (аналог POSIX `poll()`, доступен с Windows Vista);
|
||
* **Windows Threads** — управление потоками в Windows.
|
||
* **Компиляторы:**
|
||
* **GCC 9+** (Linux) — компиляция C‑ядра и десктоп‑клиента;
|
||
* **Clang 11+** (Android NDK) — компиляция C‑библиотеки для Android;
|
||
* **MSVC 2019+** (Visual Studio) — компиляция Windows‑версии клиента и сервера.
|
||
* **CMake:**
|
||
* **3.16+** (Linux/Windows) — единая система сборки для десктоп‑платформ;
|
||
* **3.11+** (Android) — сборка C‑ядра через Android NDK (официальная поддержка NDK, Clang, ABI).
|
||
|
||
## Инструменты
|
||
* **IDE:**
|
||
* **Visual Studio Code** — Linux, PHP, HTML/CSS, JavaScript, SQL;
|
||
* **Visual Studio** — Windows;
|
||
* **Android Studio** — Android.
|
||
* **Системы сборки:** CMake, Make.
|
||
* **Препрофилирование:** YandexGPT 5.1 Pro (Алиса AI).
|
||
* **Code review:** YandexGPT 5.1 Pro (Алиса AI).
|
||
* **Техническая документация:** Doxygen, JSDoc, PHPDoc.
|
||
* **Контроль версий:** Git.
|
||
|
||
## Прогресс
|
||
| Статус | Задача | Описание | Дата |
|
||
|:------:|:--------------------|:--------------------------------------------------------|:----------:|
|
||
| ➤ | **UX-исследование** | Оптимизация Doxygen | |
|
||
| ✅ | **CI/CD** | Опубликован блог **felexdev.ru**(автодеплой). | 21.05.2026 |
|
||
| ✅ | **CI/CD** | Опубликована документация на **neurox.su**(автодеплой). | 21.05.2026 |
|
||
| ✅ | **Документация** | Оптимизация Doxygen | 15.06.2026 |
|
||
|
||
Подробный прогресс: [PROGRESS.md](PROGRESS.md)
|
||
|
||
## Статус
|
||
**В активной разработке**
|
||
|
||
## План реализации
|
||
|
||
**Принцип планирования:**
|
||
* работа ведётся небольшими сессиями (30–60 минут) в свободное время;
|
||
* приоритет — последовательность, а не скорость;
|
||
* гибкость: этапы могут меняться местами, оставаясь в основной логике процесса.
|
||
|
||
### Этап 1. Инфраструктура — 2–4 недели
|
||
* DNS: felexdev.ru + neurox.su;
|
||
* NGINX: сайт‑заглушка;
|
||
* Postfix: SPF/DKIM/DMARC;
|
||
* MySQL;
|
||
* тестирование инфраструктуры.
|
||
|
||
### Этап 2. Ядро на C (логика + нейросеть) — 3–4 месяца
|
||
* аллокатор (возможность делегирования блоков между потоками);
|
||
* очередь пакетов/сообщений, синхронизация (двунаправленная на базе списка);
|
||
* базовая логика игры (3×3 доска, проверка победы);
|
||
* простая нейросеть (3 слоя, сигмоида/ReLU, обучение на 100+ партиях);
|
||
* модуль взаимодействия с СУБД (MySQL);
|
||
* пакетная передача TCP/IP со сквозным шифрованием (RSA + XOR);
|
||
* контроль активности соединения средствами ICMP (ping).
|
||
|
||
### Этап 3. Сервер на PHP (API + БД) — 2–3 месяца
|
||
* интеграция с ядром через Unix‑сокеты/пайпы.
|
||
|
||
### Этап 4. Десктоп‑клиент (C++/SFML) — 3–4 месяца
|
||
* базовый UI (доска 3×3, кнопки);
|
||
* связь с сервером по TCP/IP;
|
||
* анимация ходов и победы;
|
||
* игра с локальным ИИ (нейросеть).
|
||
|
||
### Этап 5. Android‑клиент (Kotlin + NDK) — 4–6 месяцев
|
||
* доска 3×3 и связь с сервером;
|
||
* вызов C‑библиотеки через JNI;
|
||
* оптимизация под мобильные устройства.
|
||
|
||
### Этап 6. Интеграция и тестирование — 2–3 месяца
|
||
* синхронизация состояния между десктопом и Android;
|
||
* стресс‑тест (10+ одновременных игр);
|
||
* отладка многопоточности;
|
||
* финальная оптимизация.
|
||
|
||
### Этап 7. Релиз — 1 месяц
|
||
* сборка дистрибутивов (Windows, Linux, Android);
|
||
* документация для запуска;
|
||
* публикация демо‑видео.
|
||
|
||
## Дисклеймер
|
||
* В коде может, вернее — будет, использоваться неочевидная логика.
|
||
* Если вы считаете, что я где‑то что‑то сделал не по фэн‑шую,— я эстет, но в плане эффективности.
|
||
* Если когда‑нибудь кто‑нибудь найдёт совпадение названия проекта и репозитория нарушением авторских прав — Бог Вам судья! 😃
|
||
* Проект личный, код открытый, милости просим, заходите и смотрите.
|
||
* **Никогда, ни в коем разе не верьте ИИ, они изворачиваются и врут несмотря на то что вы их предупреждаете! ВСЕ!!! [почему_я_не_верю_ии.zip](https://drive.google.com/file/d/1IaYQl4TBFplYMidjAahn_NKzQrAS-rW7/view?usp=sharing)(Спасибо друзьям)**
|
||
|
||
|
||
## Лицензия
|
||
|
||
Apache License 2.0 — код открыт для изучения.
|
||
|
||
## Контакты
|
||
* Сайт разработчика: [felexdev.ru](https://felexdev.ru)
|
||
* VK: [felexdev.neurox](https://vk.com/felexdev.neurox)
|
||
* felexdev.ru: [felex67](https://felexdev.ru/git/felex67)
|
||
* GitHub: [felex67](https://github.com/felex67)
|
||
* Email: <a href="mailto:admin@felexdev.ru">admin@felexdev.ru</a>, <a href="mailto:felexxx67@yandex.ru">felexxx67@yandex.ru</a>
|
||
|
||
# Лирическое отступление
|
||
К каждому из модулей будет приложено своё "лирическое отступление" в формате дневника процесса разработки(DIARY.md) сплошным потоком мыслей в обычном разговорном стиле. Целью такого формата является продемонстрировать как происходит собственно сам процесс разработки от и до без захламления технической документации. В коде иногда можно будет встретить сноски на эти самые дневники. В корневом DIARY.md будут отражены мысли масштаба проекта в целом(взаимодействие компонентов и всей экосистемы в целом). Вся техническая документация заполняется по мере готовности того или иного модуля по следующим принципам: **мысль ↔ дневник ↔ код → комментарии → тесты → профилирование(по возможности) → документация**.
|
||
|
||
### ИИ аспект
|
||
Начиная с истоков увлечения программированием привык полагаться на результаты работы кода — профилирование и тесты. Как у борца за эффективность у меня нет нежелания заниматься рефакторингом ради рефакторинга, по-этому на данном этапе своей жизни используюю ИИ в первую очередь для препрофилирования нагрузок и определения узких мест на стадии разработки архитектуры. Считаю что от этого зависит львиная доля успешности проекта в принципе, так как если на скорую руку спроектировать, то даже самые опытные разработчики не помогут, собственно после такого подхода и начинается описанный выше рефакторинг.
|
||
|
||
Единственным моим ассистентом-специалистом по части критики и статистики является YandexGPT 5.1 Pro(АлисаAI). Порой наши многочасовые споры выматывают, но она очень помогает в следующих аспектах:
|
||
* Сбор статистики по типовым нагрузкам на стадии проектирования.
|
||
* Анализ кода в части читаемости, т.к. проект публичен.
|
||
* Анализ кода в формате Code-review, практическая польза:
|
||
* дисциплинирует, код всегда должен оставаться чистым.
|
||
* подготовка ко входу в реальную разработку с живой командой, моя основная цель - карьера в IT.
|
||
* даже топовые специалисты могут допускать казалось бы очевидные ошибки, когда мысли летят одна за другой их можно попросту не заметить.
|
||
* Даёт понимание алгоритмов и шаблонов работы ИИ при статическом анализе кода.
|
||
|
||
Что я понял за время общения с ней(YandexGPT АлисаAI):
|
||
* Никогда не верьте ИИ "на слово", как бы он Вас не уверял что больше такого не повторится, он всё понял, и глупых вопросов больше не последует.
|
||
* Никогда не следуйте подсказкам ИИ(так лучше) если понимаете что это Вам не нужно, очень часто ИИ "зацикливается" сам на себя(пока непонятно почему, но мы это выясним).
|
||
* 10, а лучше 100 раз переспросите с разных сторон(задавайте вопросы в разных вариациях до тех пор пока ответ не будет однозначным).
|
||
* Даже если Вам кажется что ИИ дал ±точный ответ — переспросите ещё раз.
|
||
* Не пытайтесь доказать ИИ что Вы — "не олень", он этого не оценит.
|
||
* Предлагая ИИ оценить написанный код будьте готовы к тому что Вас разнесут в пух и прах по тем аспектам где ответственность кода заканчивается(принцип SRP), у ИИ галочка на расширяемость и проверки(NULL-sfety, неявные проверки они попросту не видят), вернее не "галочка" а "ГАЛИЩЕ", KISS+YAGNI им надо явно объяснять в комментариях, хотя даже после этого они в ответе выкатят здоровенный список "недостатки".
|
||
* ИИ - это инструмент технического анализа по "устоявшимся" шаблонам, каждое неординарное решение сразу попадает в "недостатки". ИИ не видит "замысел", только разрозненные шаблоны и маркеры.
|
||
|
||
Мне очень поднимают настроение многочасовые баталии с ней, однако, это отвлекает от сути. Каждый раз когда я в итоге довожу YandexGPT 5.1 Pro(АлисаAI) до стадии "Да, Вы правы..." в коде я оставляю комментарии сгенерированные ею для неё же и помечаю их как "комментарии от YandexGPT 5.1 Pro(АлисаAI)". Очень часто в коментариях к коду можно встретить объяснения такого рода "АлисаAI настояла" в тех местах где наши мнения расходились но я пошёл на компромисс.
|
||
|
||
### Основной посыл
|
||
|
||
Хоть проект изначально и предполагался как портфолио, в нынешнем своём состоянии он представляет из себя немного больше. Скорее это рассказ о том "как это было". Проект постепенно перерос в своеобразную "историю жизни", это неординарный подход к разработке, но ввиду того что я веду проект один и коллаборация не предполагается, я продолжу в том-же духе, в первую очередь — для своих детей, им интересно это читать, а мне не то чтобы не сложно, а скорее — приятно писать для них. Таким образом я чувствую себя причастным ко вкладу в искусство и к произведению "История одного байта", которое давным давно глубоко запало мне в душу и многому научило с философской точки зрения.
|
||
|
||
### Образовательный аспект
|
||
Проект открыт для изучения, как автор — не претендую на звание "разработчик года", отнюдь, считаю что всегда есть куда идти, даже топовым кодерам, но точно знаю что некоторые техники встречающиеся в коде помогут малоопытным или "смежным" специалистам понять всю красоту низкоуровнего программирования, возможно, перенять некоторые практики и применять их в дальнейшем. Весь код будет снабжён "удобоваримыми" коментариями для специалистов всех уровней и языковых групп(имеется в виду группы языков программирования).
|
||
|
||
### Основная стратегия KISS+YAGNI
|
||
Я не предусматриваю грандиозное расширение, проект должен обеспечить максимальную производительность и отказоустойчивость для классических крестиков-ноликов в многопользовательском режиме с возможностью игры против ИИ(нейросети). Как основатель проекта я не предполагаю увеличивать размер поля до MAX_INT*MAX_INT и заниматься безопасностью ради безопасности. Каждый модуль проекта имеет строго свою область ответственности.
|
||
|
||
### Начата разработка общих модулей.
|
||
#### XOGame
|
||
Разработана типичная архитектура со скрытой реализацией и заложенной возможностью изменения поведения модуля через указатели на структуры. Как и обычно(не раз проверено) внешний интерфейс константен, доступ к функциям модуля только через указатели внутри внешних неизменяемых структур. Почему именно так — потому что так проще отловить ошибки, проверяем только внутреннюю реализацию, отлаживаем её и используем. Если в дальнейшем возникают ошибки - это не вина модуля, это вина вызывающего кода. В контексте всего решения это избавляет от рефакторинга ради рефакторинга и бесконечной скачки от файла к файлу.
|
||
|
||
После предоставления кода **xogame/includes/XOGame.h**, **xogame/headers/_XOGame.h** и **xogame/src/XOGame.c** на ревью YandexGPT 5.1 Pro(АлисаAI) и 4-хчасовой баталии по поводу **void* fxalloc(size_t _NBytes)** решено пока что "забыть" про реализацию XOGame.c и заняться аллокатором **fxalloc.c**, иначе я не выдержу, порой она достаёт "до чёртиков" 😃
|
||
|
||
#### FXAlloc
|
||
Спректирован аллокатор. Модуль аллокатора вынесен в отдельный репозиторий [fxalloc](https://felexdev.ru/git/felex67/fxalloc)
|
||
|
||
### 26.04.2026
|
||
Сломал Алису попросив оценить расчёты:
|
||
| Параметр | Формула | Лимит guiuser-ов | Описание |
|
||
|---------:|:--------------------------:|:----------------:|:-------------------------------------|
|
||
|**Wi-Fi:**| $⌈\frac{85,3×10^6}{25×8}⌉$ | 426 500 | Не то что бы много, но дох-х-ходчиво |
|
||
|
||
### 28.04.2026
|
||
|
||
#### Расчёт железяков:
|
||
| Ракурс | Гипотетический максимум гуюзеров | Вывод |
|
||
|-----------:|:--------------------------------:|:----------------------------------------------------------|
|
||
| **Wi-Fi:** | $163961$ | Наш сервер этого никогда не увидит, но, наверное, потянет |
|
||
| **CPU:** | ∞ | Набрался опыта, теоретический предел недостижим |
|
||
| **RAM:** | $~12×10^9$ | Так себе, могла бы и больше |
|
||
| **OSь:** | 200k | Пингвин Tux прокачан, проблем не предвидится |
|
||
| | **YandexGPT 5.1 Pro(АлисаAI)©** | ← Строки ниже писала она, автор ни при чём =D |
|
||
| **ССД:** | ∞ TB | Забыл, где положил половину данных |
|
||
|
||
[Продолжение](https://felexdev.ru/git/felex67/fxalloc/src/branch/main/DIARY.md/#расчёт-железяков)
|
||
|
||
#### Промпт(оригинал):
|
||
> Алиса, оцени пожалуйста юмор и сделай расчёты:
|
||
> Кастуем заклинание "Алиса", скармливаем ей полезную нагрузку пакета 24 байта, название железяки Intel Core i5-3470 и недожелезяки RAM: 8 GB, спрашиваем сколько розеток переварит один поток epoll с последующим их копированием в очередь без оглядки на nofile, жги по-полной в режиме телепорта битов!
|
||
|