{"id":24530934,"url":"https://github.com/exsaron/renju-online","last_synced_at":"2026-05-20T09:11:24.821Z","repository":{"id":113192014,"uuid":"554580464","full_name":"exsaron/renju-online","owner":"exsaron","description":"Веб-реализация рендзю","archived":false,"fork":false,"pushed_at":"2024-04-20T10:51:18.000Z","size":9218,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-22T08:18:15.834Z","etag":null,"topics":["fastapi","sqlalchemy","websocket"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/exsaron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-20T03:26:02.000Z","updated_at":"2024-04-20T10:52:27.000Z","dependencies_parsed_at":"2025-01-08T09:36:32.950Z","dependency_job_id":null,"html_url":"https://github.com/exsaron/renju-online","commit_stats":null,"previous_names":["exsaron/renju-online"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Frenju-online","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Frenju-online/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Frenju-online/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Frenju-online/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/exsaron","download_url":"https://codeload.github.com/exsaron/renju-online/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243776442,"owners_count":20346351,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastapi","sqlalchemy","websocket"],"created_at":"2025-01-22T08:18:21.483Z","updated_at":"2026-05-20T09:11:19.794Z","avatar_url":"https://github.com/exsaron.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Renju Online\n\n\nВеб-реализация японской настольной логической игры [рендзю](https://ru.wikipedia.org/wiki/%D0%A0%D1%8D%D0%BD%D0%B4%D0%B7%D1%8E).  \n\n---\n\n- [Описание](#описание)\n- [Стэк](#стэк)\n- [Правила](#правила)\n- [Технические детали](#технические-детали)\n- [Иллюстрации](#иллюстрации)\n\n### Описание\n\n**Рендзю** - японская настольная логическая игра, представляющая собой в предельном упрощении спортивную вариацию крестиков-ноликов до 5 в ряд.  \nДанное приложение позволяет играть в рендзю онлайн с другими людьми.  \n\n### Стэк\n\n- FastAPI\n- PostgreSQL 14\n- SQLAlchemy 1.4/2.0 (asyncpg)\n- Alembic\n- WebSockets\n- AsyncIO\n- Pytest\n- Docker \u0026 docker-compose\n- Nginx\n- HTML / CSS / JavaScript\n\n### Правила\n\n- По умолчанию: крестики-нолики на поле 15х15; 2 игрока; для победы нужно собрать 5 камней в ряд.\n- С текущими модами игроков может быть 3, а поле - размера 30х30.\n- Сдача, выход или разрыв соединения после подтверждения готовности приводят к поражению.\n- Единственный оставшийся в игре игрок получает техническую победу.\n- Закончившееся свободное место на доске ведет к проставлению всем игрокам ничьей.\n\n### Технические детали\n\n- Используемые протоколы:\n  - WebSocket: для действий, требующих уведомления других пользователей\n  - HTTP: для всех остальных действий\n- Процесс авторизации унифицирован для HTTP и WebSocket с помощью [FastAPI Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/), ради чего пришлось отказаться от расширения fastapi-users.\n- Access token един для HTTP и WebSocket; в первом случае он передается в заголовке (Bearer), во втором - как параметр запроса.\n- Для тестов при подъеме docker-compose создается отдельная БД.\n\n### Иллюстрации\n\nОсновной функционал. Как бэкенд-разработчик, я делал упор на бэкенд-составляющую, так что внешний вид... может не впечатлять :)  \nМобильные устройства на текущий момент не поддерживаются.  \n\nГлавное меню:\n![mainScreenNotLogged](/pics/main_mot_logged.png)\n\nПосле регистрации, верификации почты и аутентификации:\n![mainScreenLogged](/pics/main_logged.png)\n\nМеню создания новой игры. Правила определяются на основе выбранных модов. Крестиком отмечены недоступные на данный момент моды (находящиеся в планах/в разработке):\n![createChooseMod](/pics/create_mod.png)\n\nДля тестовой игры примем правила по умолчанию:\n![createGameNoMods](/pics/create_no_mods.png)\n\nК созданной игре можно присоединиться по ее ID либо, если чекбокс Private с предыдущего скриншота не был установлен, - через список публичных игр:\n![joinPublicGame](/pics/join_public.png)\n\nСоздатель игры, тем временем, был перенаправлен на экран игры и подтвердил готовность:\n![gamePlayer1Ready](/pics/game_1_ready.png)\n\nИгра не начинается, пока оба игрока не подтвердят готовность. До подтверждения можно покинуть игру и не получить техническое поражение.\n![gamePlayer2NotReady](/pics/game_2_not_ready.png)\n\nВсе подтвердили готовность, определяется очередность ходов - доска разблокирована для текущего игрока:\n![gamePlayer1Started](/pics/game_1_started.png)\n\nБелые сделали ход - доска разблокирована для следующего игрока:\n![gamePlayer2Started](/pics/game_2_started.png)\n\nВ напряженной борьбе белые собирают 5 камней в ряд и побеждают. Результаты сохряняются. Игроки возвращаются в главное меню.\n![gamePlayer1Won](/pics/game_1_won.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexsaron%2Frenju-online","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexsaron%2Frenju-online","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexsaron%2Frenju-online/lists"}