वस्तुओं के 2 डी ऐरे मूल्यों को बनाए रखने नहीं

मैं एक शतरंज ऐप विकसित करने वाला एक एंड्रॉइड "डेवलपर" हूं।

InGameActivity क्लास में एक कोड है currentBoardState जिसे public static कहा जाता है। प्रत्येक शतरंज में बूलियन [] [] संभव है बनाता है। यह निम्न विधि possibleMoves ले जाएगी और यह निर्धारित करेगी कि कोई भी चाल खिलाड़ी को स्वयं को जांच में रखेगी और इसे गलत पर सेट करेगी क्योंकि यह अब संभव कदम नहीं है।

@Override
public void eliminateMovesThatPutYouInCheck() {
    ChessPiece[][] originalBoard = InGameActivity.currentBoardState;
    final ChessPiece emptyPiece = new EmptyPiece(Color.EMPTY);
    final ChessPiece tempKnight = new Knight(side);
    //This block eliminates moves that will cause a player
    //to put him/her self in check.
    InGameActivity.currentBoardState[x][y] = emptyPiece;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            if (possibleMoves[i][j] == true) {
                tempKnight.x = i;
                tempKnight.y = j;
                InGameActivity.currentBoardState[i][j] = tempKnight;
                if (InGameActivity.isPlayerInCheck(side)) {
                    possibleMoves[i][j] = false;
                }
                InGameActivity.currentBoardState[i][j] = emptyPiece;
            }
        }
    }
    InGameActivity.currentBoardState = originalBoard;
}

समस्या यह है कि, मेरे currentBoardState चर को गड़बड़ कर दिया जा रहा है और मुझे नहीं पता कि, ive ने मूल्य को क्यों सहेजा है, फिर विधि के अंत में इसे रीसेट करें क्यों यह इसके मूल्यों को खो रहा है?

संपादित करें: यदि आपको इसकी आवश्यकता है तो यहां isPlayerIncheck विधि है, धन्यवाद।

public static boolean isPlayerInCheck(Color side) {
        List opponentsMoves = new ArrayList();
        int xKing = -1;
        int yKing = -1;

        if (side.equals(Color.WHITE)) {
            xKing = whiteKing.x;
            yKing = whiteKing.y;
        } else {
            xKing = blackKing.x;
            yKing = blackKing.y;
        }

        if (side.equals(Color.WHITE)) {
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (currentBoardState[i][j].isBlack()) {
                        opponentsMoves.add(currentBoardState[i][j].possibleMoves);
                    }
                }
            }
            for (boolean[][] b : opponentsMoves) {
                for (int i = 0; i < 8; i++) {
                    for (int j = 0; j < 8; j++) {
                        if (b[xKing][yKing] == true) {
                            return true;
                        }
                    }
                }
            }
            return false;

        } else {
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (currentBoardState[i][j].isWhite()) {
                        opponentsMoves.add(currentBoardState[i][j].possibleMoves);
                    }
                    if (currentBoardState[i][j].isBlack() && currentBoardState[i][j].getType().equals(Type.KING)) {
                        xKing = currentBoardState[i][j].x;
                        yKing = currentBoardState[i][j].y;
                    }
                }
            }
            for (boolean[][] b : opponentsMoves) {
                for (int i = 0; i < 8; i++) {
                    for (int j = 0; j < 8; j++) {
                        if (b[xKing][yKing] == true) {
                            return true;
                        }
                    }
                }
            }
            return false;

        }
    }

साथ ही, मैं समझता हूं और सराहना करता हूं कि मेरा कोड शायद बहुत अक्षम है और डिजाइन शतरंज के लिए भयानक है लेकिन वास्तव में यह नहीं है कि मैं इस समय के बारे में चिंतित हूं।

4
जोड़ा संपादित
विचारों: 1
अस्पष्टता के लिए खेद है, विधि से पहले मेरे currentBoardState में ChessPiece प्रकार King Queen आदि आदि है, लेकिन जब मैं विधि का उपयोग करता हूं, तो प्रत्येक सेल केवल शतरंज प्रकार खाली है
जोड़ा लेखक Ogen, स्रोत
ठीक है, लेकिन इसका क्या अर्थ है कि "आपका currentBoardState चर गड़बड़ हो रहा है "!
जोड़ा लेखक Eel Lee, स्रोत
क्या आपका मतलब यह मूल बोर्ड पर रीसेट नहीं कर रहा है?
जोड़ा लेखक initramfs, स्रोत

3 उत्तर

मैं गड़बड़ कर रहा हूं का मानना ​​है कि आपका मतलब है currentBoardState चर मूल बोर्ड पर "रीसेट" नहीं किया जा रहा है।

यह इस पंक्ति के कारण है:

ChessPiece[][] originalBoard = InGameActivity.currentBoardState;

वर्तमान बोर्ड स्थिति के संदर्भ को परिवर्तनीय originalBoard पर पास करना।

जैसा कि आप currentBoardState में संशोधन करते हैं, चूंकि originalBoard वेरिएबल पॉइंट एक ही ऑब्जेक्ट में होते हैं, इसलिए यह भी संशोधित हो जाता है।

सरणी को originalBoard चर में इस तरह कॉपी करें:

ChessPiece[][] originalBoard = new ChessPiece[InGameActivity.currentBoardState.length][];
for(int i = 0; i < InGameActivity.currentBoardState.length; i++){
    ChessPiece[] pieces = InGameActivity.currentBoardState[i];
    int len = pieces.length;
    originalBoard[i] = new ChessPiece[len];
    System.arraycopy(pieces, 0, originalBoard[i], 0, len);
}

//Rest of code here...

केवल तभी जब आप value द्वारा कॉपी करते हैं तो डेटा की वास्तविक प्रति मौजूद होती है। असाइनमेंट ऑपरेटर का उपयोग करके आदिम प्रकारों और कुछ अपरिवर्तनीय डेटा को रद्द करना = केवल एलएचएस को आरएचएस का संदर्भ निर्दिष्ट करता है।

2
जोड़ा
मैं अब कोशिश करूँगा और आपसे वापस आऊंगा। तो यही वह है जो "संदर्भ द्वारा गुजर रहा है" और "मूल्य से गुज़रना" चीज है ...
जोड़ा लेखक Ogen, स्रोत
धन्यवाद यह काम किया
जोड़ा लेखक Ogen, स्रोत
मैं निश्चित रूप से यह जानने का प्रयास करूँगा कि क्या हो रहा था> _ <�धन्यवाद।
जोड़ा लेखक Ogen, स्रोत
@ मदद करने के लिए खुशी जोड़ें। मैं अनुशंसा करता हूं कि आप संदर्भ द्वारा पास करें बनाम मूल्य से गुजरें क्योंकि यह प्रोग्रामिंग में एक बहुत ही मौलिक अवधारणा है और यदि आप नोट नहीं लेते हैं तो वास्तव में आपको खराब कर देंगे इसका :)
जोड़ा लेखक initramfs, स्रोत

अगर मैं आपके कोड को सही ढंग से समझता हूं, तो मुझे लगता है कि आपको मूल को एक नई सरणी में कॉपी करने की आवश्यकता है, उदाहरण के लिए:

ChessPiece[][] originalBoard = Arrays.copyOf(
    InGameActivity.currentBoardState, InGameActivity.currentBoardState.length);

यह मूल सरणी के संशोधन को रोकता है।

1
जोड़ा
क्या यह सिर्फ = ऑपरेटर का उपयोग करने के बराबर नहीं है?
जोड़ा लेखक Ogen, स्रोत
नहीं। = का उपयोग कर सरणी संदर्भ की प्रतिलिपि बनायेगा, मूल्य नहीं।
जोड़ा लेखक ThomasEdwin, स्रोत

आपको यहां समस्या है:

if (possibleMoves[i][j]) 
{ 
    tempKnight.x = i;
    tempKnight.y = j;
    InGameActivity.currentBoardState[i][j] = tempKnight;
    if (InGameActivity.isPlayerInCheck(side))
    {
       possibleMoves[i][j] = false;
    }
    /** whatever was before next line resets the value at i,j: puts empty piece here */
    InGameActivity.currentBoardState[i][j] = emptyPiece;
}
0
जोड़ा