Added coverage area & improved King's possible moves
This commit is contained in:
parent
fd4e5387aa
commit
b5f20725c1
|
@ -209,7 +209,7 @@ public abstract class AbstractPiece implements IPiece {
|
|||
}
|
||||
|
||||
public boolean isEndangered() {
|
||||
return chessboard.isEndangered(color, x, y);
|
||||
return chessboard.isEndangered(player, x, y);
|
||||
}
|
||||
|
||||
public boolean move(PiecePosition pos) {
|
||||
|
@ -238,6 +238,11 @@ public abstract class AbstractPiece implements IPiece {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean[][] getPossibleMoves() {
|
||||
return getPossibleMoves(false);
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ public class Bishop extends AbstractPiece {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean[][] getPossibleMoves() {
|
||||
public boolean[][] getPossibleMoves(boolean theoretical) {
|
||||
boolean[][] moves = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
|
||||
int[] directions = new int[]{-1, 1};
|
||||
for (int xDirection : directions) {
|
||||
|
|
|
@ -133,22 +133,19 @@ public class Chessboard extends JPanel {
|
|||
}
|
||||
}
|
||||
|
||||
g2.setStroke(new BasicStroke(10));
|
||||
for(int i=0; i<SQUARE_COUNT; i++) {
|
||||
for(int j=0; j<SQUARE_COUNT; j++) {
|
||||
if(lastMove != null && lastMove[j][i]) {
|
||||
g2.setTransform(beforeSquares);
|
||||
g2.translate(i*SQUARE_SIZE, j*SQUARE_SIZE);
|
||||
g2.setColor(new Color(50, 50, 250, 25));
|
||||
g2.setColor(new Color(50, 50, 250, 30));
|
||||
g2.fillRect(0, 0, SQUARE_SIZE, SQUARE_SIZE);
|
||||
}
|
||||
if(possibleMoves != null && possibleMoves[j][i]) {
|
||||
g2.setTransform(beforeSquares);
|
||||
g2.translate(i*SQUARE_SIZE, j*SQUARE_SIZE);
|
||||
g2.setColor(new Color(255, 0, 0, 25));
|
||||
g2.fillRect(0, 0, SQUARE_SIZE, SQUARE_SIZE);
|
||||
g2.setColor(new Color(255, 50, 50));
|
||||
g2.drawRect(0, 0, SQUARE_SIZE, SQUARE_SIZE);
|
||||
g2.setColor(new Color(0, 0, 0, 40));
|
||||
g2.fillOval(35, 35, 30, 30);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -257,15 +254,12 @@ public class Chessboard extends JPanel {
|
|||
this.repaint();
|
||||
}
|
||||
|
||||
public boolean isEndangered(PieceColor color, int x, int y) {
|
||||
for (IPiece[] pieces : pieces) {
|
||||
for (IPiece piece : pieces) {
|
||||
if(piece != null && piece.getColor() != color) {
|
||||
if(piece.getPossibleMoves()[y][x] == true) return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
public boolean isEndangered(Player player, int x, int y) {
|
||||
if(!isOnBoard(x, y)) return false;
|
||||
boolean[][] coverageArea;
|
||||
if(player == player1) coverageArea = player2.getCoverageArea();
|
||||
else coverageArea = player1.getCoverageArea();
|
||||
return coverageArea[y][x];
|
||||
}
|
||||
|
||||
public void showPossibleMoves(boolean[][] moves) {
|
||||
|
@ -299,6 +293,30 @@ public class Chessboard extends JPanel {
|
|||
} else {
|
||||
activePlayer = player1;
|
||||
}
|
||||
generateCoverageAreas();
|
||||
}
|
||||
|
||||
public void generateCoverageAreas() {
|
||||
boolean[][] player1Area = new boolean[SQUARE_COUNT][SQUARE_COUNT];
|
||||
boolean[][] player2Area = new boolean[SQUARE_COUNT][SQUARE_COUNT];
|
||||
for (IPiece[] pieces2 : pieces) {
|
||||
for (IPiece piece : pieces2) {
|
||||
if(piece != null) {
|
||||
if(piece.getPlayer() == player1) mergeCoverageAreas(player1Area, piece.getPossibleMoves(true));
|
||||
if(piece.getPlayer() == player2) mergeCoverageAreas(player2Area, piece.getPossibleMoves(true));
|
||||
}
|
||||
}
|
||||
}
|
||||
player1.setCoverageArea(player1Area);
|
||||
player2.setCoverageArea(player2Area);
|
||||
}
|
||||
|
||||
private void mergeCoverageAreas(boolean[][] area1, boolean[][] area2) {
|
||||
for (int y = 0; y < area2.length; y++) {
|
||||
for (int x = 0; x < area2[y].length; x++) {
|
||||
if(area2[y][x]) area1[y][x] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -50,8 +50,9 @@ public class ChessboardMouseAdapter extends MouseAdapter {
|
|||
IPiece piece = c.getFloatingPiece();
|
||||
if(piece != null) {
|
||||
if(piece.move(pos)) {
|
||||
if(c.getActivePlayer().inCheck()) System.out.println("Inactive player in check!");
|
||||
c.changeActivePlayer();
|
||||
if(c.getActivePlayer().inCheck()) System.out.println("Player in check!");
|
||||
if(c.getActivePlayer().inCheck()) System.out.println("Active player in check!");
|
||||
}
|
||||
}
|
||||
c.getRootPane().repaint();
|
||||
|
|
|
@ -51,6 +51,8 @@ public interface IPiece {
|
|||
|
||||
boolean[][] getPossibleMoves();
|
||||
|
||||
boolean[][] getPossibleMoves(boolean theoretical);
|
||||
|
||||
PieceColor getColor();
|
||||
|
||||
boolean move(PiecePosition pos);
|
||||
|
|
|
@ -39,11 +39,11 @@ public class King extends AbstractPiece {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean[][] getPossibleMoves() {
|
||||
public boolean[][] getPossibleMoves(boolean theoretical) {
|
||||
boolean[][] moves = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
|
||||
for(int i = x-1; i <= x+1; i++) {
|
||||
for(int j = y-1; j <= y+1; j++) {
|
||||
setPossibleMove(moves, i, j);
|
||||
if(!chessboard.isEndangered(player, i, j)) setPossibleMove(moves, i, j);
|
||||
}
|
||||
}
|
||||
return moves;
|
||||
|
|
|
@ -31,7 +31,7 @@ public class Knight extends AbstractPiece {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean[][] getPossibleMoves() {
|
||||
public boolean[][] getPossibleMoves(boolean theoretical) {
|
||||
boolean[][] moves = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
|
||||
int[] directions = new int[]{-1, 1};
|
||||
boolean[] trueFalse = new boolean[]{false, true};
|
||||
|
|
|
@ -27,14 +27,13 @@ public class Pawn extends AbstractPiece {
|
|||
|
||||
}
|
||||
|
||||
/* TODO: Allow to get all possible moves if piece is in reach */
|
||||
@Override
|
||||
public boolean[][] getPossibleMoves() {
|
||||
public boolean[][] getPossibleMoves(boolean theoretical) {
|
||||
boolean[][] moves = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
|
||||
int directionY = player.getStartPosition() == StartPosition.TOP ? 1 : -1;
|
||||
for(int i=-1; i<=1; i++) {
|
||||
IPiece piece = chessboard.getPiece(new PiecePosition(x+i, y+directionY));
|
||||
if((i != 0 && piece != null) || (i == 0 && piece == null)) setPossibleMove(moves, x+i, y+directionY);
|
||||
boolean isPieceThere = chessboard.getPiece(new PiecePosition(x+i, y+directionY)) != null;
|
||||
if((i != 0 && (theoretical || isPieceThere)) || (i == 0 && (!theoretical && !isPieceThere))) setPossibleMove(moves, x+i, y+directionY);
|
||||
}
|
||||
if(moveCount == 0 && chessboard.getPiece(new PiecePosition(x, y+directionY)) == null) setPossibleMove(moves, x, y + directionY*2);
|
||||
return moves;
|
||||
|
|
|
@ -12,10 +12,13 @@ public class Player {
|
|||
|
||||
private Rook rightRook;
|
||||
|
||||
private boolean[][] coverageArea;
|
||||
|
||||
public Player(Chessboard chessboard, StartPosition startPosition, PieceColor color) {
|
||||
this.chessboard = chessboard;
|
||||
this.color = color;
|
||||
this.startPosition = startPosition;
|
||||
this.coverageArea = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
|
||||
createPieces();
|
||||
}
|
||||
|
||||
|
@ -47,6 +50,14 @@ public class Player {
|
|||
return startPosition;
|
||||
}
|
||||
|
||||
public void setCoverageArea(boolean[][] area) {
|
||||
coverageArea = area;
|
||||
}
|
||||
|
||||
public boolean[][] getCoverageArea() {
|
||||
return coverageArea;
|
||||
}
|
||||
|
||||
public King getKing() {
|
||||
return king;
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ public class Queen extends AbstractPiece {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean[][] getPossibleMoves() {
|
||||
public boolean[][] getPossibleMoves(boolean theoretical) {
|
||||
boolean[][] moves = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
|
||||
int[] directions = new int[]{-1, 0, 1};
|
||||
for (int xDirection : directions) {
|
||||
|
|
|
@ -31,7 +31,7 @@ public class Rook extends AbstractPiece {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean[][] getPossibleMoves() {
|
||||
public boolean[][] getPossibleMoves(boolean theoretical) {
|
||||
boolean[][] moves = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
|
||||
int[] directions = new int[]{-1, 0, 1};
|
||||
for (int xDirection : directions) {
|
||||
|
|
Loading…
Reference in a new issue