Added click support & changed Piece's move

This commit is contained in:
Filip Znachor 2023-04-18 22:04:15 +02:00
parent e2dd3f29f0
commit 4c7bce01f8
6 changed files with 81 additions and 49 deletions

View file

@ -211,19 +211,13 @@ public abstract class AbstractPiece implements IPiece {
return chessboard.isEndangered(player, x, y);
}
public boolean move(PiecePosition pos) {
boolean[][] moves = getPossibleMoves();
if(moves[pos.y][pos.x]) {
boolean[][] lastMove = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
lastMove[y][x] = true;
lastMove[pos.y][pos.x] = true;
chessboard.showLastMove(lastMove);
chessboard.returnPiece(pos);
moveCount++;
}
chessboard.returnPiece(null);
chessboard.showPossibleMoves(null);
return moves[pos.y][pos.x];
public void move(PiecePosition pos) {
boolean[][] lastMove = new boolean[chessboard.SQUARE_COUNT][chessboard.SQUARE_COUNT];
lastMove[y][x] = true;
lastMove[pos.y][pos.x] = true;
setPosition(pos);
chessboard.showLastMove(lastMove);
moveCount++;
}
public void tracePath(boolean[][] moves, int xDirection, int yDirection) {

View file

@ -233,7 +233,6 @@ public class Chessboard extends JPanel {
if(!isOnBoard(pos.x, pos.y)) return null;
IPiece piece = getPiece(pos);
floating = piece;
this.repaint();
return piece;
}
@ -247,15 +246,12 @@ public class Chessboard extends JPanel {
/**
* Return piece at specified position to the board and unmark it from floating
* @param pos piece position
*/
public void returnPiece(PiecePosition pos) {
public void returnPiece() {
if(floating != null) {
if(pos != null) floating.setPosition(pos);
floating.setOverride(0, 0);
}
floating = null;
this.repaint();
}
public boolean isEndangered(Player player, int x, int y) {

View file

@ -6,23 +6,19 @@ import java.awt.event.MouseEvent;
*/
public class ChessboardMouseAdapter extends MouseAdapter {
long lastClicked;
IPiece selectedPiece;
boolean dragging;
/**
* Detect mouse press and select the piece
* @param me mouse event
*/
public void mousePressed(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
IPiece piece = c.getPiece(pos);
if (piece != null) {
if(piece.getPlayer() != c.getActivePlayer()) return;
c.grabPiece(pos);
c.generateCoverageAreas();
double totalScale = c.pieceScale * c.boardScale;
piece.setOverride(me.getX() - 50 * totalScale, me.getY() - 50 * totalScale);
c.repaint();
c.showPossibleMoves(piece.getPossibleMoves());
}
dragging = false;
lastClicked = System.currentTimeMillis()+250;
}
/**
@ -31,6 +27,57 @@ public class ChessboardMouseAdapter extends MouseAdapter {
*/
@Override
public void mouseDragged(MouseEvent me) {
if(!dragging) {
dragging = true;
onDragStart(me);
}
onDrag(me);
}
/**
* Detect mouse release and place piece on the chessboard
* @param me mouse event
*/
@Override
public void mouseReleased(MouseEvent me) {
if(dragging) onDragEnd(me);
else if(lastClicked > System.currentTimeMillis()) onClick(me);
}
public void onClick(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
IPiece piece = c.getPiece(pos);
if (piece != null && piece.getPlayer() == c.getActivePlayer() && selectedPiece != piece) {
selectedPiece = piece;
c.generateCoverageAreas();
c.showPossibleMoves(piece.getPossibleMoves());
} else if(selectedPiece != null) {
if(selectedPiece.getPossibleMoves()[pos.y][pos.x]) {
selectedPiece.move(pos);
if(c.getActivePlayer().inCheck()) System.out.println("Inactive player in check!");
c.changeActivePlayer();
if(c.getActivePlayer().inCheck()) System.out.println("Active player in check!");
}
c.showPossibleMoves(null);
selectedPiece = null;
}
c.getRootPane().repaint();
}
public void onDragStart(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
IPiece piece = c.getPiece(pos);
if (piece != null && piece.getPlayer() == c.getActivePlayer()) {
c.grabPiece(pos);
c.generateCoverageAreas();
c.showPossibleMoves(piece.getPossibleMoves());
}
}
public void onDrag(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
IPiece piece = c.getFloatingPiece();
if (piece != null) {
@ -40,22 +87,21 @@ public class ChessboardMouseAdapter extends MouseAdapter {
}
}
/**
* Deletect mouse release and place piece on the chessboard
* @param me mouse event
*/
@Override
public void mouseReleased(MouseEvent me) {
public void onDragEnd(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
IPiece piece = c.getFloatingPiece();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
if(piece != null) {
if(piece.move(pos)) {
if(piece.getPossibleMoves()[pos.y][pos.x]) {
piece.move(pos);
c.showPossibleMoves(null);
if(c.getActivePlayer().inCheck()) System.out.println("Inactive player in check!");
c.changeActivePlayer();
if(c.getActivePlayer().inCheck()) System.out.println("Active player in check!");
}
c.returnPiece();
}
c.showPossibleMoves(null);
c.getRootPane().repaint();
}

View file

@ -54,7 +54,7 @@ public interface IPiece {
PieceColor getColor();
boolean move(PiecePosition pos);
void move(PiecePosition pos);
Player getPlayer();

View file

@ -62,16 +62,13 @@ public class King extends AbstractPiece {
}
@Override
public boolean move(PiecePosition pos) {
boolean canMove = super.move(pos);
public void move(PiecePosition pos) {
super.move(pos);
if(moveCount == 1 && x == 6) {
chessboard.grabPiece(new PiecePosition(7, y));
chessboard.returnPiece(new PiecePosition(5, y));
player.getRightRook().setPosition(new PiecePosition(5, y));
}
if(moveCount == 1 && x == 1) {
chessboard.grabPiece(new PiecePosition(0, y));
chessboard.returnPiece(new PiecePosition(3, y));
player.getLeftRook().setPosition(new PiecePosition(3, y));
}
return canMove;
}
}

View file

@ -39,10 +39,9 @@ public class Pawn extends AbstractPiece {
}
@Override
public boolean move(PiecePosition pos) {
boolean result = super.move(pos);
public void move(PiecePosition pos) {
super.move(pos);
int changeY = color == PieceColor.WHITE ? 0 : chessboard.SQUARE_COUNT-1;
if(y == changeY) new Queen(player, x, y);
return result;
}
}