Added click support & changed Piece's move
This commit is contained in:
parent
e2dd3f29f0
commit
4c7bce01f8
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ public interface IPiece {
|
|||
|
||||
PieceColor getColor();
|
||||
|
||||
boolean move(PiecePosition pos);
|
||||
void move(PiecePosition pos);
|
||||
|
||||
Player getPlayer();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue