Tic-tac-toe backend with Spring Boot, PostgreSQL, Basic authentication and a Minimax opponent.
Учебный backend проект. Сервис позволяет зарегистрироваться, создать партию в крестики-нолики, сыграть с компьютером или подключить второго игрока. Пользователи и состояние игр сохраняются в PostgreSQL. Взаимодействие происходит через HTTP и JSON; графического интерфейса нет.
- Регистрация с хешированием паролей через BCrypt.
- Проверка заголовка
Authorization: Basic …собственным фильтром на каждом защищённом запросе. - Два режима:
VS_COMPUTERиVS_PLAYER. - Компьютер ищет немедленную победу, блокирует победный ход соперника и выбирает продолжение алгоритмом Minimax с учётом глубины.
- Создание партии, список ожидающих игр, присоединение и получение состояния.
- Проверка очередности, запрет изменения занятой клетки и изменения нескольких клеток за один ход.
- Сохранение доски, участников, текущего игрока и результата партии через Spring Data JPA.
Java 21 · Spring Boot 3.3.0 · Spring Web · Spring Security · Spring Data JPA / Hibernate · PostgreSQL JDBC 42.7.1 · Gradle 8.14.4.
| Пакет | Назначение |
|---|---|
| web | REST-контроллеры, DTO, преобразование запросов и ответов, фильтр аутентификации |
| domain | Игровое поле, состояния, правила хода, Minimax, сервисы матчей и пользователей |
| datasource | JPA-сущности, репозитории, преобразование моделей и хранение |
| config | Security filter chain и BCrypt |
| di | Создание сервиса игры через Spring configuration |
Доска сохраняется в текстовом поле БД как JSON. Таблицы users и games создаются/обновляются Hibernate при запуске (ddl-auto=update).
Нужны JDK 21, PostgreSQL и настроенный JAVA_HOME. Для первой сборки нужен интернет.
git clone https://github.com/rootofevi1/tic-tac-toe-spring-api.git
cd tic-tac-toe-spring-api
./gradlew buildСоздайте отдельную локальную базу и пользователя. Например, в psql под администратором PostgreSQL:
CREATE ROLE xogame LOGIN;
\password xogame
CREATE DATABASE xogame_db OWNER xogame;Команда \password запросит новый пароль интерактивно. Приложение получает настройки через переменные окружения:
| Переменная | Значение по умолчанию |
|---|---|
DB_URL |
jdbc:postgresql://localhost:5432/xogame_db |
DB_USER |
xogame |
DB_PASSWORD |
Обязательна, значения по умолчанию нет |
PowerShell — введите пароль созданной роли БД, затем запустите приложение:
$dbSecret = Read-Host 'Пароль локальной БД' -AsSecureString
$env:DB_PASSWORD = [System.Net.NetworkCredential]::new('', $dbSecret).Password
.\gradlew.bat bootRunBash:
read -rsp 'Database password: ' DB_PASSWORD
echo
export DB_PASSWORD
./gradlew bootRunСервис доступен по http://localhost:8080. Переменные действуют в текущем терминале; .env автоматически не загружается. Для сборки без запуска БД не нужна.
| Метод | Путь | Назначение |
|---|---|---|
POST |
/auth/signup |
Регистрация; JSON с полями login, password |
POST |
/auth/login |
Проверка Basic credentials, возвращает userId |
POST |
/games |
Создание игры; JSON {"gameType":"VS_COMPUTER"} или VS_PLAYER |
GET |
/games/available |
Игры, ожидающие второго участника |
POST |
/games/{gameId}/join |
Присоединение второго игрока |
GET |
/games/{gameId} |
Текущее состояние партии |
POST |
/games/{gameId}/move |
Ход — полная доска с одной изменённой клеткой |
GET |
/games/users/{userId} |
ID, логин и дата создания пользователя |
Все /games/** требуют Basic-аутентификацию. /auth/login также требует заголовок Authorization; токен или сессия не выдаются. При регистрации уже существующего логина возвращается 409, при неверных credentials — 401.
- Отправьте
POST /auth/signup: в JSON укажите новый логин и пароль, выбранный для локального демонстрационного пользователя. Секрет храните в локальной переменной Postman. - На вкладке Authorization выберите Basic Auth с этими данными и отправьте
POST /auth/login. - С той же авторизацией создайте игру через
POST /gamesс{"gameType":"VS_COMPUTER"}. Сохраните полеidиз ответа. - Отправьте
POST /games/{id}/moveс телом ниже. В ответе будет доска после вашего хода и ответа компьютера.
{"board":[[1,0,0],[0,0,0],[0,0,0]]}0 — пусто, 1 — крестик, 2 — нолик. Для следующего хода используйте последнюю доску из ответа, сохранив все занятые клетки. Ответ партии содержит id, board, status; игровой статус — ACTIVE, CROSS_WIN, NOUGHT_WIN или TIED.
Для игры вдвоём создайте VS_PLAYER, зарегистрируйте второго пользователя и от его имени вызовите /join. Создатель начинает крестиками. status основного ответа отражает состояние доски; состояние ожидания второго игрока видно в /games/available.
Это локальный учебный сервис. Basic credentials требуют HTTPS при передаче вне локальной машины; текущая конфигурация не предназначена для публичного размещения приложения.