检查国际象棋中的将死

时间:2015-05-22 15:52:43

标签: algorithm chess

我正在使用this面向对象的国际象棋设计。我已经为所有作品生成了有效的动作。现在我正在尝试检查同伴。

我尝试制作一种方法,如果玩家有动作,则取消将死。但程序以StackOverflowError结束。

我删除了该方法。但是该方法的伪算法就像那样

boolean isGameOver(arg){
    if(playerIsInCheck){
        if(!hasValidMoves){
            print("checkmate");
            return true;
        }
        else{
            return false;
        }
    }
    else{
        if(!hasValidMoves){
            print("stalemate");
            return true;
        }
        else{
            return false;
        }
    }
}

我不知道如何检查此举是否取消了将死。任何人都可以建议我吗?我不需要用任何编程语言编写的所有代码。伪算法就足够了。

2 个答案:

答案 0 :(得分:1)

我不能告诉你为什么你没有看到你的方法定义就得到了堆栈溢出,但我可以解释你如何检查配对取消移动(没有伪代码,抱歉)。

基本上,你生成一个包含所有可能的Move(Pseudolegals)的列表,然后让你的程序尝试每一个。如果玩家王在结果位置不再可以击中(在你使用IsInCheck方法的情况下),当前的移动正在取消配合。

如果你确实需要伪代码,请写评论,我会看到我能做什么。

答案 1 :(得分:1)

检查将死的算法如下:

public boolean checkmated(Player player) {
  if (!player.getKing().inCheck() || player.isStalemated()) {
      return false; //not checkmate if we are not 
                    //in check at all or we are stalemated.
  }

  //therefore if we get here on out, we are currently in check...

  Pieces myPieces = player.getPieces();

  for (Piece each : myPieces) {

      each.doMove(); //modify the state of the board

      if (!player.getKing().inCheck()) { //now we can check the modified board
          each.undoMove(); //undo, we dont want to change the board
          return false;
          //not checkmate, we can make a move, 
          //that results in our escape from checkmate.
      }

      each.undoMove();

  }
  return true; 
  //all pieces have been examined and none can make a move and we have       
  //confimred earlier that we have been previously checked by the opponent
  //and that we are not in stalemate.
}