在 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 分配值,并创建与每个移动相关联的新属性,例如 {{ 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 ); 以帮助对动作进行排名...