Node.js 将PGN转换为nodejs(国际象棋符号)中的FEN字符串列表

Node.js 将PGN转换为nodejs(国际象棋符号)中的FEN字符串列表,node.js,chess,chessboard.js,fen,Node.js,Chess,Chessboard.js,Fen,我正在使用nodejs构建一个与国际象棋相关的应用程序。我一直在尽可能多地使用chess.js,但我认为我在功能上遇到了障碍。在扩展该功能之前,我想确保没有其他工具可以满足我的需要 我正在寻找一种将PGN字符串转换为移动列表的方法。我希望在chess.js中使用load_pgn()将移动加载到对象中,然后循环每个移动并调用fen()函数输出当前的fen。然而,chess.js似乎没有办法在游戏中完成所有动作。除非我遗漏了什么 我不想去分析字符串,但如果有必要的话,我会去做的。有什么建议吗 解决方

我正在使用nodejs构建一个与国际象棋相关的应用程序。我一直在尽可能多地使用
chess.js
,但我认为我在功能上遇到了障碍。在扩展该功能之前,我想确保没有其他工具可以满足我的需要

我正在寻找一种将PGN字符串转换为移动列表的方法。我希望在chess.js中使用
load_pgn()
将移动加载到对象中,然后循环每个移动并调用
fen()
函数输出当前的fen。然而,chess.js似乎没有办法在游戏中完成所有动作。除非我遗漏了什么

我不想去分析字符串,但如果有必要的话,我会去做的。有什么建议吗

解决方案:

另请参见下面的efirvida答案以了解解决方案

像这样(未经测试)的东西似乎有效。该函数接受使用已加载PGN的
Chess.js
创建的
Chess
对象

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;
}
函数getMovesAsFENs(chessObj){ var moves=chessObj.history(); var newGame=新国际象棋(); var fens=[]; 对于(变量i=0;i查看github页面
。加载\u pgn

差不多

moves = chess.history();
var chess1 = new Chess();
for (move in moves){
    chess1.move(move);
    fen = chess1.fen()
}
(不是真正的答案;只是需要额外格式的注释。)

您的
getMovesAsFENs
函数也可以编写为:

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

也许这对你来说并不重要,但这吸引了我的整洁感。

这里是一个端到端的答案,添加了一些ES6糖:

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));
“然而,chess.js似乎并没有一种方法可以通过 在游戏中移动。除非我错过了什么。”

你是对的(因为我已经读了整个图书馆多次了)。所有需要回顾历史的事情基本上都是先撤销,然后再重做动作,没有某种真正的导航(以这种方式解决这个问题是一个有趣的选择,它的优点是某些任务的照明速度很快,但缺点是对于其他看似简单的任务(如您需要的任务)来说,它是一个真正的痛苦)

免责声明(我编写了以下工具),在过去5年多的时间里,我一直在创建一个工具(),类似于chess.js,我认为它正在慢慢实现……该库将移动历史存储在一个对象中,其中包含诸如(fen、from_square、to_square、san等)的信息,还具有某种“光标”使用移动索引和一些移动导航帮助程序

因此,使用isepic-chess.js,您可以在解析PGN游戏后调用board方法
board.fenHistoryExport()
,以获取FEN列表:

var example_pgn = `[Event "m1 London"]
[Site "?"]
[Date "1861.07.??"]
[Round "9"]
[White "Kolisch, Ignatz"]
[Black "Anderssen, Adolf"]
[Result "0-1"]
[Annotator "JvR"]
[SetUp "1"]
[FEN "5r1k/pp4pp/3r3q/8/3PpP1P/1P2NbP1/PB1Q3K/R7 b - - 0 30"]
[PlyCount "13"]
[EventDate "1861.??.??"]

30... Rxf4 $1 {Anderssen starts fireworks.} 31. Qe1 (31.gxf4 $2 Qxh4+ 32.Kg1
Rg6+) 31... Rg6 (31...Rxh4+ $1 32.gxh4 Rg6 $1) 32. Bc1 (32.Ng2 $1) 32... Rxh4+
$1 33. gxh4 Qf4+ 34. Kh3 Bg2+ $1 35. Nxg2 Qf3+ 36. Kh2 Qxg2# { Anderssen won
the match by this mate (+4, =2, -3).} 0-1`;

var board = Ic.initBoard({
  pgn : example_pgn
});

console.log(board.fenHistoryExport());

在README.md中有一个更完整的函数,它是
const{Ic}=require(“isepic chess”);
import thingy,让它在node.js中运行。

是的,我读了API。问题是,一旦加载PGN,就没有一个函数可以获取所有移动的所有位置。您只能获取当前移动的位置。
.history()
你可以得到所有的移动,然后从binning开始迭代,每个移动都有一个fen位置,但是如果你在同一个国际象棋实例中加载PGN后移动,我认为这不起作用,因为无效的移动,我认为我更好地使用新的国际象棋实例,也许我错了,效果很好,但我不认为你完全正确ust测试了它,你需要创建一个新的棋盘来继续移动。我将恢复我的editCool!我完全忘记了一个简单的映射。
var example_pgn = `[Event "m1 London"]
[Site "?"]
[Date "1861.07.??"]
[Round "9"]
[White "Kolisch, Ignatz"]
[Black "Anderssen, Adolf"]
[Result "0-1"]
[Annotator "JvR"]
[SetUp "1"]
[FEN "5r1k/pp4pp/3r3q/8/3PpP1P/1P2NbP1/PB1Q3K/R7 b - - 0 30"]
[PlyCount "13"]
[EventDate "1861.??.??"]

30... Rxf4 $1 {Anderssen starts fireworks.} 31. Qe1 (31.gxf4 $2 Qxh4+ 32.Kg1
Rg6+) 31... Rg6 (31...Rxh4+ $1 32.gxh4 Rg6 $1) 32. Bc1 (32.Ng2 $1) 32... Rxh4+
$1 33. gxh4 Qf4+ 34. Kh3 Bg2+ $1 35. Nxg2 Qf3+ 36. Kh2 Qxg2# { Anderssen won
the match by this mate (+4, =2, -3).} 0-1`;

var board = Ic.initBoard({
  pgn : example_pgn
});

console.log(board.fenHistoryExport());