An open API service indexing awesome lists of open source software.

https://github.com/trofimovdev/vk_chess

Решение тестового задания по бэкенду от VK
https://github.com/trofimovdev/vk_chess

Last synced: 8 months ago
JSON representation

Решение тестового задания по бэкенду от VK

Awesome Lists containing this project

README

          

# Тестовое задание
Задача: написать бэкенд для проведения шахматной партии.

Что требуется:
* язык PHP,
* использовать ООП,
* хранить состояние партии (положение фигур на доске и очередность хода),
* проверять ход на соответствие правилам,
* определять конец игры,
* написать API:
* cделать ход,
* cтатус партии,
* начать новую партию,
* продумать какие типы ошибок могут быть.

Что должно получится на выходе:
веб-сервис, который дает возможность провести шахматную партию, используя обозначенные выше методы API.

Что НЕ надо делать:
* вычислять патовую ситуацию,
* визуализацию.

# Решение
Я решил, что использовать фреймворк для трех эндпоинтов нерационально, поэтому все написано на native PHP 7.4,
зависимости через Composer.

В качестве БД используется Postgres, доска с фигурами хранится в JSONB. При вызове методов берется конкретная запись
игры (т.е. ищется точное совпадение id), поэтому поиск можно оптимизировать с помощью хеш-индексов вместо стандартного
B-tree.

## Эндпоинты
* /create — создать новую игры,
* /move — сделать ход,
* /status — получить статус партии.

[Документация на Postman](https://documenter.getpostman.com/view/10892299/SzzkcHR2?version=latest)

## Реализованный функционал:
* базовые правила игры,
* автоматический расчет очередности хода (нельзя передвинуть чужую фигуру),
* [рокировка](https://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0),
* [превращение пешки](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%88%D0%BA%D0%B8),
* [взятие на проходе](https://ru.wikipedia.org/wiki/%D0%92%D0%B7%D1%8F%D1%82%D0%B8%D0%B5_%D0%BD%D0%B0_%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%D0%B5),
* юнит-тесты.

Прототип развернут на [chess.trofimov.dev](https://chess.trofimov.dev), сыграть простую партию и поставить
[«Дурацкий мат»](https://ru.wikipedia.org/wiki/%D0%94%D1%83%D1%80%D0%B0%D1%86%D0%BA%D0%B8%D0%B9_%D0%BC%D0%B0%D1%82)
можно с помощью готового набора ссылок:
1. https://chess.trofimov.dev/create — создаем новую игру, далее в качестве {id} подставляем значение из ответа
2. https://chess.trofimov.dev/move?id={id}&from=g2&to=g4 — ходим g2-g4 за белых
3. https://chess.trofimov.dev/move?id={id}&from=e7&to=e5 — ходим e7-e5 за черных
4. https://chess.trofimov.dev/move?id={id}&from=f2&to=f3 — ходим f2-f3 за белых
5. 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 файле.

```shell
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
```