basic model
This commit is contained in:
107
app/src/main/java/chess/model/ChessBoard.java
Normal file
107
app/src/main/java/chess/model/ChessBoard.java
Normal file
@@ -0,0 +1,107 @@
|
||||
package chess.model;
|
||||
|
||||
import chess.model.visitor.KingIdentifier;
|
||||
import chess.model.visitor.PiecePathChecker;
|
||||
|
||||
public class ChessBoard {
|
||||
public static class Cell {
|
||||
private Piece piece;
|
||||
|
||||
public Cell() {
|
||||
this.piece = null;
|
||||
}
|
||||
|
||||
public Piece getPiece() {
|
||||
return piece;
|
||||
}
|
||||
|
||||
public void setPiece(Piece piece) {
|
||||
this.piece = piece;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final Cell[][] cells;
|
||||
|
||||
public ChessBoard() {
|
||||
this.cells = new Cell[Coordinate.VALUE_MAX][Coordinate.VALUE_MAX];
|
||||
}
|
||||
|
||||
public void applyMove(Move move) {
|
||||
assert (move.isValid());
|
||||
Piece deadPiece = pieceAt(move.getFinish());
|
||||
if (deadPiece != null) {
|
||||
deadPiece.eject();
|
||||
}
|
||||
Piece movingPiece = pieceAt(move.getStart());
|
||||
pieceComes(movingPiece, move.getFinish());
|
||||
pieceLeaves(move.getStart());
|
||||
}
|
||||
|
||||
public void undoMove(Move move) {
|
||||
// for later
|
||||
}
|
||||
|
||||
public boolean isCellEmpty(Coordinate coordinate) {
|
||||
return pieceAt(coordinate) == null;
|
||||
}
|
||||
|
||||
public Piece pieceAt(Coordinate coordinate) {
|
||||
assert (coordinate.isValid());
|
||||
return cellAt(coordinate).getPiece();
|
||||
}
|
||||
|
||||
public void clearBoard() {
|
||||
for (int i = 0; i < Coordinate.VALUE_MAX; i++) {
|
||||
for (int j = 0; j < Coordinate.VALUE_MAX; j++) {
|
||||
pieceLeaves(new Coordinate(i, j));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Cell cellAt(Coordinate coordinate) {
|
||||
return this.cells[coordinate.getX()][coordinate.getY()];
|
||||
}
|
||||
|
||||
private void pieceComes(Piece piece, Coordinate coordinate) {
|
||||
cellAt(coordinate).setPiece(piece);
|
||||
}
|
||||
|
||||
private void pieceLeaves(Coordinate coordinate) {
|
||||
cellAt(coordinate).setPiece(null);
|
||||
}
|
||||
|
||||
public Coordinate findKing(Color color) {
|
||||
KingIdentifier kingIdentifier = new KingIdentifier(color);
|
||||
for (int i = 0; i < Coordinate.VALUE_MAX; i++) {
|
||||
for (int j = 0; j < Coordinate.VALUE_MAX; j++) {
|
||||
Coordinate coordinate = new Coordinate(i, j);
|
||||
Piece piece = pieceAt(coordinate);
|
||||
if (piece != null && kingIdentifier.visit(piece)) {
|
||||
return coordinate;
|
||||
}
|
||||
}
|
||||
}
|
||||
assert false : "No king found ?!";
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean isKingInCheck(Color color) {
|
||||
Coordinate kingPos = findKing(color);
|
||||
assert kingPos.isValid() : "King position is invalid!";
|
||||
|
||||
for (int i = 0; i < Coordinate.VALUE_MAX; i++) {
|
||||
for (int j = 0; j < Coordinate.VALUE_MAX; j++) {
|
||||
Coordinate attackCoords = new Coordinate(i, j);
|
||||
Piece attackPiece = pieceAt(attackCoords);
|
||||
if (attackPiece == null)
|
||||
continue;
|
||||
|
||||
PiecePathChecker checker = new PiecePathChecker(this, new Move(attackCoords, kingPos));
|
||||
if (checker.isValidForPiece(attackPiece))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user