В настоящее время я изучаю Java и работаю над назначением класса.Мы должны сделать «странную версию» шахмат.Как и в оригинальных шахматах, фигуры не могут двигаться, если на их пути есть фигура, очевидным исключением является лошадь, которая может прыгать на все фигуры , кроме королей .
У меня естьабстрактный класс Piece
, который наследуется всеми типами фигур, каждый со своими правилами движения.У большинства из них есть это ограничение движения, и поэтому я определил методы в этом классе:
public boolean freeWayHorizontally(int xO, int yO, int xD) {
//RIGHT
if (xO < xD) {
for (int x = xO + 1; x < xD; x++) {
CrazyPiece thereIsPiece = Simulador.checkIfTheresPiece(x, yO);
if (thereIsPiece != null){
return false;
}
}
//LEFT
} else if (xO > xD) {
for (int x = xO - 1; x > xD; x--) {
CrazyPiece thereIsPiece = Simulador.checkIfTheresPiece(x, yO);
if (thereIsPiece != null){
return false;
}
}
}
return true;
}
public boolean freeWayVertically(int xO, int yO, int yD) {
//UP
if (yO < yD) {
for (int y = yO + 1; y < yD; y++) {
CrazyPiece thereIsPiece = Simulador.checkIfTheresPiece(xO, y);
if (thereIsPiece != null){
return false;
}
}
//DOWN
} else if (yO > yD) {
for (int y = yO - 1; y > yD; y--) {
CrazyPiece thereIsPiece = Simulador.checkIfThereIsPiece(xO, y);
if (thereIsPiece != null){
return false;
}
}
}
return true;
}
thereIsPiece(int x, int y)
- это функция из класса Chess Simulator
, которая, учитывая позицию на доске,возвращает кусок в этой позиции.
Очевидно, что эти два получают одинаковые параметры (исходные координаты и координату назначения, где одна из координат назначения является одной из исходных координат фигуры), поэтому единственноечто действительно меняется, так называется thereIsPiece()
. РЕДАКТИРОВАТЬ: И из-за этого они помечены как дубликаты, и, как мне сказали, это очень плохо!
Тем не менее, я не могу понять,способ решить эту проблему, используя только один из этих методов; ТАКЖЕ РЕДАКТИРОВАТЬ: Я пытался перегрузить его, но тогда он работал бы только вертикально или горизонтально (возможно, сделал это неправильно).
Дело в том, что мне нужно сделать это отдельно для реализации движения Лошади, которое переопределяет эти методы:
public boolean freeWayHorizontally(int xO, int yO, int xD) { //Overriden by the Horse class
//RIGHT
if (xO < xD) {
for (int x = xO + 1; x <= xD; x++) {
CrazyPiece thereIsPiece = Simulador.checkIfTheresPiece(x, yO);
if (thereIsPiece != null && thereIsPiece.isKing){
return false;
}
}
//LEFT
} else if (xO > xD) {
for (int x = xO - 1; x >= xD; x--) {
CrazyPiece thereIsPiece = Simulador.checkIfTheresPiece(x, yO);
if (thereIsPiece != null && thereIsPiece.isKing){
return false;
}
}
}
return true;
}
public boolean freeWayVertically(int xO, int yO, int yD) { //Overriden by the Horse class
//UP
if (yO < yD) {
for (int y = yO + 1; y <= yD; y++) {
CrazyPiece thereIsPiece = Simulador.checkIfTheresPiece(xO, y);
if (thereIsPiece != null && thereIsPiece.isKing){
return false;
}
}
//DOWN
} else if (yO > yD) {
for (int y = yO - 1; y >= yD; y--) {
CrazyPiece thereIsPiece = Simulador.checkIfThereIsPiece(xO, y);
if (thereIsPiece != null && thereIsPiece.isKing){
return false;
}
}
}
return true;
}
И затем вызывает свой собственный тип проверки движения, также определенный вPiece
класс:
public boolean freeWayL(int xO, int yO, int xD, int yD) {
boolean fH, fV;
//Horizontal -> Vertical
fH = this.freeWayHorizontally(xO, yO, xD);
if (fH) {
fV = this.freeWayVertically(xD, yO, yD);
if (fV) {
return true;
}
}
//Vertical -> Horizontal
fV = this.freeWayVertically(xO, yO, yD);
if (dV) {
fH = this.freeWayHorizontally(xO, yD, xD);
if (fH) {
return true;
}
}
return false;
}
Что я могу сделать, чтобы избежать всего этого дублирования или даже улучшить эти проверки?