/
java56
/
Minesweeper
Обзор
Документация
Войти
/
java56
/
Minesweeper
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/com/mikhail/minesweeper/service/GameValidationService.java
100 строк
4 KB
Mikhail Gorbatenkov
42 - edit the logic of validating a player's move
18 фев 2025, 20:16
18 фев 2025, 20:16
c67042b
Код
Авторство
О чём код?
package com.mikhail.minesweeper.service; import com.mikhail.minesweeper.dto.request.GameTurnRequest; import com.mikhail.minesweeper.model.CellValue; import com.mikhail.minesweeper.model.Game; import com.mikhail.minesweeper.model.GameStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; /** * @author mikhail * <p>Сервис для валидации ходов и состояния игры</p> */ @Service @Slf4j public class GameValidationService { /** * Валидация параметров для создания новой игры. * * @param width ширина игрового поля * @param height высота игрового поля * @param minesCount количество мин на поле */ public void validateNewGame(int width, int height, int minesCount) { if (width <= 0 || height <= 0) { throw new IllegalArgumentException("Ширина и высота должны быть положительными."); } if (width > 30 || height > 30) { throw new IllegalArgumentException("Ширина и высота не должны превышать 30."); } int maxMines = width * height - 1; if (minesCount <= 0 || minesCount > maxMines) { throw new IllegalArgumentException("Количество мин должно быть от 1 до " + maxMines); } log.debug("Валидация параметров игры выполнена."); } /** * Валидация хода игрока * * @param game информация о текущем состоянии игры * @param gameTurnRequest ход игрока */ public void validateMove(Game game, GameTurnRequest gameTurnRequest) { if (game == null) { throw new IllegalArgumentException("Игра не найдена."); } if (game.getStatus() == GameStatus.COMPLETED) { throw new IllegalStateException("Игра уже завершена."); } int row = gameTurnRequest.getRow(); int col = gameTurnRequest.getCol(); if (row < 0 || row >= game.getHeight() || col < 0 || col >= game.getWidth()) { throw new IllegalArgumentException("Некорректные координаты ячейки: row=" + row + ", col=" + col); } String cellValue = game.getField().get(row).get(col); if (cellValue.equals(CellValue.MINE.getValue())) { log.debug("Обнаружена мина, выходим из метода validateMove."); return; } if (cellValue.equals(CellValue.EMPTY.getValue()) || "0".equals(cellValue)) { log.debug("Ячейка с 0 или пустая, можно открывать."); } else { log.info("Ячейка уже была открыта: row={}, col={}", row, col); throw new IllegalStateException("Ячейка уже была открыта."); } log.debug("Все проверки выполнены, можно открывать ячейку."); } /** * Проверка завершения игры. * * @param game информация о текущем состоянии игры * @return true - игра завершена, false - игра не завершена */ public boolean isGameCompleted(Game game) { for (List<String> row : game.getField()) { for (String cell : row) { if (cell.equals(CellValue.EMPTY.getValue())) { log.info("Имеются неоткрытые ячейки, игра не завершена."); return false; } } } log.info("Игра завершена, так как все ячейки открыты."); return true; } }