Данный репозиторий содержит реализацию серверной составляющей игры "Guess Game". Основные условия реализации проекта:
- Новый игрок, подключаясь к серверу, попадает в очередь;
- Когда в очереди собираются два игрока, они попадают в комнату, где сервер загадывает число от 0 до 100;
- Попав в комнату, игрок загадывает число от 0 до 100 и вводит его, отправляя на сервер;
- Игрок, назвавший число, наиболее близкое к загаданному сервером, получает очко;
- Очки каждого игрока сохраняются в базе данных с использованием встроенной в Orleans системы хранения.
Было принято решение разделить backend на 3 проекта: Abstractions, Silo и WebAPI.
Библиотека абстракций, которая используется для связи проектов без передачи реализации.
Иерархия проекта:
- 📂 Grains
- 📄 IReceptionGrain.cs
- 📄 IQueueGrain.cs
- 📄 IGameRoomGrain.cs
- 📂 State
- 📄 IGameRoomState.cs
- 📄 PlayerState.cs
Программный узел, где исполняются реализации Grain. Каждый Silo подключается к кластеру Orleans, а также имеет доступ к БД MySQL через систему хранения Persistence.
Перед запуском укажите данные для авторизации в MySQL!
Иерархия проекта:
- 📄 Program.cs
- 📂 Grains
- 📄 ReceptionGrain.cs
- 📄 QueueGrain.cs
- 📄 GameRoomGrain.cs
- 📂 State
- 📄 ReceptionState.cs
- 📄 ScoreState.cs
- 📄 GameRoomState.cs
Программный Web сервер, который реализует API для взаимодействия с кластером Orleans.
Иерархия проекта:
- 📄 Program.cs
- 📄 Payload.cs
- 📄 ResponseWrapper.cs
- 📂 Controllers
- 📄 BaseController.cs
- 📄 ReceptionController.cs
- 📄 QueueController.cs
- 📄 GameRoomController.cs
Кластер Orleans остается изолированным от прямого доступа со стороны клиента. Взаимодействие с кластером возможно исключительно через сервер "прослойку", который имеет доступ к кластеру. В данном проекте это сервер AspNetCore, реализующий HTTP API. Такое решение позволяет ограничить доступ к кластеру от внешнего вмешательства, обеспечив котролируемое взаимодействие. Еще одной причиной является программное ограничение - версия Orleans 8.X, на котором реализован сервер, не поддерживает .Net Standart 2.X, на котором работает Unity - соответственно, нет возможности собрать библиотеку с реализацией Orleans.Client под этот движок.
Стандартный формат ответа:
{
"statusCode": [Код статуса.],
"errorMessage": [Сообщение ошибки, если есть.],
"data": [Данные, если есть.]
}
В data
может вернуться любой тип данных. Далее в документации будет указываться возвращаемый тип.
/reception
Регистрирует нового игрока, сохраняет и возвращает его уникальный идентификатор.
Body:
{
"Data" : "{{nickname}}"
}
Response: Guid
Возвращает список всех зарегистрированных игроков.
Response: Dictionary<Guid, PlayerState>
Возвращает счет текущих игроков.
Response: Dictionary<Guid, long>
Возвращает информацию о конкретном игроке.
Query Parameters:
playerId
Response: PlayerState
Удаляет регистрацию текущего игрока.
Request Body:
{
"Data" : "{{playerId}}"
}
/queue
Добавляет игрока в очередь.
Request Body:
{
"Data" : "{{playerId}}"
}
Получает приглашение для игрока, возвращает ID комнаты.
Query Parameters:
playerId
Response: Guid
Возвращает список всех игроков в очереди.
Response: List<Guid>
Удаляет текущего игрока из очереди.
Request Body:
{
"Data" : "{{player_id}}"
}
/gameroom
Присоединяет текущего игрока к игровой комнате.
Request Body:
{
"Data" : "{{player_id}}"
}
Отправляет предположение игрока для текущей игры.
Request Body:
{
"Data" :
{
"PlayerId" : "{{player_id}}",
"Number" : {{number}}
}
}
Возвращает список всех игроков в игровой комнате.
Response: List<Guid>
Возвращает текущие действия в игровой комнате.
Response: enum
: { WaitPlayers, WaitAnswers, AnnouncementResults, Complete, Interrupted }
Возвращает список победителей в игровой комнате.
Response: List<Guid>
Возвращает загаданное сервером число для текущей игры.
Response: int
Эта документация охватывает все конечные точки для GuessGame Web API. Используйте базовый URL и заменяйте заполнители ({{url}}
, {{player_id}}
, {{room_id}}
, {{number}}
) фактическими значениями при выполнении запросов.