# NeurOX: Крестики‑нолики с ИИ или войти в IT

## Цель проекта

Разработка экосистемы многопользовательской игры крестики-нолики в классическом исполнении с полным стеком технологий от С до 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.

## Прогресс

| ➤  |**Работа с документами**      | Реорганизация документации, оптимизация каталогов проекта |
|:---:|:-----------------------------|:---------------------------------------------------------|
| ✅ | **Инфраструктура**           | Репозиторий переехал на свой сервер Gitea [felexdev.ru](https://felexdev.ru/git/).|
| ⚠️ | **Работа над аллокатором**   | Проектирование архитектуры.                               |
| ✅ | **Модуль игры**              | Архитектура спроектирована.                               |

Подробный прогресс: [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);
* документация для запуска;
* публикация демо‑видео.

## Дисклеймер

* В коде может, вернее — будет, использоваться неочевидная логика.
* Если вы считаете, что я где‑то что‑то сделал не по фэн‑шую — я эстет, но в плане эффективности.
* Если когда‑нибудь кто‑нибудь найдёт совпадение названия проекта и репозитория нарушением авторских прав — Бог Вам судья! 😃
* Проект личный, код открытый, милости просим, заходите и смотрите.


## Лицензия
Apache License 2.0 — код открыт для изучения.

## Контакты
* 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>

[felexdev_logo](logo/felexdev_logo.svg)

# Лирическое отступление
К каждому из модулей будет приложено своё "лирическое отступление" в формате дневника процесса раззработки(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**, иначе я не выдержу, порой она достаёт "до чёртиков" 😃

### 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               | Забыл, где положил половину данных                        |

[Продолжение](ccpp/fxalloc/DIARY.md/#расчёт-железяков)

#### Промпт(оригинал):
> Алиса, оцени пожалуйста юмор и сделай расчёты:
> Кастуем заклинание "Алиса", скармливаем ей полезную нагрузку пакета 24 байта, название железяки Intel Core i5-3470 и недожелезяки RAM: 8 GB, спрашиваем сколько розеток переварит один поток epoll с последующим их копированием в очередь без оглядки на nofile, жги по-полной в режиме телепорта битов!

