Задача: написать бэкенд для проведения шахматной партии.
Что требуется:
- язык PHP,
- использовать ООП,
- хранить состояние партии (положение фигур на доске и очередность хода),
- проверять ход на соответствие правилам,
- определять конец игры,
- написать API:
- cделать ход,
- cтатус партии,
- начать новую партию,
- продумать какие типы ошибок могут быть.
Что должно получится на выходе: веб-сервис, который дает возможность провести шахматную партию, используя обозначенные выше методы API.
Что НЕ надо делать:
- вычислять патовую ситуацию,
- визуализацию.
Я решил, что использовать фреймворк для трех эндпоинтов нерационально, поэтому все написано на native PHP 7.4, зависимости через Composer.
В качестве БД используется Postgres, доска с фигурами хранится в JSONB. При вызове методов берется конкретная запись игры (т.е. ищется точное совпадение id), поэтому поиск можно оптимизировать с помощью хеш-индексов вместо стандартного B-tree.
- /create — создать новую игры,
- /move — сделать ход,
- /status — получить статус партии.
- базовые правила игры,
- автоматический расчет очередности хода (нельзя передвинуть чужую фигуру),
- рокировка,
- превращение пешки,
- взятие на проходе,
- юнит-тесты.
Прототип развернут на chess.trofimov.dev, сыграть простую партию и поставить «Дурацкий мат» можно с помощью готового набора ссылок:
- https://chess.trofimov.dev/create — создаем новую игру, далее в качестве {id} подставляем значение из ответа
- https://chess.trofimov.dev/move?id={id}&from=g2&to=g4 — ходим g2-g4 за белых
- https://chess.trofimov.dev/move?id={id}&from=e7&to=e5 — ходим e7-e5 за черных
- https://chess.trofimov.dev/move?id={id}&from=f2&to=f3 — ходим f2-f3 за белых
- https://chess.trofimov.dev/move?id={id}&from=d8&to=h4 — ходим Фd8-h4× за черных
Необходим PHP 7.4, Postgres (10+ для использования хеш-индексов, т.к. до этой версии их использование не гарантирует
целостность данных при сбое), настроить проксирование запросов к /index.php (у меня Nginx с PHP-FPM, конфиг в папке
scripts/
) и заполнить данные от БД в .env файле.
git clone https://github.com/trofimovdev/vk_chess.git && cd vk_chess
composer install
psql -U {db_user} {db_name} < scripts/dump.sql
cp .env.example .env