Chesspresso:调用Position#doMove()时出现问题

时间:2012-03-26 14:38:32

标签: java chess

我遇到了麻烦当使用Chesspresso 0.9.2方法时,位置#doMove(短移动),以便添加动作。非法移动似乎被接受以及合法移动,但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类,您将看到一个Frame,其中显示了用于表示该块的字母(这是默认的Chesspresso GameBrowser实现和行为):您可以阅读移动,转到下一步,返回到旧的举动...感谢板底部的按钮。

那么,问题是什么?这非常简单:非法行动时(

 addPawnMove(Chess.E2, Chess.F8, false, "Debut pour une partie ouverte"); 

例如代替第一步),根本没有检测到这一个。我没有得到任何IllegalMoveException。

此外,如果我删除测试Move.isValid(move)(在addMove()方法中),则不会改变:所有移动的合法状态都是。

是象牙咖啡问题,还是简单的使用它?

任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

Move.isValidMove(move)检查移动本身是否已创建为有效移动或无效移动。在游戏的某个时间内,它不会检查移动本身是否有效。

您需要做的是使用游戏的位置来获取有效移动的列表(不要自己创建移动)。您还可以使用chessGame.getPosition()。getPieceMove(...),它将返回有效或无效的移动。