- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您将使用什么数据结构来表示计算机国际象棋程序的棋盘?
最佳答案
对于一个严肃的国际象棋引擎,使用位板是在内存中表示国际象棋棋盘的有效方法。位板比任何基于数组的表示更快,特别是在 64 位架构中,其中位板可以放入单个 CPU 寄存器中。
位板
位板的基本思想是以 64 位表示每种棋子类型。在 C++/C# 中,它将是 ulong/UInt64
。因此,您将维护 12 个 UInt64 变量来表示您的棋盘:每种棋子类型有两个(一黑一白),即兵、车、马、象、后和王。 UInt64
中的每一位都对应于棋盘上的一个方 block 。通常,最低有效位是 a1 平方,接下来是 b1,然后是 c1,以行优先方式依此类推。棋盘上棋子位置对应的位将设置为 1,所有其他位将设置为 0。例如,如果 a2 和 h1 上有两只白车,那么白车位板将如下所示:
0000000000000000000000000000000000000000000000000000000110000000
现在,例如,如果您想在上面的示例中将车从 a2 移动到 g2,您所需要做的就是对位板进行异或:
0000000000000000000000000000000000000000000000000100000100000000
位板在移动生成方面具有性能优势。位板表示还具有其他性能优势。例如,您可以使用 lockless hash tables在并行化搜索算法时,这是一个巨大的优势。
进一步阅读
国际象棋引擎开发的终极资源是 Chess Programming Wiki 。我最近写过this chess engine它在 C# 中实现了位板。更好的开源国际象棋引擎是 StockFish它也实现了位板,但是是用 C++ 实现的。
关于chess - 在编程计算机下棋时如何对棋盘进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39874/
我试图写一个国际象棋游戏,发现找不到解决僵局的解决方案。我正在尝试使用google,但找不到任何东西。有众所周知的算法吗? 最佳答案 您的移动生成器将是两种不同的设计之一; 要么在生成 Action
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
这是一个关于如何使用魔术位板验证国际象棋中滑动棋子移动的全局问题。只是为了澄清,我不是在问魔术位板在内部是如何工作的。 现在,关于这个问题的更多细节。我正在使用位板编写国际象棋棋盘表示,并且我想使用魔
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我一直在为即将到来的编程比赛进行练习,我偶然发现了一个我完全困惑的问题。然而,我觉得这是一个我现在应该学习的概念,而不是祈祷它永远不会出现。 基本上,它处理的是棋盘上的骑士棋子。您将获得两个输入:起始
您将使用什么数据结构来表示计算机国际象棋程序的棋盘? 最佳答案 对于一个严肃的国际象棋引擎,使用位板是在内存中表示国际象棋棋盘的有效方法。位板比任何基于数组的表示更快,特别是在 64 位架构中,其中位
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 3年前关闭。 Improve this
我正在使用 Java 编写国际象棋引擎。 我试图找到一个字节中第一个 1 位的索引和最后一个 1 位的索引。 我目前在 Java 中使用 Long.numberOfTrailingZeros()(或类
TLDR:我有一个用于 negamax 实现的非对称评估函数 - 这可以接受吗?还是我需要使其对称? 更长:我正在编写一个游戏 AI(用于类似国际象棋的棋盘游戏“Hive”),它使用带有 alpha-
我正在用 Java 制作国际象棋,现在,每当用户单击移动棋子时,我都会遇到更新棋盘的问题。我的游戏逻辑还远远没有完成,我只是想让 GUI 和 mouseListener 首先按照我希望的方式工作。我设
我正在尝试在 Ubuntu 16 上安装 python-chess。通过 pip3 安装它,但在导入国际象棋时出现错误。 ujesh@suyodhana:~$ pip3 install python-
char chess = _board[0]; for (char i = 1; i < 9; ++i) { chess &= _board[i]; //?
我有一个 FEN位置,我想分析哪个位置更强。 例如,我有这个职位 rnbq1bnr/pp2k2N/8/2p1p2Q/4N3/8/PPPP1PPP/R1B1KB1R b KQ - 0 1 如何使用 St
我目前正在尝试构建一个简单的棋子移动程序。我从文本文件中读取了国际象棋移动符号。国际象棋符号是这样的: plb1 c3 = (p)pawn(l)white 从位置 b1(b1) 移动到位置 c3(c3
我正在尝试从 chess.com 读出我的一些统计数据。我很难用 python 登录。 我正在尝试按照教程 here 进行操作 我从登录页面中识别出以下标签。 _username 作为用户名,_pas
我正在寻找一种工具,它允许我使用使用任务并行库构造编写的程序对所有可能的交错(拼写?)执行单元测试。或者,我如何使用 dotNET 4.0 运行 CHESS? 最佳答案 有一个商业可用的工具,Jinx
我有一个类,它使用字符串字典。一种方法是初始化字典,另一种方法是向字典添加新的对,第三种方法是将字典连接成字符串。 我想通过在不同线程中同时运行 init-adding-adding-*-adding
我目前正在创建一个 python 脚本,它使用 python-chess 和 chess.uci 打开国际象棋引擎 Stockfish。但是,当我尝试打开 Stockfish 引擎时,我得到了 Per
我最近才开始使用单元测试,我知道单元测试没有涵盖的一些主要问题是并发性和复杂的跨对象交互(无论如何,大多数现代完全 OOP 语言都完全消除了这些问题。)据我所知,CHESS 解决了某种程度上的并发问题
是否可以将来自 JavaScript 代码的信号链接/连接/发送到 Solidity/Ethereum? 最佳答案 您可以使用 web3 . 与合约交互有不同的语法。取决于契约(Contract)是否
我是一名优秀的程序员,十分优秀!