-
Notifications
You must be signed in to change notification settings - Fork 0
fromanywhere/tic-tac-toe
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
<!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Документация по игре «Крестики-нолики»</title> <style type="text/css"> code { display: block; white-space: pre-wrap; font-family: monospace; border: 1px #aaa solid; border-radius: 2px; background-color: #f0f0f0; padding: 8px; } </style> </head> <body> <h1>Цель</h1> <p>Написать клиентскую часть приложения «Крестики-нолики» с использованием предоставленного серверного API (<a href="https://ru.wikipedia.org/wiki/API#Web_API">application programming interface</a>)</p> <p>Клиент должен реализовывать возможности </p> <ol> <li>войти в систему</li> <li>выйти из системы</li> <li>получить список существующих игр, находящихся в состоянии ожидания старта</li> <li>создать новую игру с заданными параметрами</li> <li>подключиться к существующей игре, находящейся в состоянии ожидания старта</li> <li>делать ход на игровом поле</li> <li>получать текущий игровой статус</li> </ol> <h2>Общие принципы и соглашения</h2> <p> Для реализации описанных возможностей следует использовать предоставленные серверные методы. Методы обладают различными параметрами, описанными ниже, используют разные типы запросов и протоколов. В случае корректного использования методы возвращают данные, согласно описанной для них документации, иначе возвращают сообщение об ошибке и закрывают соединение. </p> <p> Кодировкой сообщений принимается utf-8. Формат данных, используемых для взаимодействия — JSON. Данные следует сериализовать в этот формат при отправке запросов на сервер (HTTP-POST, WebSocket). Получаемые с сервера данные также являются корректным JSON, доступным к десериализации. </p> <p> HTTP-запросы имеют следующий фиксированный формат ответа: status — может быть успешным (success) или неуспешным (fail) В случае, если запрос успешен, кроме поля status возвращается объект data, содержимое которого зависит от запроса и документируется ниже. В случае, если запрос неуспешен, кроме поля status возвращается поле message, содержащее описание причины неудачи в текстовом виде. </p> <p>WebSocket-запросы всегда должны обладать полем command, документированным ниже.</p> <p>Точкой входа является http://welovehtml.ru:3000.</p> <h2>Протокол взаимодействия</h2> <p>При открытии страницы пользователь должен иметь возможность просмотреть существующие на сервере игры, находящиеся в ожидании старта, а также возможность войти в систему под некоторыми учетными данными. Весь игровой функционал должен быть доступен только пользователю, осуществившему вход.</p> <h3>Вход, сессия и продление сессии</h3> <p>Для входа в систему пользователь должен указать желаемое имя, под которым он будет известен другим игрокам. В результате отправки желаемого имени на сервер пользователь получает реальное имя (может отличаться от желаемого), а также уникальный идентификатор пользователя, необходимый при последующем взаимодействии с сервером. В момент входа пользователя для него создается сессия, в течение которой он имеет право совершать игровые операции. Продолжительность сессии — 3 минуты. После завершения сессии пользователь принудительно удаляется из системы, все созданные им игры удаляются, а игры, в которых он принимал участие, завершаются с оповещением других игроков. Пользователь имеет возможность продлить сессию, отправив своё текущее реальное имя и идентификатор, еще на 3 минуты. Количество продлений не ограничено.</p> <code>URL: /login Протокол: HTTP Метод запроса: POST Данные запроса: login: желаемое имя [playerId]: идентификатор, опционально Данные ответа: result.status: success или fail result.message: сообщение об ошибке, если случилась result.data.id: идентификатор пользователя result.data.name: реальное имя пользователя result.data.loginTimeout: время, через которое сессия будет завершена, в миллисекундах (3 минуты)</code> <h3>Выход</h3> <p>Пользователь, обладающий активной игровой сессией, должен иметь возможность её завершить. В результате завершения сессии все созданные им игры будут удалены, а игры, в которых он принимал участие, будут завершены с оповещением других игроков. Для завершения игровой сессии следует отправить свой идентификатор.</p> <code>URL: /logout Протокол: HTTP Метод запроса: POST Данные запроса: playerId: идентификатор пользователя Данные ответа: result.status: success или fail result.message: сообщение об ошибке, если случилась</code> <h3>Получение списка игр, находящихся в ожидании старта</h3> <p>Пользователь должен иметь возможность получать список игр, как обладая активной игровой сессией, так и в её отсутствие. Пользователь, обладающий активной игровой сессией, не должен получать игр, в которые он уже играет или создал. Для получения списка игр отправляется запрос без параметров; для получения отфильтрованного списка игр следует передать идентификатор пользователя.</p> <code>URL: /games Протокол: HTTP Метод запроса: GET Данные запроса: [playerId]: идентификатор, опционально Данные ответа: result.status: success или fail result.message: сообщение об ошибке, если случилась result.data.games: список игр, находящихся в ожидании старта. Каждая игра обладает следующей информацией (полями): id: уникальный идентификатор игры players: список игроков, находящихся в игре maxPlayersCount: максимальное количество игроков </code> <h3>Создание новой игры</h3> <p>Пользователь с активной игровой сессией имеет право создать новую игру с набором параметров. Параметры определяют размерность игровой доски и количество игроков. Невозможно создать игру без игровых параметров или с некорректными параметрами. Принимается, что размерность доски может быть от 3 до 9 включительно, а количество игроков может быть от 2х до 4х. Игра существует до тех пор, пока в ней находится ненулевое количество игроков, а также до тех пор, пока один из игроков не выйдет из игры. В случае выхода игрока как из игровой сессии, так и из игры, соединение с другими игроками автоматически обрывается. Предполагается, что игрок, создающий игру, должен присоединиться к ней сразу после создания. Автоматического присоединения не происходит. Игрок должен присоединиться к игре в течение не более 2х секунд после создания, иначе игра будет удалена. </p> <code>URL: /create Протокол: HTTP Метод запроса: POST Данные запроса: playerId: идентификатор пользователя boardSize: размерность доски playersCount: количество игроков Данные ответа: result.status: success или fail result.message: сообщение об ошибке, если случилась result.data.id: уникальный идентификатор игры </code> <h3>Присоединение к существующей игре</h3> <p>Пользователь с активной игровой сессией имеет право присоединиться к существующей игре, если она находится в состоянии ожидания старта. Формально не запрещено входить в одну игру одним и тем же пользователем дважды, но работоспособность игры при этом не гарантируется, поэтому такого сценария лучше избегать. Присоединение к игре реализуется инициализацией WebSocket-соединения, которое остается открытым во время всей игры. Игровой процесс описывается передачей данных по этому соединению и реакцией на них. Данные обязаны содержать имя игровой команды и её параметры. </p> <h4>Данные, передаваемые сервером клиенту:</h4> <h5>Запрос хода</h5> <p>Сервер уведомляет клиент, что тот имеет право сделать ход, а сервер и остальные игроки будут его ожидать. Затем сделанный ход должен быть проверен сервером.</p> <code>URL: / Протокол: WebSocket Данные: command: MAKEMOVE token: уникальный токен, обеспечивающий безопасность хода (ход может быть свершен не более одного раза) board: текущее состояние доски в виде двумерного массива </code> <h5>Уведомление</h5> <p>Сервер уведомляет клиент о каком-либо событии, которое клиент обязан показать пользователю</p> <code>URL: / Протокол: WebSocket Данные: command: NOTIFY message: произвольная строка board: текущее состояние доски в виде двумерного массива </code> <h4>Данные, передаваемые клиентом серверу:</h4> <h5>Проверка хода</h5> <p>После того, как пользователь сделал ход, клиент просит сервер проверить корректность сделанного хода.</p> <code>URL: / Протокол: WebSocket Данные: command: CHECKMOVE token: уникальный токен, который до этого был выдан клиенту x: координаты клетки, y: в которую ходит пользователь </code> <h5>Проверка игрового статуса (опционально)</h5> <p>Клиент может запрашивать сервер дополнительно о текущем статусе игры </p> <code>URL: / Протокол: WebSocket Данные: command: GETSTATUS </code> <h3>Завершение существующей игры</h3> <p>Завершение игрового процесса выполняется закрытием соединения. Соединение может быть закрыто как со стороны сервера, так и со стороны клиента. При закрытии соединения следует использовать и обрабатывать коды завершения соединения: A CloseEvent is sent to clients using WebSockets when the connection is closed.</p> <code>1000 — Никто не виноват, закрываем соединение, потому что хотим отключиться (Normal closure; the connection successfully completed whatever purpose for which it was created). 1001 — Сервер решил удалить игру, и дополнительно сообщит причину (The endpoint is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection). 1003 — Виноват клиент — некорректные параметры запроса (The connection is being terminated because the endpoint received data of a type it cannot accept). 1006 — Соединение оборвалось (кто-то обновил страницу / пропал интернет) (Used to indicate that a connection was closed abnormally (that is, with no close frame being sent) when a status code is expected). </code></body> </html>
About
An example of multiplayer client-server tic-tac-toe game
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published