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

时间:2015-02-09 12:34:59

标签: c# chess

我正在用C#做一名国际象棋教练。这些职位来自PGN文件。

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

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

我觉得像递归函数,买我不知道如何处理它。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以编写自己的top-down parser,也可以使用ANTLR等解析器生成器工具为您生成解析器。已经有formal PGN grammar definition for use with ANTLR,所以这可能是最快的方法。

答案 1 :(得分:0)

在解析或表示移动时是否需要帮助还不是很清楚,但正如你所说的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游戏,其中包含各种变体。