Câu hỏi này khá lớn và khó giải quyết mà không cần xem mã của tôi, và nếu nó quá lớn, thì phạm vi có thể quá lớn và tôi sẽ xóa câu hỏi. Về cơ bản tôi có một trò chơi cờ vua làm việc với tất cả các quy tắc của cờ vua trừKiểm tra(vàdo đó cũng không Checkmate, bế tắc, vv) thực hiện.Thực hiện "Kiểm tra" trong Trò chơi Cờ vua
Tôi đã thực hiện Kiểm tra bằng cách chỉ định Hình vuông của Cờ vua của tôi hai booleans: protectedByWhite
và protectedByBlack
. Có hai phần chính của logic với kiểm tra:
- Nếu một động thái được thực hiện bởi trắng gây vua của mình để được trên một vuông đó là
protectedByBlack
, và ngược lại với Black, động thái này là "hoàn tác" . - Nếu di chuyển được thực hiện bởi Trắng khiến vua của Black ở trên một hình vuông là
protectedByWhite
và ngược lại với chuyển động tiếp theo của Black, Black phải đặt vua của mình trên một hình vuông không phải làprotectedByWhite
.
Do đó, logic khá đơn giản. Trong lớp học ChessBoard
của tôi, tôi có các hàm testCheckWhite
và testCheckBlack
được gọi sau mỗi lần di chuyển. Di chuyển được gọi trong lớp Square
của tôi (một chức năng nhấp chuột đơn giản).
Vấn đề chính là mã bị lỗi ... và tôi không chắc chắn tại sao/ở đâu. Lỗi chính là:
- Khi màu đen hoặc trắng ở trong Kiểm tra, nếu chúng di chuyển ở nơi chúng vẫn ở trong Kiểm tra, di chuyển sẽ không được hoàn tác. Tôi biết rằng chức năng hoàn tác đang hoạt động tốt, vì vậy một số cách logic của tôi sai.
Ví dụ: Tôi có nhãn ở bên cảnh báo khi Kiểm tra màu đen/trắng. Khi tôi bước đầu "Kiểm tra" đối thủ, nhãn sẽ thông báo cho tôi về séc. Tuy nhiên, khi tôi cố gắng di chuyển nhà vua đến một quảng trường nơi tôi vẫn sẽ được kiểm tra, nhãn không chính xác nói rằng không có Kiểm tra. Tôi đã làm việc một thời gian để cố gắng xác định nơi tôi đã đi sai, và tôi có thể sử dụng một số hướng.
LIÊN QUAN Mã sản phẩm:
ChessBoard.Java
public static void setProtectedSquares() {
// Reset
for(Square s : BOARD_SQUARES) {
s.protectedByWhite = false;
s.protectedByBlack = false;
}
// Now set protections
for(Square s : BOARD_SQUARES) {
if(s.hasPiece() && s.getPiece().getTeamColor().equals(TeamColor.WHITE)) {
Piece p = s.getPiece();
for(int[] position : p.getLegalMoves(p.getPosition())) {
if(hasSquare(position)) {
getSquare(position).protectedByWhite = true;
}
}
}
}
for(Square s : BOARD_SQUARES) {
if(s.hasPiece() && s.getPiece().getTeamColor().equals(TeamColor.BLACK)) {
Piece p = s.getPiece();
for(int[] position : p.getLegalMoves(p.getPosition())) {
if(hasSquare(position)) {
getSquare(position).protectedByBlack = true;
}
}
}
}
}
public static boolean testCheckWhite() {
// Get king position
int[] whiteKingPosition = new int[]{};
for(Square s : BOARD_SQUARES) {
Piece p = s.getPiece();
if(s.hasPiece() && (p.getPieceType()).equals(PieceType.KING)) {
if((p.getTeamColor()).equals(TeamColor.WHITE)) {
whiteKingPosition = p.getPosition();
}
}
}
if(hasSquare(whiteKingPosition) && getSquare(whiteKingPosition).protectedByBlack) {
GameInfoPanel.inCheckWhite.setText("White is in check");
return true;
} else {
GameInfoPanel.inCheckWhite.setText("White is not in check");
return false;
}
}
public static boolean testCheckBlack() {
// Get king position
int[] blackKingPosition = new int[]{};
for(Square s : BOARD_SQUARES) {
Piece p = s.getPiece();
if(s.hasPiece() && (p.getPieceType()).equals(PieceType.KING)) {
if((p.getTeamColor()).equals(TeamColor.BLACK)) {
blackKingPosition = p.getPosition();
}
}
}
if(hasSquare(blackKingPosition) && getSquare(blackKingPosition).protectedByWhite) {
GameInfoPanel.inCheckBlack.setText("Black is in check");
return true;
} else {
GameInfoPanel.inCheckBlack.setText("Black is not in check");
return false;
}
}
Square.java
.... // If a square is clicked that IS colored...
} else {
for(Square s : ChessBoard.BOARD_SQUARES) {
if(s.hasPiece() && (s.getPiece()).getFocus()) {
// Check to make sure that the target square and current
// square are not the same
if(!this.equals(s)) {
movePiece(s);
ChessBoard.setProtectedSquares();
// Test for check
// 1) Find out what color the moved piece is
if((ChessBoard.getTurn()) == TeamColor.WHITE) {
if(ChessBoard.testCheckWhite()) {
// Undo move
s.movePiece(ChessBoard.getSquare(STORED_POSITION));
GameInfoPanel.gameStatus.setText("Illegal move, white in check");
} else if(ChessBoard.testCheckBlack()) {
// Move is okay, black is now in check
GameInfoPanel.gameStatus.setText("Okay move, black in check");
// Switch players' turn
ChessBoard.switchTurn();
} else {
// Move is okay, nothing happened
GameInfoPanel.gameStatus.setText("No one in check");
// Switch players' turn
ChessBoard.switchTurn();
}
} else {
if(ChessBoard.testCheckBlack()) {
// Undo move
s.movePiece(ChessBoard.getSquare(STORED_POSITION));
GameInfoPanel.gameStatus.setText("Illegal move, black in check");
} else if(ChessBoard.testCheckWhite()) {
// Move is okay, white is now in check
GameInfoPanel.gameStatus.setText("Okay move, white in check");
// Switch players' turn
ChessBoard.switchTurn();
} else {
// Move is okay, nothing happened
GameInfoPanel.gameStatus.setText("No one in check");
// Switch players' turn
ChessBoard.switchTurn();
}
}
}
}
}
// Clear all color and focus
ChessBoard.clearFocus();
ChessBoard.setProtectedSquares();
}