我正在使用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;
}
}
}
我不知道如何检查此举是否取消了将死。任何人都可以建议我吗?我不需要用任何编程语言编写的所有代码。伪算法就足够了。
答案 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.
}