Skip to content
mihnayan edited this page Nov 11, 2014 · 4 revisions

Расширить приложение из Практической работы 2

  1. Добавить еще один абонент и поток - GameMechanics.

  2. Добавить адрес этого абонента в AddressService.

  3. Написать абстрактное сообщение MsgToGM и реализацию - MsgStartGameSession.

  4. Frontend должен посылать сообщение MsgStartGameSession на GameMechanics в тот момент, когда к серверу присоединилось достаточно пользователей для старта новой игры (например, 2 пользователя для игры в шахматы). Получив это сообщение, игровая механика должна создать игровую сессию для пользователей, Id которых пришли в сообщении. (см Собственное расширение п. 4)

  5. Написать сообщение на Frontend, и пересылать в нем из GameMechanics реплику состояния игровой сессии каждые 100ms (пока достаточно реализовать через Thread.sleep(100)).

  6. Для проверки работы пересылки сообщений при старте игровой сессии запоминать время старта, пересылать из игровой механики текущую длительность игровой партии и показывать ее на странице.

Получать текущее время в миллисекундах можно так:

Date date = new Date();
long currentTime = date.getTime();

в методе run() после обработки сообщений, для каждой игровой сессии вычислять время прошедшее с ее начала и отправлять обновление на Frontend.

  1. Для упрощения решения задания на на данном этапе принимаются следующие ограничения:

    Сервер может создать только один сеанс игры для мининимально необходимого количества игроков. После создания игровой сессии другие пользователи могут авторизоваться, но принимать участия в игре не могут.

    В качестве оппонентов для игры выбираются "первые попавшиеся" зарегистрировавшиеся пользователи.

  2. На сервере:

    Оппоненты выбираются объектом GameFrontend

    Игровая механика после получения сообщения startGame создает игровую сессию. Игровая сессия реализуется классом GameSession.

    В Игровой механике с переодичностью в 100 мс для класса, реализующего интерфейс Frontend, отсылается сообщение, содерждащие объект GameData. Объект GameData содержит текущее состояние игровой сессии и для текущего задания содержит только одно свойство: время, прошедшее с начала игры.

    В классе GameFrontend имеется поле gameData, значение которого обновляется с приходом очередного сообщения от Игровой механики.

  3. На клиенте:

    Создать страницу, которая будет отдаваться после регистрации пользователя. На странице отобразить учетные данные пользователя, необходимое количество пользователей для начала игры и имена оппонентов. Игра начинается при нажатии кнопки "Начать игру". Если количество пользователей не достаточно, то на странице выводиться сообщение об этом и идет дальнейшее ожидание кворума.

Clone this wiki locally