Java Library für PGN Parser


9

Ich möchte eine Java-Bibliothek finden, mit der ich eine PGN-Datei lesen kann, die mehrere Schachspiele enthalten kann, wahrscheinlich auch mit eingefügten Kommentaren. Es wird jedoch nicht verwendet, um Züge zu generieren oder die Züge auf einem Brett zu spielen. Ich möchte nur das pgn lesen und den Header- und Verschiebungsabschnitt abrufen und alles in eine Datenbank kopieren.

Jedes Licht, das mich auf den richtigen Weg bringt, wird wirklich geschätzt. Ich brauche nur den Parser und segmentiere die Informationen aus dem PNG und dann werde ich das Dumping in die Datenbank durchführen.

Vielen Dank im Voraus für jede Hilfe.

Antworten:


9

Nachdem ich eine Reihe von Open Source-Code gelesen hatte, stellte ich fest, dass die meisten von ihnen auf Chesspresso setzen , einer soliden Java- Schachbibliothek, die die Validierung von Verschiebungen, den PGN-Parser (wonach ich gesucht habe), das Rendern von Schachbrettern usw. unterstützt.

Der Code ist gut dokumentiert und leicht zu verstehen. Ich brauchte ungefähr 30 Minuten, um den Code zu lesen und mit dem Testen zu beginnen. Ziemlich zufrieden mit dieser Bibliothek.

Sie können den Quellcode von sourceforge herunterladen: Chesspresso Source Code

Beispielcode: (Dies ist ein Fragment aus der Spielklasse. Ich muss nur weitere Details für den Header-Bereich hinzufügen und bin bereit, jedes PNG-Spiel in meine Datenbank zu kopieren.)

    public String getHeaderString(int line)
{
    if (line == 0) {
        StringBuffer sb = new StringBuffer();
        sb.append(getWhite());
        if (getWhiteElo() != 0) sb.append(" [").append(getWhiteElo()).append("]");
        sb.append(" - ").append(getBlack());
        if (getBlackElo() != 0) sb.append(" [").append(getBlackElo()).append("]");
        sb.append("  ").append(getResultStr()).append("  (").append(getNumOfMoves()).append(")");
        return sb.toString();
    } else if (line == 1) {
        StringBuffer sb = new StringBuffer();
        sb.append(getEvent()).append(", ").append(getSite()).append(", ").append(getDate());
        sb.append("  [").append(getRound()).append("]");
        return sb.toString();
    } else if (line == 2) {
        return getECO();
    } else {
        throw new RuntimeException("Only 3 header lines supported");
    }
}

3

Sie könnten Schachlib verwenden .

In der README- Datei finden Sie ein Beispiel für das Laden und Durchlaufen aller Züge aller Spiele in der PGN-Datei:

    PgnHolder pgn = new PgnHolder("/opt/games/linares_2002.pgn");
    pgn.loadPgn();
    for (Game game: pgn.getGame()) {
        game.loadMoveText();
        MoveList moves = game.getHalfMoves();
        Board board = new Board();
        //Replay all the moves from the game and print the final position in FEN format
        for (Move move: moves) {
            board.doMove(move);
        }
        System.out.println("FEN: " + board.getFen());
    }

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.