我遇到了麻烦当使用Chesspresso 0.9.2方法Position#doMove(short move)时,要添加动作。尽管方法Game#doMove()应该抛出IllegalMoveException,但非法移动和合法移动似乎都可以接受。
这是我的实验课:
package com.gmail.bernabe.laurent.j2se.chesspresso_test;
import javax.swing.JFrame;
import chesspresso.Chess;
import chesspresso.game.Game;
import chesspresso.game.view.GameBrowser;
import chesspresso.move.IllegalMoveException;
import chesspresso.move.Move;
public class ChessFrame extends JFrame {
public ChessFrame(){
setTitle("Chesspresso gamebrowser test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(gameBrowser);
pack();
addMove(Chess.E2, Chess.E4, false, "Debut pour une partie ouverte");
addMove(Chess.E7, Chess.E5, false, "Reponse symetrique forte");
addMove(Chess.G1, Chess.F3, false, null);
addMove(Chess.B8, Chess.C6, false, null);
addMove(Chess.F1, Chess.B5, false, null);
}
private void addMove(int fromSquareIndex, int toSquareIndex,
boolean isCapturingMove, String comment){
try {
short move = Move.getRegularMove(fromSquareIndex, toSquareIndex,
isCapturingMove);
if (Move.isValid(move)) {
chessGame.getPosition().doMove(move);
if (comment != null && comment.length() > 0)
chessGame.addComment(comment);
}
} catch (IllegalMoveException e) {
e.printStackTrace();
}
}
private Game chessGame = new Game();
private GameBrowser gameBrowser = new GameBrowser(chessGame);
private static final long serialVersionUID = -6856238414376776882L;
}
这是我的主要班级:
package com.gmail.bernabe.laurent.j2se.chesspresso_test;
public class ChesspressoGraphicalTest {
public static void main(String[] args) {
ChessFrame chessFrame = new ChessFrame();
chessFrame.setVisible(true);
}
}
如您所见,我继承了我的JFrame自定义类中的ChessPresso GameBrowser类,以便在我编写的国际象棋开头中导航(Ruy Lopez)。 addMove方法包装所有Chesspresso调用,以便仅在一行中添加移动和注释。
如果启动类ChesspressoGraphicalTest,您将看到一个框架,其中显示带有代表该棋子的字母的棋盘(这是默认的Chesspresso GameBrowser实现和行为):您可以阅读棋步,转到下一棋,再回到旧棋。 ..多亏了面板底部的按钮。
所以有什么问题 ?这很简单:进行非法举动时(
addPawnMove(Chess.E2, Chess.F8, false, "Debut pour une partie ouverte");
例如代替第一个举动),根本没有检测到这一点。我没有收到任何IllegalMoveException。
此外,如果删除测试Move.isValid(move)(在addMove()方法中),则任何更改都不会改变:无论所有移动的合法状态如何。
是Chespresso问题,还是简单的错误使用?
任何帮助表示赞赏。谢谢。
最佳答案
Move.isValidMove(move)检查移动本身是否已创建为有效移动或无效移动。它不会检查移动本身在游戏的某些时间内是否有效。
您需要做的是使用游戏的位置来获取有效移动的列表(不要自己创建移动)。您也可以使用ChessGame.getPosition()。getPieceMove(...),它将返回有效或无效的移动。