https://github.com/trofimovdev/vk_chess
Решение тестового задания по бэкенду от VK
https://github.com/trofimovdev/vk_chess
Last synced: 8 months ago
JSON representation
Решение тестового задания по бэкенду от VK
- Host: GitHub
- URL: https://github.com/trofimovdev/vk_chess
- Owner: trofimovdev
- Created: 2020-06-12T09:50:09.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-06-18T10:57:27.000Z (about 6 years ago)
- Last Synced: 2025-10-14T19:06:24.220Z (8 months ago)
- Language: PHP
- Homepage:
- Size: 69.3 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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
```