2015-09-20 3 views
5

Ich baue eine schachbezogene Anwendung mit nodejs. Ich habe versucht, chess.js so viel wie ich kann zu verwenden, aber ich denke, ich habe einen Roadblock in Bezug auf die Funktionalität getroffen. Bevor ich diese Funktionalität erweiterte, wollte ich sicherstellen, dass es kein anderes Werkzeug gibt, das tun kann, was ich brauche.Konvertieren eines PGN in eine Liste von FEN-Strings in nodejs (Schachnotationen)

Ich bin auf der Suche nach einer Möglichkeit, eine PGN-Zeichenfolge in eine Liste von FEN-Moves zu konvertieren. Ich hoffte, load_pgn() in chess.js zu verwenden, um die Bewegungen in das Objekt zu laden und dann jede Bewegung zu wiederholen und die Funktion fen() aufzurufen, um das gegenwärtige FEN auszugeben. Chess.js scheint jedoch keine Möglichkeit zu haben, die Spielzüge zu durchlaufen. Es sei denn, ich verpasse etwas.

Ich würde lieber nicht in Strings Parsen gehen, aber wenn ich muss. Irgendwelche Vorschläge?

Lösung:

auch efirvida Antwort unten für eine Lösung

So etwas wie dieses (nicht getestet) sehen scheint zu funktionieren. Die Funktion akzeptiert ein Chess-Objekt, das mit chess.js erstellt wurde und in das bereits ein PGN geladen ist.

function getMovesAsFENs(chessObj) { 
    var moves = chessObj.history(); 
    var newGame = new Chess(); 
    var fens = []; 
    for (var i = 0; i < moves.length; i++) { 
     newGame.move(moves[i]); 
     fens.push(newGame.fen()); 
    } 
    return fens; 
} 

Antwort

4

Werfen Sie einen Blick auf die GitHub Seite .load_pgnlink

var chess = new Chess(); 
pgn = ['[Event "Casual Game"]', 
     '[Site "Berlin GER"]', 
     '[Date "1852.??.??"]', 
     '[EventDate "?"]', 
     '[Round "?"]', 
     '[Result "1-0"]', 
     '[White "Adolf Anderssen"]', 
     '[Black "Jean Dufresne"]', 
     '[ECO "C52"]', 
     '[WhiteElo "?"]', 
     '[BlackElo "?"]', 
     '[PlyCount "47"]', 
     '', 
     '1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O', 
     'd3 8.Qb3 Qf6 9.e5 Qg6 10.Re1 Nge7 11.Ba3 b5 12.Qxb5 Rb8 13.Qa4', 
     'Bb6 14.Nbd2 Bb7 15.Ne4 Qf5 16.Bxd3 Qh5 17.Nf6+ gxf6 18.exf6', 
     'Rg8 19.Rad1 Qxf3 20.Rxe7+ Nxe7 21.Qxd7+ Kxd7 22.Bf5+ Ke8', 
     '23.Bd7+ Kf8 24.Bxe7# 1-0']; 

chess.load_pgn(pgn.join('\n')); 
// -> true 

chess.fen() 
// -> 1r3kr1/pbpBBp1p/1b3P2/8/8/2P2q2/P4PPP/3R2K1 b - - 0 24 

so etwas wie

something like 

moves = chess.history(); 
var chess1 = new Chess(); 
for (move in moves){ 
    chess1.move(move); 
    fen = chess1.fen() 
} 
+0

Ja, las ich die API. Das Problem ist, dass nach dem Laden des PGN keine Funktion vorhanden ist, um alle FEN-Positionen für alle Züge zu erhalten. Sie können nur für den aktuellen Zug erhalten. – n0pe

+0

mit der '.history()' Sie können alle Züge bekommen dann iteriert über sie aus dem Binning mit der Fen Position für jede Bewegung – efirvida

+0

Ich aktualisiere meine Antwort – efirvida

3

(nicht wirklich eine Antwort, einfach einen Kommentar, die zusätzliche Formatierung benötigt.)

Ihre getMovesAsFENs Funktion könnte auch geschrieben werden a s:

function getMovesAsFENs(chessObj) { 
    return chessObj.history().map(function(move) { 
     chessObj.move(move); 
     return chessObj.fen(); 
    }); 
} 

Vielleicht ist es dir egal, aber das appelliert an meinen Sinn für Ordentlichkeit.

+0

Cool! Ich habe ein einfaches Mapping vergessen. – n0pe

1

Hier ist ein Ende Antwort mit einigem ES6 Zucker hinzugefügt zu beenden:

const Chess = require('chess.js').Chess; 
const chess1 = new Chess(); 
const chess2 = new Chess(); 
const startPos = chess2.fen(); 
const pgn = `1.e4 c5 0-1`; 

chess1.load_pgn(pgn); 
let fens = chess1.history().map(move => { 
    chess2.move(move); 
    return chess2.fen(); 
}); 

//the above technique will not capture the fen of the starting position. therefore: 
fens = [startPos, ...fens]; 

//double checking everything 
fens.forEach(fen => console.log(fen)); 
Verwandte Themen