问题描述
到目前为止,我是一名 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
分配值,并创建与每个移动相关联的新属性,例如 {{ 1}}。将通过为关键标志分配值并将这些标志相加以获得每个移动的 importance
排名,然后按降序对移动进行排序来构建此新属性。
例如,假设促销('p' 标志)最重要,其次是捕获('c' 标志),然后是其他任何东西。然后让我们为每个 'p' 标志分配 16 的值,为每个 'c' 标志分配 8 的值。请注意,在这种情况下,同时捕获的促销活动的总和为 24,将此移动放在列表的顶部(!)。
代码会出现如下...
importance
当然,没有什么可以禁止您将其他因素纳入 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 );
以帮助对动作进行排名...