Added coverage area & improved King's possible moves

This commit is contained in:
Filip Znachor 2023-04-17 23:23:09 +02:00
parent fd4e5387aa
commit b5f20725c1
11 changed files with 63 additions and 27 deletions

View file

@ -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;
}

View file

@ -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) {

View file

@ -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;
}
}
}
}

View file

@ -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();

View file

@ -51,6 +51,8 @@ public interface IPiece {
boolean[][] getPossibleMoves();
boolean[][] getPossibleMoves(boolean theoretical);
PieceColor getColor();
boolean move(PiecePosition pos);

View file

@ -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;

View file

@ -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};

View file

@ -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;

View file

@ -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;
}

View file

@ -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) {

View file

@ -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) {