【问题标题】:Move Ordering in Javascript Chess Engine chess.js在 Javascript 国际象棋引擎 chess.js 中移动排序
【发布时间】:2021-02-16 19:09:39
【问题描述】:

到目前为止,我是一名 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 })];

但似乎没有任何效果。

我的代码可以在第 153 行的http://users.telenet.be/gianc/chessai/js/main.js 看到

可玩here

其他信息:https://github.com/jhlywa/chess.js/blob/master/README.md

非常感谢任何输入!

TIA

【问题讨论】:

  • “似乎没有任何效果”不是诊断性的。您是否要连接两个数组?
  • 我很抱歉我不是英语母语,我的意思是上面的例子不起作用。我不知道串联是什么意思。编辑:我用谷歌搜索了连接,是的,这就是我正在尝试的

标签: javascript chessboard.js


【解决方案1】:

根据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 以帮助对移动进行排名...

【讨论】:

  • 虽然=> 0 <= 看起来很花哨,但确实存在developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 哈哈。是的,使用includes() 会减少语法上的混乱。我会将0 <= move.flags.indexOf( 'c' ) 调整为move.flags.includes( 'c' )...
  • 在此之后我提出了var children = [ [captures], [allLegalMoves] ];,但仍然无法正常工作
  • @GiCl90 看看我刚刚包含的编辑,它不会将数组分开,而是对移动进行排名,然后按排名排序......
  • @Trentium 非常感谢您的努力,我理解您的所作所为。但不幸的是它仍然不起作用
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多