PGN国际象棋解析器,如何处理变化



我正在C#中做一个国际象棋教练。位置来自PGN文件。

国际象棋游戏可以在PGN文件(而不是PNG,它是一个图像文件)中进行注释。例如:2。Qxe4(2。Qxf3 gxf3 3。Kh1 a6(3…a5))2…dxe4这意味着怀特和他的王后(Qxe4)在e4中取得了一块,但他可以玩Qxf3,这是一种变体。问题是如何按顺序存储和检索移动,首先是变体(用括号括起来),最后是主线。变体可以嵌套在另一个中。在这个例子中,第一个变化是:2。Qxf3 gxf3 3。Kh1 a5,第二个2。Qxf3 gxf3 3。Kh1 a6,最后:2。Qxe4-dxe4,我正在正确加载FEN位置,我在字符串[]变量中有移动,但我无法处理变化。括号中包含了这些变体。

你能帮我吗?我如何存储主线和变化,然后检索它们以询问玩家正确的移动?程序首先要求更多的嵌套变体,而主线是最后一行。

我觉得有点像递归函数,买了我不知道怎么处理。

提前谢谢。

您可以编写自己的自上而下的解析器,也可以使用诸如ANTLR之类的解析器生成器工具为您生成解析器。已经有一个正式的PGN语法定义可用于ANTLR,所以这可能是最快的方法。

目前尚不清楚您在解析或表示移动时是否需要帮助,但正如您所说,String[]不起作用,我认为问题在于对移动进行建模。就我个人而言,我只需要用一个类来表示每一个动作,它可以存储许多潜在的下一个动作。例如:

private static class ChessMove {
    private String algebraicMove;
    private List<ChessMove> nextMoves = new ArrayList<>();
    // Maybe add a variation number too?
    public ChessMove(String algebraicMove) {
        this.algebraicMove = algebraicMove;
    }
    public void addMove(ChessMove chessMove) {
        nextMoves.add(chessMove);
    }
    public List<ChessMove> getNextMoves() {
        return nextMoves;
    }
}
public static void main(String[] args) throws Exception {
    ChessMove firstMove = new ChessMove("e4");
    firstMove.addMove(new ChessMove("e6")); // Add French defence
    firstMove.addMove(new ChessMove("c5")); // Add Sicilian defence
}

ChessMove类可以愉快地表示具有任何数量的变体的完整PGN游戏。

最新更新