diff --git a/src/schack/Bishop.java b/src/schack/Bishop.java index 38e6561..9b7d6d6 100644 --- a/src/schack/Bishop.java +++ b/src/schack/Bishop.java @@ -4,7 +4,7 @@ import java.awt.Point; import java.io.IOException; import java.util.LinkedHashSet; -public class Bishop extends Piece { +public class Bishop extends LongWalkers { public Bishop(boolean isWhite, Point startingPosition) throws IOException { super(isWhite, startingPosition); @@ -13,42 +13,11 @@ public class Bishop extends Piece { @Override public LinkedHashSet validMoves(Piece[][] pieces, boolean isSelected) { - LinkedHashSet movable = new LinkedHashSet<>(); - - // Upp vänster - for (int loopX = this.position.x - 1, loopY = this.position.y - 1; loopX >= 0 && loopY >= 0; loopX--, loopY--) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - - // Upp höger - for (int loopX = this.position.x + 1, loopY = this.position.y - 1; loopX <= 7 && loopY >= 0; loopX++, loopY--) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - // Ner höger - for (int loopX = this.position.x + 1, loopY = this.position.y + 1; loopX <= 7 && loopY <= 7; loopX++, loopY++) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - // Ner vänster - for (int loopX = this.position.x - 1, loopY = this.position.y + 1; loopX >= 0 && loopY <= 7; loopX--, loopY++) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - return movable; + return getMoves( + new int[][]{{-1,-1},{1, 1}, {-1, 1}, {1, -1}}, + pieces, + isSelected + ); } @Override diff --git a/src/schack/LongWalkers.java b/src/schack/LongWalkers.java new file mode 100644 index 0000000..5e89324 --- /dev/null +++ b/src/schack/LongWalkers.java @@ -0,0 +1,32 @@ +package schack; + +import java.awt.Point; +import java.io.IOException; +import java.util.LinkedHashSet; + +public abstract class LongWalkers extends PieceKnownIfMoved { + + public LongWalkers(boolean isWhite, Point startingPosition) throws IOException { + super(isWhite, startingPosition); + } + + LinkedHashSet getMoves(int[][] directions, Piece[][] pieces, boolean isSelected) { + LinkedHashSet movable = new LinkedHashSet<>(); + + for (int[] xy : directions) { + int loopX = this.position.x, loopY = this.position.y; + while (loopX + xy[0] >= 0 && loopX + xy[0] <= 7 && loopY + xy[1] >= 0 && loopY + xy[1] <= 7) { + loopX += xy[0]; + loopY += xy[1]; + boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); + + if (shouldBreak) { + break; + } + } + } + + return movable; + } + +} diff --git a/src/schack/Queen.java b/src/schack/Queen.java index 00c5fa4..9cef381 100644 --- a/src/schack/Queen.java +++ b/src/schack/Queen.java @@ -4,7 +4,7 @@ import java.awt.Point; import java.io.IOException; import java.util.LinkedHashSet; -public class Queen extends Piece { +public class Queen extends LongWalkers { public Queen(boolean isWhite, Point point) throws IOException { super(isWhite, point); @@ -13,73 +13,10 @@ public class Queen extends Piece { @Override public LinkedHashSet validMoves(Piece[][] pieces, boolean isSelected) { - LinkedHashSet movable = new LinkedHashSet<>(); - - // Vänster - for (int loopX = this.position.x - 1; loopX >= 0; loopX--) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, this.position.y), movable, pieces, isSelected); - - if (shouldBreak) { - break; - } - } - - // Höger - for (int loopX = this.position.x + 1; loopX <= 7; loopX++) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, this.position.y), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - } - - // Ner - for (int loopY = this.position.y + 1; loopY <= 7; loopY++) { - boolean shouldBreak = addMovesIfCan(new Point(this.position.x, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - } - - // Upp - for (int loopY = this.position.y - 1; loopY >= 0; loopY--) { - boolean shouldBreak = addMovesIfCan(new Point(this.position.x, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - } - // Upp vänster - for (int loopX = this.position.x - 1, loopY = this.position.y - 1; loopX >= 0 && loopY >= 0; loopX--, loopY--) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - - // Upp höger - for (int loopX = this.position.x + 1, loopY = this.position.y - 1; loopX <= 7 && loopY >= 0; loopX++, loopY--) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - // Ner höger - for (int loopX = this.position.x + 1, loopY = this.position.y + 1; loopX <= 7 && loopY <= 7; loopX++, loopY++) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - // Ner vänster - for (int loopX = this.position.x - 1, loopY = this.position.y + 1; loopX >= 0 && loopY <= 7; loopX--, loopY++) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - - } - return movable; + return getMoves( + new int[][]{{1, 0}, {-1, 0}, {0, 1}, {-1, -1}, {0, -1}, {1, 1}, {-1, 1}, {1, -1}}, + pieces, + isSelected + ); } } diff --git a/src/schack/Rook.java b/src/schack/Rook.java index 14e6b7e..b479f66 100644 --- a/src/schack/Rook.java +++ b/src/schack/Rook.java @@ -4,7 +4,7 @@ import java.awt.Point; import java.io.IOException; import java.util.LinkedHashSet; -public class Rook extends PieceKnownIfMoved { +public class Rook extends LongWalkers { public Rook(boolean isWhite, Point startingPosition) throws IOException { super(isWhite, startingPosition); @@ -13,43 +13,11 @@ public class Rook extends PieceKnownIfMoved { @Override public LinkedHashSet validMoves(Piece[][] pieces, boolean isSelected) { - LinkedHashSet movable = new LinkedHashSet<>(); -//Behöver skriva att om rookX = this.position.x så ska vi istället loopa igenom -//int rookY = 0-this.position.y; rookY < 8-this.position.Y; rookY++ -//men jag är trög och har spenderat alldles förmycket tid på att vara trög :^) - - // Vänster - for (int loopX = this.position.x - 1; loopX >= 0; loopX--) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, this.position.y), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - } - - // Höger - for (int loopX = this.position.x + 1; loopX <= 7; loopX++) { - boolean shouldBreak = addMovesIfCan(new Point(loopX, this.position.y), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - } - - // Ner - for (int loopY = this.position.y + 1; loopY <= 7; loopY++) { - boolean shouldBreak = addMovesIfCan(new Point(this.position.x, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - } - - // Upp - for (int loopY = this.position.y - 1; loopY >= 0; loopY--) { - boolean shouldBreak = addMovesIfCan(new Point(this.position.x, loopY), movable, pieces, isSelected); - if (shouldBreak) { - break; - } - } - return movable; + return getMoves( + new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}, + pieces, + isSelected + ); }