问题标签 [bitboard]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 带有连接 5 游戏的位板?
我需要您的帮助以了解是否可以使用位板进行连接 5 游戏。因为我看到了很多连接 4 游戏的示例,但如果棋盘非常大,例如 15x15 或 19x19,则没有。我不明白如何用 64 位表示板。
谢谢你的帮助
move - 为移动生成位板掩码
我试图了解位板表示在国际象棋编程中的工作原理,但我找不到关于一个细节的有用信息(或者只是无法正确翻译它^^)。我的问题是,如何自动生成掩码以逐个移动每个位置。我假设它是一个矩阵,其中每种类型都定义了他可以从该位置移动的每个字段(数组 [5] [64] 用于 wP、bP、K、R、N、B)。例如对于下面的 Rook 位置,仅允许的位置是:
我假设我必须为每种类型和它可以步进的每个图块创建类似的东西,但我是否必须手动将其硬编码为数组,或者有可能在程序运行后自动化这个过程并预先计算它?
iphone - iPhone 4和5上64位整数的位板按位运算?
我有一个相当有趣的问题。我正在使用 iOS 7 的位板编写一个国际象棋引擎,我想在 iPhone 4、4s、5 和 5s 上工作。到目前为止,我一直在 iOS 64 位 iPhone 模拟器中进行所有测试,但我决定在手机上运行它,所有的黑棋子都不见了。我很快发现这是因为我的 iPhone 是 iPhone 5,我认为它在 64 位数字上的按位运算存在一些问题。有什么解决方法可以让这个应用程序在 iPhone 4、4s 和 5 上运行吗?还是我必须只制作这款 iPhone 5s?如果是这样的话,那将是相当令人沮丧的。
更新:经过进一步调查,我确定问题在于,虽然我所有明确声明的类型都是无符号长整型,但因为我将它们的集合作为对象文字存储在 nsarrays 中,当我在调用 objectForKey 后调用 integerValue 时,这会返回一个NS 整数。但是,在 32 位手机上,当我需要 64 位时,NSInteger 是 32 位。有没有办法在 NSArray 中存储和检索 64 位整数?
c# - 国际象棋:位扫描
我正在用 C# 编写一个带有魔法位板的国际象棋引擎,现在速度很慢。从初始位置计算 perft 6(119,060,324 个位置)需要 2 分钟,而其他引擎可以在 1-3 秒内完成。我目前正在使用这种方法来查找位板上所有 1 的索引:
这是被调用最多的方法,我想加快它。有没有更快的方法来做到这一点?我想返回一个数组而不是一个列表,但是我不知道如何因为位数是未知的(而且我不想要空元素,因为我有很多 foreach 循环)。
任何建议表示赞赏。
java - 旋转位板
我正在使用 Java 中的 24 位位板,代表以下形式的游戏板:
请注意,板的中间有一个孔,用“XX”表示。我已经生成了一个合法位板列表,但是由于该板具有正方形的对称性,我可以丢弃大量已经由列表中的对称表亲表示的位板。
为了检查这些对称性,我需要能够将板旋转 90、180 和 270 度并水平、垂直和对角(在两条对角线上)镜像的函数。显然我想利用位操作,但这是我卡住的地方。我找到了一些关于如何为棋盘执行此操作的信息,但我无法理解这个概念 - 更不用说如何将其应用于我自己的棋盘情况了。
任何人都可以通过一些解释告诉我如何有效地旋转/镜像位板吗?
java - Java中的国际象棋位板实现
我正在寻找创建一个基本的国际象棋(或失败,跳棋/选秀)引擎。在研究了这个主题之后,我相当有信心我想使用一系列的位板。我在基本层面上理解了这个概念,但我在用 Java 表示它们时遇到了麻烦。
我试图将棋盘的白色部分表示为 1,将其他所有部分表示为 0,使用 long:
但是当我打印出来时,我得到以下 46 位:
是什么导致了这个结果?我敢肯定我在这里从根本上误解了一些东西。如果有人能指出我正确的方向,我将不胜感激。
c++ - 仅将整数中的 1 位移动特定位数
我正在创建一个国际象棋程序,并且我正在使用位板作为棋盘表示。白色棋子的位板如下所示:
whitePawns=0x000000000000FF00;
现在,如果我想移动方格 D4 上的白兵,我必须将第 12 位移动 8 或 10 位,以便它可以进入下一个等级。我想在不干扰其余位的位置的情况下移动第 12 位。我怎么做?
移动 whitePawns 变量后应如下所示:
whitePawns=0x0000000008F700;
bit-manipulation - 有没有一种廉价的方法来“镜像”一个字节中的位?
当尝试在没有循环的情况下测试直线上的可达性时,您可以使用 Bitboard 表示。想象一下国际象棋,棋盘的一行或一列表示为一个字节,以及一个问题,如果 X 方格上的 Rook 可以捕获方格 T 上的目标。
设 T:Target,X:Start,O:其他占用方格,_:空方格
我发现使用这些符号来可视化可能的场景很方便:
这里有 4 个感兴趣的案例 - 来自 AD。情况 A 和 B 很容易处理。
但情况 C 和 D 不是。您不能简单地测试 > 或 < 来确定目标是否可达或路径是否被阻塞。
不过,可以做的是通过镜像字节中的位将 C、D 转换为 A、B。所以位 0 -> 位 7,位 1 -> 位 6,...
有谁知道是否有优化的实现来进行翻转?
编辑:我刚刚注意到另一种情况是:E:OT__X___ ...我的理论变坏了,但问题仍然存在。:)
python - 更新一次攻击时更新攻击位板
这只是一个原则。我希望在更改攻击位板(骑士、主教或典当)之一时更新被攻击的位板,而不必重复第 1 行。这可能吗?做这个的最好方式是什么?以 borg 类的方式或简单地使用字典的行为:
被攻击 = pawn_attacks | 骑士攻击 | 主教攻击
pawn_attacks = (1 << (pawn + 9)) | (1<< (棋子 + 7))
当其中一种攻击发生变化时,这不会透明/自动地起作用。低于被攻击的结果总是1。
java - 如何在 Clojure 的位操作中使用无符号 64 位变量?
我有以下代码:
它返回在位板上找到的最后一位的索引。问题是当我尝试运行时:(BitScanReverse 18446462598732840960) ;;期望 63。它给了我:IllegalArgumentException 值超出范围长期:18446462598732840960 clojure.lang.RT.longCast (RT.java:1134)
该位板是黑色棋子的初始位置。问题是 long 是在 clojure 中签名的(也在 java 中)。我尝试使用 BigInt,但它不允许位操作。
有什么建议么?