gpt4 book ai didi

java - 国际象棋压缩 : problems when calling Position#doMove()

转载 作者:行者123 更新时间:2023-11-30 04:50:45 25 4
gpt4 key购买 nike

在使用 Chesspresso 0.9.2 方法 Position#doMove(short move) 来添加 Action 时,我遇到了麻烦。非法移动似乎和合法移动一样被接受,尽管方法 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() 方法中),则不会发生任何变化:无论所有移动的法律状态如何。

这是 chesspresso 的问题,还是简单的使用不当?

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

最佳答案

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

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

关于java - 国际象棋压缩 : problems when calling Position#doMove(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9874208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com