问题标签 [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.
chess - 使用魔术位板构建国际象棋......我如何知道移动是否有效
好的,我在网上阅读了很多东西,其中大部分使用没有 unsigned int 的 Java。我正在研究具有 unsigned int 的 Objective-C。
让我们考虑以下场景。
板子是这样的:
A1
位于左下方,是最低有效位,H8
位于右上方,是最高有效位。
我已经为棋盘上所有位置的所有棋子的运动构建了位掩码。
假设以下简单情况:
- 游戏将开始。所有棋子都在它们的初始位置。
- 用户试图将骑士移动
G1
到E2
.
显然这个动作是不可能的,因为上面有一个棋子E2
。
我如何发现运动是否有效?
好的,我有所有部分的位掩码:
1111111111111111000000000000000000000000000000001111111111111111
我有骑士可能运动的位掩码G1
是
或位
0000000000001000000001010000000000000000000000000000000000000000
如果我AND
这两个
1111111111111111000000000000000000000000000000001111111111111111
0000000000001000000001010000000000000000000000000000000000000000
我明白了
0000000000001000000000000000000000000000000000000000000000000000
我所知道的是当时有一块,但我不明白这如何告诉我这是否是一个有效的举动。
另一个问题是:假设这一举动会让我的国王受到攻击。显然,根据骑士的移动规则,这在技术上是可行的,但不可能,因为我无法做出让我的国王受到攻击的动作。
我如何获得这些信息?谢谢
algorithm - 不了解位板技术如何用于棋盘
我的大脑在冒烟,试图理解这种位板技术的机制。为了简单起见,让我们想象一下,不是国际象棋和许多复杂的棋子动作,而是一个只有两个棋子和一个 8 个位置的游戏。一块是三角形,另一块是圆形,如下所示:
三角形可以像车一样移动。任意数量的水平位置,但不能跳过圆圈。
现在想象用户将三角形移动到最后一个位置,如下所示:
对于这个例子,三角形移动位板是
并且圆形位置掩码是
显然这个动作是非法的,因为三角形不能跳过圆圈,但是软件如何使用魔法位板技术检查这个动作是否合法?
chess - 给定一个用魔术位板构建的国际象棋应用程序,我如何检查将死?
好的,我有这个用 bitboard 构建的国际象棋应用程序,我想检查给定的移动是否将对手的棋子置于将死状态。
验证检查情况很容易。你建立敌方棋子攻击AND
的位掩码,你用对面国王的位掩码,如果结果不为零,你有一个检查。
但是检查伴侣呢?将死是在检查后将发生的事情。我的意思是,我移动了一块,应用程序检测到移动生成了一张支票。那我怎么知道这张支票是否是支票伴侣?我是否必须为对手所有可能的游戏生成所有可能的位板并检查是否有可以将国王从检查中移除的移动?这似乎不切实际。还有其他方法吗?
swift - Swift 3 uint64 在尝试分配 64 位整数时溢出
我正在尝试在 Swift 中实现位板,并尝试将 64 位整数存储到 UInt64 中并得到溢出错误。
我猜发生的情况是 Swift 将数字视为十进制整数,然后尝试将其转换为最终大于 64 位的二进制数。
有人可以解释一下我会怎么做。谢谢
java - 如何正确使用位板
我想知道在国际象棋引擎中实现位板的正确方法是什么。到目前为止,我对国际象棋引擎编程的基础知识做了一些研究并做了一些笔记,主要是诸如极小极大、字母表、静止搜索和高级评估函数之类的东西。
然后我把我的项目分成三个部分:
- 图形用户界面
- 董事会代表
- 实现超越极小极大的搜索并为静态位置提供一个不错的评估函数
我使用位板来表示棋盘状态,以便在表示棋盘和计算游戏树时都节省时间。这就是我的问题所在。
因为我不只是想复制别人的代码,所以我尝试创建一个unsigned long
来测试它,但显然丢失了一点。
这是代码:
有人可以告诉我我做错了什么,以及为什么我会失去一点吗?
algorithm - 国际象棋引擎中的滑动棋子生成
所以我在解决一个问题时遇到了一些麻烦。我目前正在用 Java 编写一个基于位板的国际象棋引擎(它是一个解决一切问题的过程)。到目前为止,所有的典当/国王/骑士动作都按预期工作并且没有错误。
我需要帮助理解的是滑动块移动生成。我已经为每个方格/棋子生成了空棋盘移动数组。根据我目前的理解,我还需要开发一个数组,该数组还包含每个正方形上的每个可能占用率——然后以某种方式基于各种方法查找该数组。
这种思考方式正确吗?是否需要从 0 到 2^63 中选择每个数字,然后用移动位板对那个正方形进行异或运算,然后用某种方法(魔法/旋转位板)存储它以初始化数组并以相同的方式访问它运行?
非常感谢伪代码和解释。(顺便说一下,我正在使用>>>)。
c# - 将 C++ 函数转换为 C#
我正在尝试将 c++ 函数转换为 c#,但我连续第二个小时失败了。需要帮助:/函数取自this question
这是我的 C# 之一:
但它不起作用!看起来是一件微不足道的事情,但我完全迷失了。感谢帮助
ruby - 如何显示从二进制文字派生的位板?
我正在尝试打印出我正在使用位板实现的国际象棋游戏。我无法想象我将如何显示 8x8 网格以及用于播放的棋子。
这是我正在关注的教程的链接(尽管不完整)。
我根据默认国际象棋设置位置设置了上述二进制文件,其中 MSB 是左上角,LSB 是右下角。
随着游戏的进行,上面的二进制文字会随着时间而改变(目前它们处于默认的国际象棋位置)。
然后,游戏管理器将再次考虑打印板上方的所有更新的二进制文字,如上所示。
根据上面的信息,迭代文字并打印必要的空方块/播放件的好方法是什么?
chess - 国际象棋编程:如何最有效地从位板攻击掩码中获得单步移动
我怎样才能有效地摆脱攻击面具,看起来像这样:
为女王。
bitScanForward
我过去所做的是,通过计算尾随零(下一个攻击方。是否有任何技术可以直接获得单个攻击位?
bit-manipulation - Bitboard:用邻居计算元素
为了表示 2D 棋盘游戏的状态,我使用了16 位无符号整数的位板。状态编码为 1 表示存在,否则为 0。
计算在水平、垂直或对角线上至少有一个相邻块的块数的位板方法是什么?
我发现的算法(非常简化)是:
- bitScanForward 函数返回第一位的索引并将其设置为 0
- bitPopCount 函数返回位数
唯一的限制是板是 m 行 xm 列且 m <= 8。
有没有办法在不循环比特的情况下做到这一点?