Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,19 @@ public final class Application {
/**
* Основной метод приложения.
*
* @param args
* аргументы
* @param args аргументы
*/
public static void main(final String[] args) {
// TODO: реализовать логику исполнения программы.
System.out.print("Логика программы ещё не реализована");
if (args.length < 2) {
System.out.println("Введите больше >=2 аргументов");
return;
}
KnightsMoveChecker checker = KnightsMoveCheckerFactory.get();
try {
checker.check(args);
System.out.print("OK");
} catch (IllegalMoveException knightIllegalMove) {
System.out.print(knightIllegalMove.getMessage());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/**
* Класс, содержащий методы преобразования в объект расположения фигуры на шахматной доске из различных форматов.
*
*
* @author Dmitry Malenok
* @see ChessPosition
*/
Expand All @@ -19,13 +19,40 @@ private ChessPositionParser() {
* Разбирает наименование клетки шахматной доски, на которой находится фигура, в
* <a href="https://w.wiki/7pFN">шахматной нотации</a> и возвращает соответствующий ей объект расположения фигуры на
* шахматной доске.
*
* @param position
* наименование клетки шахматной доски, на которой находится фигура
*
* @param position наименование клетки шахматной доски, на которой находится фигура
* @return объект расположения фигуры на шахматной доске, соответствующий переданному наименованию клетки
*/
public static ChessPosition parse(final String position) {
// TODO: создать реализацию метода.
throw new UnsupportedOperationException("Вызван ещё не реализованный метод.");
public static ChessPosition parse(final String position) throws IllegalPositionException {
int x, y;
if(position.isBlank()){
throw new IllegalPositionException("Введите не пустую позицию двумя литерами: 1-ый от a до h, 2-ый от 1 до 8.");
}
boolean isValidLength = position.length() != 2;
if (isValidLength) {
throw new IllegalPositionException.IllegalPositionExceptionBuilder(isValidLength)
.setPosition(position)
.build();
}

char letter = position.charAt(0);
char number = position.charAt(1);
boolean isValidLetter = letter < 'a' || letter > 'h';
boolean isValidNumber = number - '0' < 1 || number - '0' > 8;

if (isValidLetter || isValidNumber) {
throw new IllegalPositionException.IllegalPositionExceptionBuilder(isValidLetter, isValidNumber)
.setPosition(position)
.setLetter(letter)
.setNumber(number)
.build();
}
x = letter - 'a';
y = number - '1';
return new MyChessPosition(x, y);
}
}




Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,8 @@
* @author Dmitry Malenok
*/
public class IllegalMoveException extends Exception {
// TODO: наполнить класс.
public IllegalMoveException(String fromPosition, String toPosition) {
super("конь так не ходит: " + fromPosition + " -> " + toPosition);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package croc.education.ws2023spb.knightsmove;

public class IllegalPositionException extends RuntimeException {

public IllegalPositionException(String message) {
super(message);
}

public IllegalPositionException(int x, int y) {
super("Неверно заданные координаты: " + x + ", " + y + " - введите цифры от 0 до 7.");

}


public static class IllegalPositionExceptionBuilder extends RuntimeException {
private String position;
private char letter, number;
private boolean isValidLength, isValidLetter, isValidNumber;

public IllegalPositionExceptionBuilder( boolean isValidLetter, boolean isValidNumber) {
this.isValidLetter = isValidLetter;
this.isValidNumber = isValidNumber;
}
public IllegalPositionExceptionBuilder(boolean isValidLength) {
this.isValidLength = isValidLength;
}

public IllegalPositionExceptionBuilder setPosition(String position) {
this.position = position;
return this;
}

public IllegalPositionExceptionBuilder setLetter(char letter) {
this.letter = letter;
return this;
}

public IllegalPositionExceptionBuilder setNumber(char number) {
this.number = number;
return this;
}

public IllegalPositionException build() {
String errorMessage = "Неверно определена: " + position + " - введите ";
if (isValidLength) {
errorMessage += "позицию двумя литерами";
return new IllegalPositionException(errorMessage);
}
if (isValidLetter) {
errorMessage += "вместо \"" + letter + "\" латинскую букву от a до h; ";
}
if (isValidNumber) {
errorMessage += "вместо \"" + number + "\" цифру от 1 до 8.";
}
return new IllegalPositionException(errorMessage);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ private KnightsMoveCheckerFactory() {
* @return обработчик, проверяющий, что последовательность клеток на шахматной доске может быть пройдена ходом коня
*/
public static KnightsMoveChecker get() {
// TODO: создать реализацию метода.
throw new UnsupportedOperationException("Вызван ещё не реализованный метод.");
return new MyKnightsMoveChecker();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package croc.education.ws2023spb.knightsmove;

public class MyChessPosition implements ChessPosition{
private int x;
private int y;
public MyChessPosition(int x,int y) throws IllegalPositionException {
if ((x >= 0 && x <= 7) && (y >= 0 && y <= 7)) {
this.x = x;
this.y = y;
}else{
throw new IllegalPositionException(x,y);
}
}
@Override
public int x() {
return x;
}

@Override
public int y() {
return y;
}
@Override
public String toString(){
return ((char) ('a' + x)) +Integer.toString(y+1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package croc.education.ws2023spb.knightsmove;

public class MyKnightsMoveChecker implements KnightsMoveChecker {
@Override
public void check(String[] positions) throws IllegalMoveException {
String fromPosition, toPosition;
for (int i = 1; i < positions.length; i++) {
fromPosition = positions[i-1];
toPosition= positions[i];
if (!isKnightMove(fromPosition, toPosition)) {
throw new IllegalMoveException(fromPosition,toPosition);
}
}
}

public boolean isKnightMove(String from, String to) {
int x2 = ChessPositionParser.parse(to).x();
int x1 = ChessPositionParser.parse(from).x();
int y2 = ChessPositionParser.parse(to).y();
int y1 = ChessPositionParser.parse(from).y();
int dx = Math.abs(x2 - x1);
int dy = Math.abs(y2 - y1);
return ((dx == 2 && dy == 1) || (dx == 1 && dy == 2));
}
}