2011-10-31 12 views
6

मैं एक शतरंज गेम लिखने की कोशिश कर रहा हूं और पाया कि मुझे स्टेलेमेट स्थिति खोजने के लिए समाधान नहीं मिल रहे हैं। मैं गूगल करने की कोशिश कर रहा हूं, लेकिन कुछ भी नहीं मिला। क्या कोई प्रसिद्ध एल्गोरिदम या कुछ है?शतरंज स्टेलेमेट नियम को कैसे कोड करें?

+6

[chessprogramming] (http://chessprogramming.wikispaces.com/Stalemate) wikispace – Bart

उत्तर

9

आपका चाल जनरेटर दो अलग-अलग डिज़ाइनों में से एक होगा;

  • या तो इसे वैधता के लिए जाँच करता चलता रहता है
  • पैदा करने या आप सभी संभावित चाल पैदा करते हैं और उन है कि बाद में अवैध हैं को दूर करते हुए।

पूर्व बेहतर है क्योंकि इसे पोस्ट-प्रोसेसिंग की आवश्यकता नहीं है।

एक स्टेलेमेट स्थिति केवल एक है जहां कोई कानूनी चाल नहीं है और चलती-पक्ष का राजा चेक में नहीं है। एक चेकमेट शर्त वह जगह है जहां कोई कानूनी चाल नहीं है लेकिन चलती-पक्ष के राजा चेक में है।

दूसरे शब्दों में यदि आपने यह पता लगाया है कि चेक और चेकमैट का पता लगाने के लिए, आपको पहले से ही स्टेलेमेट का पता लगाने के लिए आवश्यक सब कुछ मिल गया है।

2

यहाँ क्लासिक शतरंज खेल के लिए सभी नियमों के साथ एक ओपन-सोर्स कोड है: https://github.com/cjortegon/basic-chess

आप सही परियोजना (Android, iOS, डेस्कटॉप और वेब) क्लोनिंग के बाद परियोजना चला सकते हैं, या आप कर सकते हैं मुख्य तर्क का उपयोग करें, जो यहां है: https://github.com/cjortegon/basic-chess/tree/master/libgdx/core/src/com/mountainreacher/chess/model

मैंने 3-क्षणों के एल्गोरिदम पर अपना समाधान आधारित किया, पहला पल तब होता है जब खिलाड़ी बोर्ड से एक टुकड़ा चुनता है, तब जब इस टुकड़े का गंतव्य चुना गया है और अंत में जब टुकड़ा उस स्थिति तक पहुंच जाता है (यह मानते हुए कि यह एनिमेटेड गेम है, यदि नहीं, तो आप चरण 2 और 3 मर्ज कर सकते हैं)।

जावा में निम्नलिखित कोड लागू किया गया है। मॉडल वर्ग के गुणों से:

boolean turn; 
GenericPiece selected, conquest; 
ClassicBoard board; 
List<int[]> possibleMovements; 
int checkType; 

पहली विधि क्षणों 1, 2 और विशेष 'विजय' पल संभाल लेंगे (टुकड़ा मोहरा के लिए लागू केवल):

public boolean onCellClick(int row, int column) { 
    if (row == -1 && conquest != null) { 
     checkType = 0; 
     conquest.changeFigure(column); 
     return true; 
    } else if (selected != null) { 
     if (possibleMovements != null) { 
      for (int[] move : possibleMovements) { 
       if (move[0] == row && move[1] == column) { 
        // Move the PieceActor to the desired position 
        if (selected.moveTo(row, column)) { 
         turn = !turn; 
        } 
        break; 
       } 
      } 
     } 
     selected = null; 
     possibleMovements = null; 
     return true; 
    } else { 
     selected = board.getSelected(turn ? Piece.WHITE_TEAM : Piece.BLACK_TEAM, row, column); 
     if (selected != null) { 
      possibleMovements = new ArrayList<>(); 
      possibleMovements.addAll(((GenericPiece) selected).getMoves(board, false)); 
      // Checking the movements 
      board.checkPossibleMovements(selected, possibleMovements); 
      if (possibleMovements.size() == 0) { 
       possibleMovements = null; 
       selected = null; 
       return false; 
      } else { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

और निम्न विधि जाँच के साथी और का विजय अभियान नियमित टुकड़ा आंदोलनों, कैसलिंग, चेक,: 3rd पल संभाल लेंगे (जब एनीमेशन खत्म):

public void movedPiece(Piece piece) { 
    Gdx.app.log(TAG, "movedPiece(" + piece.getType() + ")"); 

    // Killing the enemy 
    Piece killed = board.getSelectedNotInTeam(piece.getTeam(), 
      piece.getRow(), piece.getColumn()); 
    if (killed != null) { 
     killed.setAvailable(false); 
    } 

    // Checking hacks 
    GenericPiece[] threat = board.kingIsInDanger(); 
    if (threat != null) { 
     checkType = board.hasAvailableMoves(threat[0].getTeam()) ? CHECK : CHECK_MATE; 
    } else { 
     checkType = NO_CHECK; 
    } 

    // Checking castling 
    if (piece.getFigure() == Piece.ROOK && ((GenericPiece) piece).getMovesCount() == 1) { 
     Piece king = board.getSelected(piece.getTeam(), 
       piece.getRow(), piece.getColumn() + 1); 
     if (king != null && king.getFigure() == Piece.KING && ((GenericPiece) king).getMovesCount() == 0) { 
      // Left Rook 
      if (board.getSelected(piece.getRow(), piece.getColumn() - 1) == null) { 
       king.moveTo(piece.getRow(), piece.getColumn() - 1); 
      } 
     } else { 
      king = board.getSelected(piece.getTeam(), 
        piece.getRow(), piece.getColumn() - 1); 
      if (king != null && king.getFigure() == Piece.KING && ((GenericPiece) king).getMovesCount() == 0) { 
       // Right Rook 
       if (board.getSelected(piece.getRow(), piece.getColumn() + 1) == null) { 
        king.moveTo(piece.getRow(), piece.getColumn() + 1); 
       } 
      } 
     } 
    } 

    // Conquest 
    else if (piece.getFigure() == Piece.PAWN && (piece.getRow() == 0 || piece.getRow() == board.getRows() - 1)) { 
     conquest = (GenericPiece) piece; 
     checkType = CONQUEST; 
    } 
} 

कि कोड सहित क्लासिक शतरंज, से सभी नियमों को शामिल किया गया प्यादे।

+0

पर एक नज़र डालें, ये अच्छे लिंक हैं, लेकिन एक नियम के रूप में, एक उत्तर उचित रूप से स्वयं निहित होना चाहिए। लिंक स्थानांतरित हो जाते हैं और समाप्त हो जाते हैं, लेकिन ये उत्तर यहां हैं ... अच्छा, वास्तव में लंबा समय। –

+0

@ डेविड लाइवली मैंने गिटूब रिपोजिटरी से कोड के आवश्यक हिस्सों को शामिल किया है। –

संबंधित मुद्दे