当前位置: 首页 > 知识库问答 >
问题:

从移动位板生成单个移动

葛成济
2023-03-14

在我的国际象棋引擎中,它使用比特板来表示棋盘的状态,一次生成一大块伪合法的棋步,结果就是一个比特板。例如:

典当:

稍后有点比特板魔术:

末尾的位板只是一大块可能的移动。引擎通常如何使用这个位板并从中生成单独的移动?我是否必须遍历每一位来检查它是否设置好?不过,在位板上迭代似乎违背了使用位板的目的,这就是为什么我有点怀疑。

有更好的办法吗?

共有2个答案

钮长恨
2023-03-14

你不必迭代64位。例如,您可以准备/预先定义一个256大小的查找数组,其中包含所有可能的移动列表,其中8位索引表示单个列组上一个片段的攻击集。然后,使用按位移位操作(位板)只能迭代8次

璩涛
2023-03-14

然后,通常你会应用极小极大算法的一些变体来评估这些动作有多好,这样你就可以选择(你估计的)最好的动作。例如,一个简单的变体是alpha-beta。

这些变体主要涉及试图引导搜索朝着“可能有用的移动”和远离搜索空间的无用区域,因为搜索树非常宽,你深入探索它的能力对于一个好的国际象棋人工智能来说是极其重要的——探索它使人工智能很容易“陷阱”,因为它会做出短期内看起来不错的选择,即使它们后来表现不佳。

所以,是的,你将在比特板上迭代。这并不是真的违背了他们的目的——你仍然(可能)比没有使用比特板时计算移动的速度要快得多。对于最简单的人工智能,你可以使用标准的比特板技术进行“第一步”,但这样玩的人工智能将低于新手级别,根本不考虑输赢。

 类似资料:
  • 我试图了解国际象棋编程中的位板表示是如何工作的,但我找不到关于一个细节的有用信息(或者只是无法正确翻译它^^)。我的问题是,如何自动生成掩码,以便在每个位置上移动每一个棋子。我假设它是一个矩阵,其中每个棋子类型都定义了他可以从该位置移动的每个字段(wP、bP、K、R、N、B的数组[5][64])。例如,对于下面的Rook on位置,只允许位置是: 我假设我必须为每一块类型和每一块瓷砖创建类似的东西

  • 问题内容: 我希望我的位图具有屏幕的高度,并且具有比屏幕大的宽度,如果用户更改桌面,则可以向右或向左或向左移动一点,以便他可以看到整个图像。 这是我的代码,仅部分起作用: 谢谢! 问题答案: 您可以通过onOffsetsChanged()中的变量xPixels和yPixels获得准确的像素值。在这里查看我的答案:android动态壁纸缩放 例如,在onOffsetsChanged()中,您可以设置

  • 这是一个关于如何使用魔法棋盘在国际象棋中验证滑动棋子移动的大局的问题。我只是想澄清一下,我不是在问魔法比特板在内部是如何工作的。 现在,关于这个问题的更多细节。我正在使用位板编写棋盘表示,我想使用魔术位板验证滑块移动。有人能列出如何实现这一目标的主要步骤吗?作为一个例子,考虑以下棋盘位置: 假设我们已经初始化并准备好使用所有魔术位板函数和数据结构。因此,仅使用魔法比特板的函数签名,您能否列出验证g

  • 目前我读了Scott Meyers的有效现代C一书,现在我在:第17项:理解特殊成员函数的生成。 我的误解来自以下部分(理由): 这两个复制操作是独立的:声明一个并不会阻止编译器生成另一个。因此,如果您声明了复制构造函数,但没有复制赋值操作符,然后编写需要复制赋值的代码,编译器将为您生成复制赋值操作符。类似地,如果您声明了复制赋值操作符,但没有复制构造函数,但代码需要复制构造,编译器将为您生成复制

  • 在Kafka消费者中,自动偏移重置:最新和启用自动提交:false的主要目的是什么。 在Kafka consumer中,我是否可以在KafkaListner期间检查是否能够接收重复记录或处理以前的记录 在spring boot中创建消费者端时,需要记住的所有必要事项以及日志记录的所有重要事项是什么,以便日志记录具有一定的意义

  • 迁移Blade视图层模板 仓库地址: Blade 安装 composer require jenssegers/blade 通过向其传递视图文件所在的文件夹和缓存文件夹来创建一个Blade实例。通过调用make方法来渲染一个模板。有关Blade模板引擎的更多信息可以在http://laravel.com/docs/5.1/blade 添加模板配置 先单例Blade,为什幺我们要用单例?先留个彩蛋