यह प्रश्न मेरे कोड को देखे बिना हल करने के लिए काफी बड़ा और मुश्किल है, और यदि यह बहुत अधिक है, तो दायरा शायद बहुत बड़ा है और मैं सवाल हटा दूंगा। मूल रूप से मैं छोड़करचेक(औरइस प्रकार भी शह और मात नहीं, गतिरोध, आदि) कार्यान्वित शतरंज के नियमों के सभी के साथ एक काम शतरंज खेल है।शतरंज गेम में "चेक" लागू करना
मैं अपने शतरंज के स्क्वायर को दो बूलियनों को निर्दिष्ट करके चेक लागू करने के बारे में गया: protectedByWhite
और protectedByBlack
। वहाँ की जांच के साथ तर्क के दो मुख्य टुकड़े कर रहे हैं: का कारण बनता है एक कदम व्हाइट द्वारा किया जाता है
- अगर वह अपने राजा एक वर्ग कि है
protectedByBlack
पर हो सकता है, और काले के साथ इसके विपरीत, इस कदम "पूर्ववत" है । - यदि व्हाइट द्वारा एक कदम बनाया जाता है जो ब्लैक के राजा को
protectedByWhite
पर एक वर्ग पर होने का कारण बनता है, और इसके विपरीत ब्लैक के साथ, ब्लैक के अगले कदम को अपने राजा को उस वर्ग पर रखना चाहिए जोprotectedByWhite
नहीं है।
इस प्रकार तर्क काफी सरल है। मेरे ChessBoard
कक्षा में, मेरे पास testCheckWhite
और testCheckBlack
फ़ंक्शन हैं जिन्हें हर कदम के बाद बुलाया जाता है। मूव को मेरे Square
वर्ग (एक साधारण माउस क्लिक फ़ंक्शन) में बुलाया जाता है।
मुख्य समस्या यह है कि कोड छोटी है ... और मुझे यकीन नहीं है कि क्यों/कहाँ। मुख्य बग यह है कि:
- जब काला या सफेद चेक में होते हैं, यदि वे एक कदम बढ़ाते हैं जहां वे अभी भी चेक में होंगे, तो चाल पूर्ववत नहीं होती है। मुझे पता है कि पूर्ववत कार्य ठीक काम कर रहा है, तो कुछ मेरा तर्क गलत कैसे है।
उदाहरण के लिए, मेरे पास उस तरफ लेबल हैं जो काले/सफेद जांच में हैं जब चेतावनी देते हैं। जब मैं शुरुआत में प्रतिद्वंद्वी को "चेक" करता हूं, तो लेबल मुझे चेक के बारे में सूचित करता है। हालांकि, जब मैं राजा को एक वर्ग में ले जाने की कोशिश करता हूं जहां मैं अभी भी जांच में रहूंगा, तो लेबल गलत तरीके से कहता है कि कोई चेक नहीं है। मैं अब कुछ समय के लिए काम कर रहा हूं यह पहचानने की कोशिश कर रहा हूं कि मैं कहां गलत हो गया हूं, और मैं कुछ दिशा का उपयोग कर सकता हूं।
प्रासंगिक कोड:
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();
}