diff --git a/src/model/Board.java b/src/model/Board.java index 70c6f7c..b5480e6 100755 --- a/src/model/Board.java +++ b/src/model/Board.java @@ -4,8 +4,58 @@ public class Board { private final int BOARD_SIZE = 8; private Piece[][] representation; private int movesSinceCapture; + public enum Direction {UP, DOWN, LEFT, RIGHT}; public Board() { representation = new Piece[BOARD_SIZE][BOARD_SIZE]; + movesSinceCapture = 0; } -} + + public boolean isValidSquare(int i, int j) { + return i < BOARD_SIZE && j < BOARD_SIZE; + } + + /** + * Checks if a piece can attack another in a given direction. + * @param p The piece. + * @param X The direction along the x-coordinate (LEFT or RIGHT). + * @param Y The direction along the y-coordinate (UP or DOWN). + * @return + */ + public boolean checkAttackDirection(Piece p, Direction X, Direction Y) { + Piece candidate = null; + int i = p.getX(), j = p.getY(); + int enemy_i = X.equals(Direction.LEFT) ? i-1 : i+1; + int enemy_j = Y.equals(Direction.UP) ? j+1 : j-1; + int end_position_i = X.equals(Direction.LEFT) ? i-2 : i+2; + int end_position_j = Y.equals(Direction.UP) ? j+2: j-2; + if (isValidSquare(enemy_i, enemy_j)) { + candidate = representation[enemy_i][enemy_j]; + if (null != candidate && // there exists a piece we can take) + candidate.color.equals(p.opposite()) && // it is an enemy piece + isValidSquare(end_position_i, end_position_j) && // there is a free space + null == representation[end_position_i][end_position_j]) // that we can end up in + return true; + } + return false; + } + + /** + * Used for validation of moves. + * If returns true after a player chooses a move, + * that move is invalid because the player can keep on attacking. + * @param p + * @return + */ + public boolean hasAttackVector(Piece p) { + boolean can_attack = false; + can_attack |= checkAttackDirection(p, Direction.UP, Direction.LEFT); + can_attack |= checkAttackDirection(p, Direction.UP, Direction.RIGHT); + if(p.getType().equals(Type.KING)) { + can_attack |= checkAttackDirection(p, Direction.DOWN, Direction.LEFT); + can_attack |= checkAttackDirection(p, Direction.DOWN, Direction.RIGHT); + } + return can_attack; + } +} + diff --git a/src/model/Piece.java b/src/model/Piece.java index b3765a1..cce93ae 100755 --- a/src/model/Piece.java +++ b/src/model/Piece.java @@ -18,6 +18,12 @@ public void updateCoordinates(int x, int y) { this.y = y; } + public Color opposite() { + if(this.color.equals(Color.RED)) return Color.BLACK; + if(this.color.equals(Color.BLACK)) return Color.RED; + return null; + } + public int getX() { return this.x; } diff --git a/src/model/Player.java b/src/model/Player.java index 8f20497..d666dd7 100644 --- a/src/model/Player.java +++ b/src/model/Player.java @@ -4,10 +4,10 @@ public class Player { private ArrayList pieces; - private String name_; + private String name; public Player(String name) { - this.name_ = name; + this.name = name; this.pieces = new ArrayList(); } @@ -20,10 +20,10 @@ public ArrayList getPieces() { } public String getName() { - return name_; + return name; } public void setName(String name) { - this.name_ = name; + this.name = name; } }