我遇到了麻烦当使用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(...),它将返回有效或无效的移动。

07-24 09:39