在 Javascript 国际象棋引擎 chess.js 中移动排序
Move Ordering in Javascript Chess Engine chess.js
到目前为止,我是一名 javascript 专家,但我正在努力学习它。
对于我的国际象棋引擎中的移动顺序(我遵循教程),我想先检查捕获。
在 chess.js 库中,捕获动作与标志 'c'.
一起列出
game.moves({ flags: 'c', verbose: true })
所以我正在尝试制作一个购物清单,首先是捕获动作,然后是所有其余动作。
我这样试过:
var children = [
[game.ugly_moves({ flags: 'c', verbose: true })],
[game.ugly_moves({ verbose: true })]
];
像这样:
var children = [game.ugly_moves({ flags: 'c', verbose: true })] + [game.ugly_moves({ verbose: true })];
但似乎没有任何效果。
我的代码可以在http://users.telenet.be/gianc/chessai/js/main.js第153行看到
可玩here
其他信息:https://github.com/jhlywa/chess.js/blob/master/README.md
非常感谢任何意见!
TIA
根据 https://github.com/jhlywa/chess.js/blob/master/README.md#moves-options- 上的文档,flags
不会传递到 moves()
,而是从 moves()
返回为与每个合法的关联的属性移动。因此,要获得所有捕获的列表,您需要对所有合法移动的结果数组应用过滤器。以下几行...
let allLegalMoves = game.moves( { verbose: true } );
let captures = allLegalMoves.filter( move => move.flags.includes( 'c' ) );
注意 includes()
的使用,因为每次移动可以有多个标志。
编辑: 作为我最初回答的后续,另一个选项是为 flags
赋值,并创建一个与每个移动相关联的新属性,称为,比如说,importance
。这个新属性将通过为关键标志分配值并对标志求和以获得每个移动的 importance
排名,然后按降序对移动进行排序来构建。
例如,假设促销('p' 标志)最重要,其次是捕获('c' 标志),然后是其他任何内容。然后让我们为每个 'p' 标志分配值 16,为每个 'c' 标志分配 8。请注意,在这种情况下,也捕获的促销活动总和为 24,将此移动置于列表顶部(!)。
代码会出现如下...
let allLegalMoves = game.moves( { verbose: true } );
for ( let move of allLegalMoves ) {
move.importance = 0
+ move.flags.includes( 'p' ) ? 16 : 0
+ move.flags.includes( 'c' ) ? 8 : 0;
}
allLegalMoves.sort( ( a, b ) => b.importance - a.importance );
当然,没有什么可以阻止您将其他因素纳入 importance
以帮助对动作进行排名...
到目前为止,我是一名 javascript 专家,但我正在努力学习它。
对于我的国际象棋引擎中的移动顺序(我遵循教程),我想先检查捕获。 在 chess.js 库中,捕获动作与标志 'c'.
一起列出game.moves({ flags: 'c', verbose: true })
所以我正在尝试制作一个购物清单,首先是捕获动作,然后是所有其余动作。 我这样试过:
var children = [
[game.ugly_moves({ flags: 'c', verbose: true })],
[game.ugly_moves({ verbose: true })]
];
像这样:
var children = [game.ugly_moves({ flags: 'c', verbose: true })] + [game.ugly_moves({ verbose: true })];
但似乎没有任何效果。
我的代码可以在http://users.telenet.be/gianc/chessai/js/main.js第153行看到
可玩here
其他信息:https://github.com/jhlywa/chess.js/blob/master/README.md
非常感谢任何意见!
TIA
根据 https://github.com/jhlywa/chess.js/blob/master/README.md#moves-options- 上的文档,flags
不会传递到 moves()
,而是从 moves()
返回为与每个合法的关联的属性移动。因此,要获得所有捕获的列表,您需要对所有合法移动的结果数组应用过滤器。以下几行...
let allLegalMoves = game.moves( { verbose: true } );
let captures = allLegalMoves.filter( move => move.flags.includes( 'c' ) );
注意 includes()
的使用,因为每次移动可以有多个标志。
编辑: 作为我最初回答的后续,另一个选项是为 flags
赋值,并创建一个与每个移动相关联的新属性,称为,比如说,importance
。这个新属性将通过为关键标志分配值并对标志求和以获得每个移动的 importance
排名,然后按降序对移动进行排序来构建。
例如,假设促销('p' 标志)最重要,其次是捕获('c' 标志),然后是其他任何内容。然后让我们为每个 'p' 标志分配值 16,为每个 'c' 标志分配 8。请注意,在这种情况下,也捕获的促销活动总和为 24,将此移动置于列表顶部(!)。
代码会出现如下...
let allLegalMoves = game.moves( { verbose: true } );
for ( let move of allLegalMoves ) {
move.importance = 0
+ move.flags.includes( 'p' ) ? 16 : 0
+ move.flags.includes( 'c' ) ? 8 : 0;
}
allLegalMoves.sort( ( a, b ) => b.importance - a.importance );
当然,没有什么可以阻止您将其他因素纳入 importance
以帮助对动作进行排名...