Skip to content

Commit

Permalink
Task8
Browse files Browse the repository at this point in the history
  • Loading branch information
mfcms committed Nov 1, 2023
1 parent dd0ff75 commit 2f0e9c9
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package croc.education.ws2023spb.knightsmove;

/**
* Приложение, проверяющее возможность прохождения последовательности клеток на шахматной доске ходом коня.
* Приложение, проверяющее возможность прохождения последовательности клеток на
* шахматной доске ходом коня.
*/
public final class Application {

/**
* Основной метод приложения.
*
* @param args
* аргументы
* аргументы
* @throws IllegalMoveException
*/
public static void main(final String[] args) {
// TODO: реализовать логику исполнения программы.
System.out.print("Логика программы ещё не реализована");
try {
KnightsMoveCheckerFactory.get().check(args);
} catch (IllegalMoveException e) {
System.out.print(e.getMessage());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package croc.education.ws2023spb.knightsmove;

/**
* Класс, содержащий методы преобразования в объект расположения фигуры на шахматной доске из различных форматов.
* Класс, содержащий методы преобразования в объект расположения фигуры на
* шахматной доске из различных форматов.
*
* @author Dmitry Malenok
* @see ChessPosition
Expand All @@ -12,20 +13,49 @@ public final class ChessPositionParser {
* Конструктор.
*/
private ChessPositionParser() {
// Конструктор задан только для того, чтобы экземпляр класса случайно не создали.
// Конструктор задан только для того, чтобы экземпляр класса случайно не
// создали.
}

/**
* Разбирает наименование клетки шахматной доски, на которой находится фигура, в
* <a href="https://w.wiki/7pFN">шахматной нотации</a> и возвращает соответствующий ей объект расположения фигуры на
* <a href="https://w.wiki/7pFN">шахматной нотации</a> и возвращает
* соответствующий ей объект расположения фигуры на
* шахматной доске.
*
* @param position
* наименование клетки шахматной доски, на которой находится фигура
* @return объект расположения фигуры на шахматной доске, соответствующий переданному наименованию клетки
* наименование клетки шахматной доски, на которой находится
* фигура
* @return объект расположения фигуры на шахматной доске, соответствующий
* переданному наименованию клетки
* @throws IllegalPositionException
*/
public static ChessPosition parse(final String position) {
// TODO: создать реализацию метода.
throw new UnsupportedOperationException("Вызван ещё не реализованный метод.");
public static ChessPosition parse(final String position) throws IllegalPositionException {
if (position.length() != 2) {
throw new IllegalPositionException(position);
}
int x = position.charAt(0) - 'a';
int y = position.charAt(1) - '1';
if (x < 0 || x > 7 || y < 0 || y > 7) {
throw new IllegalPositionException(position);
}
return new ChessPosition() {

@Override
public int x() {
return x;
}

@Override
public int y() {
return y;
}

@Override
public String toString() {
return position;
}

};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@
* @author Dmitry Malenok
*/
public class IllegalMoveException extends Exception {
// TODO: наполнить класс.
public IllegalMoveException(String messege){
super(messege);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package croc.education.ws2023spb.knightsmove;

public class IllegalPositionException extends Exception {
public IllegalPositionException(String messege){
super(messege);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package croc.education.ws2023spb.knightsmove;

/**
* Класс, реализующий фабричный метод, возвращающий обработчики, проверяющие, что последовательность клеток на шахматной
* Класс, реализующий фабричный метод, возвращающий обработчики, проверяющие,
* что последовательность клеток на шахматной
* доске может быть пройдена ходом коня.
*
* @author Dmitry Malenok
Expand All @@ -12,17 +13,41 @@ public final class KnightsMoveCheckerFactory {
* Конструктор.
*/
private KnightsMoveCheckerFactory() {
// Конструктор задан только для того, чтобы экземпляр класса случайно не создали.
// Конструктор задан только для того, чтобы экземпляр класса случайно не
// создали.
}

/**
* Возвращает обработчик, проверяющий, что последовательность клеток на шахматной доске может быть пройдена ходом
* Возвращает обработчик, проверяющий, что последовательность клеток на
* шахматной доске может быть пройдена ходом
* коня.
*
* @return обработчик, проверяющий, что последовательность клеток на шахматной доске может быть пройдена ходом коня
* @return обработчик, проверяющий, что последовательность клеток на шахматной
* доске может быть пройдена ходом коня
*/
public static KnightsMoveChecker get() {
// TODO: создать реализацию метода.
throw new UnsupportedOperationException("Вызван ещё не реализованный метод.");
return new KnightsMoveChecker() {
@Override
public void check(String[] positions) throws IllegalMoveException {
ChessPosition pos;
try {
pos = ChessPositionParser.parse(positions[0]);
for (int i = 1; i < positions.length; i++) {
ChessPosition nextPos = ChessPositionParser.parse(positions[i]);
int dx = nextPos.x() - pos.x();
int dy = nextPos.y() - pos.y();
if (Math.abs(dx) + Math.abs(dy) != 3 || dx * dy == 0) {
throw new IllegalMoveException(
"конь так не ходит: " + pos + " -> " + nextPos);
}
pos = nextPos;
}
System.out.print("OK");
} catch (IllegalPositionException e) {
throw new IllegalMoveException(
"некорректная позиция: " + e.getMessage());
}
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ public class TestChessPositionParser {
* Тест метода {@link ChessPositionParser#parse(String)}.
* <p/>
* Проверяет правильность преобразования наименования одной из клеток внутри доски.
* @throws IllegalPositionException
*/
@Test
public void parseSomethingInside() {
public void parseSomethingInside() throws IllegalPositionException {
// given:
final String position = "e4";
final int expectedX = 4;
Expand All @@ -36,9 +37,10 @@ public void parseSomethingInside() {
* Тест метода {@link ChessPositionParser#parse(String)}.
* <p/>
* Проверяет правильность преобразования наименования левой нижней клетки.
* @throws IllegalPositionException
*/
@Test
public void parseLowerLeftConner() {
public void parseLowerLeftConner() throws IllegalPositionException {
// given:
final String position = "a1";
final int expectedX = 0;
Expand All @@ -58,9 +60,10 @@ public void parseLowerLeftConner() {
* Тест метода {@link ChessPositionParser#parse(String)}.
* <p/>
* Проверяет правильность преобразования наименования правой верхней клетки.
* @throws IllegalPositionException
*/
@Test
public void parseUpperRightConner() {
public void parseUpperRightConner() throws IllegalPositionException {
// given:
final String position = "h8";
final int expectedX = 7;
Expand Down

0 comments on commit 2f0e9c9

Please sign in to comment.