Возможно я немного тороплю события и нарушаю все догмы scrum'а, но все же, сегодня прошел еще один спринт длительностью в почти весь день.
За время спринта были исправлены несколько минорных ошибок (вроде отсутствия таймаута при опросе сервера, некорректная начальная позиция курсора, отсутствие всяческих сообщений на экране) и сделаны два довольно-таки больших шага для всего проекта - синхронизация ходов игроков и их очередность.
Внутренняя логика сервера опять-таки потерпела серьезные изменения. Об этом хотелось бы рассказать немного подробнее.
Итак, необходима была поочередность ходов (в первую очередь). Реализована эта фича довольно-таки несложно: у клиента есть переменная-индикатор состояния, которая может принимать два значения - "
хожу я" и "
ходит противник". Пока состояние переменной равно "ходит противник", сервер опрашивается (раз в три секунды - это значение константно для всех запросов, обращенных к серверу) на изменение сего состояния. При изменении передается так же информация о новом ходе (см.
прим. 1).
При новом ходе (если переменная состояния позволяет), сервер опрашивается лишь раз - на возможность произвести данный ход (это и есть "валидация хода", которая до сих пор практически не реализована). Если новый ход возможно совершить - индикатор переходит в состояние "ходит противник". В этом же состоянии значения нажатых клавиш на клавиатуре попросту игнорируются дабы предотвратить возможные попытки совершения хода (на сервере это так же проверяется).
С точки зрения сервера, проверка на валидность хода - это и есть попытка совершить ход. Если проверка проходит удачно - в историю ходов добавляется проверенный ход. Если же нет - клиенту отправляется соответствующий результат.
Информация о новом ходе (которую клиент получает при опросе сервера на наличие новых ходов) используется для смены позиции фигуры, сделавшей ход. Смена позиции тривиальна: в ячейку, в которую "сходила" фигура заносится значение ячейки, "из которой она пошла". В последнюю заносится ноль (ячейка опустошается). Рокировка пока не реализована, но для большинства фигур такое действие является аксиомой.
Прим. 1: Информация о ходе представлена в виде "
%откуда% %куда%". %откуда% и %куда% - стандартные для шахмат записи вида "[буква][цифра]". Эти же значения нормализуются на сервере, дабы каждый игрок получал их в уже пригодном для использования виде (если белые фигуры ходят с a8 в а6, то этот же ход для черных фигур будет выглядеть как h1 -> h3, учитывая что доска имеет одинаковую разметку для всех: столбцы нумеруются буквами от
a до
h, слева направо; строки - цифрами от
1 до
8, сверху вниз).
Бэклог (aka Ретроспектива)
Итак, что же на данный момент готово: начало новой игры, поочередность ходов и синхронизация данных игроков.
До конца проекта, как я думаю, недалеко - осталось реализовать проверку валидности ходов (что и займет бОльшую часть времени) и, возможно, прикручивание графического интерфейса для поиска оппонента и выхода (аж одно окошко с тремя кнопочками).
Как всегда, в приложении - скриншот, демонстрирующий синхронизированных два клиента и
ссылка на скачивание исходных кодов сервера и клиента.
До нового спринта!