diff --git a/Bishop.java b/Bishop.java index 53db7fa..ca39c15 100644 --- a/Bishop.java +++ b/Bishop.java @@ -15,10 +15,10 @@ public class Bishop extends Piece { public ArrayList getPseudoLegalMoves(Board board) { ArrayList positions = new ArrayList(); - positions.addAll(slide(board, -1, -1)); - positions.addAll(slide(board, 1, -1)); - positions.addAll(slide(board, -1, 1)); - positions.addAll(slide(board, 1, 1)); + positions.addAll(slide(board, -1, -1, 7)); + positions.addAll(slide(board, 1, -1, 7)); + positions.addAll(slide(board, -1, 1, 7)); + positions.addAll(slide(board, 1, 1, 7)); return positions; } diff --git a/Board.java b/Board.java index 9ecbfad..2f851dd 100644 --- a/Board.java +++ b/Board.java @@ -48,6 +48,17 @@ public class Board { } } + public void castle(King king, boolean kingSide) { + int row = king.pos.y; + if (kingSide) { + move(king, new Position(6, row)); + move(board[7][row], new Position(5, row)); + } else { + move(king, new Position(2, row)); + move(board[0][row], new Position(3, row)); + } + } + public void draw(Graphics g) { for (Piece[] row : board) { for (Piece p : row) { diff --git a/Chess.java b/Chess.java index 9756be1..cb95783 100644 --- a/Chess.java +++ b/Chess.java @@ -103,8 +103,11 @@ public class Chess extends JPanel implements ActionListener, MouseListener { } // if selecting a blank square -- must have one of ours selected else if (selected != null && selected.color.equals(turnColor) && legalMoves.contains(pos)) { - - board.move(selected, pos); + if (selected instanceof King && Math.abs(pos.x - selected.pos.x) == 2) { + board.castle((King) selected, pos.x > selected.pos.x); + } else { + board.move(selected, pos); + } selected = null; legalMoves = null; turnColor = turnColor.equals("White") ? "Black" : "White"; diff --git a/King.java b/King.java index d3b630c..e4f4588 100644 --- a/King.java +++ b/King.java @@ -30,6 +30,30 @@ public class King extends Piece { positions.add(test); } } + int colorPos = this.color.equals("White") ? 7 : 0; + boolean leftOpen = true; + boolean rightOpen = true; + if (!this.hasMoved && !inCheck(board,pos)){ + if(board.getPiece(7,colorPos) instanceof Rook && !Rook.class.cast(board.getPiece(7,colorPos)).hasMoved){ + ArrayList right = this.slide(board,1,0,2); + + for (Position p : new ArrayList<>(right)){ + if (inCheck(board,p)){ + rightOpen = false; + } + } + if (rightOpen) {positions.add(new Position(pos.x+2,pos.y));} + } + if (board.getPiece(0,colorPos) instanceof Rook && !Rook.class.cast(board.getPiece(0,colorPos)).hasMoved){ + + ArrayList left = this.slide(board,-1,0,2); + for (Position p : new ArrayList<>(left)){ + if (inCheck(board,p)){ + leftOpen = false; + } + } + if (leftOpen) positions.add(new Position(pos.x - 2, pos.y)); + }} return positions; } diff --git a/Piece.java b/Piece.java index 2a8d348..0937e7d 100644 --- a/Piece.java +++ b/Piece.java @@ -27,10 +27,10 @@ public abstract class Piece { return this.color.equals(p.color); } - public ArrayList slide(Board board, int dx, int dy) { + public ArrayList slide(Board board, int dx, int dy, int maxSteps) { ArrayList positions = new ArrayList<>(); int step = 1; - while (true) { + while (step < maxSteps) { Position test = new Position(pos.x + step * dx, pos.y + step * dy); if (!Board.inBounds(test)) break; if (board.isOpen(test)) { diff --git a/Queen.java b/Queen.java index a542972..5af3d79 100644 --- a/Queen.java +++ b/Queen.java @@ -15,14 +15,14 @@ public class Queen extends Piece { public ArrayList getPseudoLegalMoves(Board board) { ArrayList positions = new ArrayList(); - positions.addAll(slide(board, -1, -1)); - positions.addAll(slide(board, 1, -1)); - positions.addAll(slide(board, -1, 1)); - positions.addAll(slide(board, 1, 1)); - positions.addAll(slide(board, 1, 0)); - positions.addAll(slide(board, -1, 0)); - positions.addAll(slide(board, 0, 1)); - positions.addAll(slide(board, 0, -1)); + positions.addAll(slide(board, -1, -1, 7)); + positions.addAll(slide(board, 1, -1, 7)); + positions.addAll(slide(board, -1, 1, 7)); + positions.addAll(slide(board, 1, 1, 7)); + positions.addAll(slide(board, 1, 0, 7)); + positions.addAll(slide(board, -1, 0, 7)); + positions.addAll(slide(board, 0, 1, 7)); + positions.addAll(slide(board, 0, -1, 7)); return positions; } diff --git a/Rook.java b/Rook.java index b1053ac..b7d6110 100644 --- a/Rook.java +++ b/Rook.java @@ -17,10 +17,10 @@ public class Rook extends Piece { public ArrayList getPseudoLegalMoves(Board board) { ArrayList positions = new ArrayList(); - positions.addAll(slide(board, 1, 0)); - positions.addAll(slide(board, -1, 0)); - positions.addAll(slide(board, 0, 1)); - positions.addAll(slide(board, 0, -1)); + positions.addAll(slide(board, 1, 0, 7)); + positions.addAll(slide(board, -1, 0, 7)); + positions.addAll(slide(board, 0, 1, 7)); + positions.addAll(slide(board, 0, -1, 7)); return positions; }