diff --git a/src/model/Board.java b/src/model/Board.java index 3dc164a..91618e8 100755 --- a/src/model/Board.java +++ b/src/model/Board.java @@ -4,11 +4,60 @@ 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; + } + public void initBoard() { for(int row = 0; row < 3; row++){ @@ -52,7 +101,6 @@ public boolean isOccupied(int row, int col) { return representation[row][col] != null; } - - - + } + diff --git a/src/model/Piece.java b/src/model/Piece.java index 332e29c..6eea5bc 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 new file mode 100644 index 0000000..6036244 --- /dev/null +++ b/src/model/Player.java @@ -0,0 +1,25 @@ +package model; + +import java.util.ArrayList; + +public class Player { + private ArrayList pieces; + public final String name; + + public Player(String name) { + this.name = name; + this.pieces = new ArrayList(); + } + + public void addPiece(Piece p) { + pieces.add(p); + } + + public ArrayList getPieces() { + return pieces; + } + + public String getName() { + return name; + } +}