Skip to content

Repository files navigation

Крестики-нолики — REST API на Spring Boot

Tic-tac-toe backend with Spring Boot, PostgreSQL, Basic authentication and a Minimax opponent.

Build

Учебный 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 bootRun

Bash:

read -rsp 'Database password: ' DB_PASSWORD
echo
export DB_PASSWORD
./gradlew bootRun

Сервис доступен по http://localhost:8080. Переменные действуют в текущем терминале; .env автоматически не загружается. Для сборки без запуска БД не нужна.

API

Метод Путь Назначение
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.

Пример партии в Postman

  1. Отправьте POST /auth/signup: в JSON укажите новый логин и пароль, выбранный для локального демонстрационного пользователя. Секрет храните в локальной переменной Postman.
  2. На вкладке Authorization выберите Basic Auth с этими данными и отправьте POST /auth/login.
  3. С той же авторизацией создайте игру через POST /games с {"gameType":"VS_COMPUTER"}. Сохраните поле id из ответа.
  4. Отправьте 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 при передаче вне локальной машины; текущая конфигурация не предназначена для публичного размещения приложения.

Александр · Junior QA/AQA Engineer · Email · Telegram

About

Tic-tac-toe REST API: Spring Boot, PostgreSQL, Basic authentication, BCrypt, two-player matches and Minimax · Java 21.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages