0x88棋盘表示法

3
我正在尝试使用wxPython制作一个带有GUI的2人象棋程序,能够验证移动并遵循每个象棋规则。
目前,我正在设计之初,正在确定应该使用哪种棋盘表示技术。最近,我想到了显而易见的二维数组,但是我读到了0x88 board representation,据说在查找和逻辑检查方面更快,并且可以判断方格是否在棋盘内。但是,如果我制作一个没有AI的程序,就没有必要检查是否有人移动了超出棋盘范围的着法。
0x88表示法还有其他优点吗?你推荐哪一种,8x8方法还是0x88方法?另外,先使用8x8表示法,然后稍后再使用0x88表示法可能会容易些,比如我决定添加AI时。非常感谢您的想法。

1
今天的消费级电脑性能差别不大,你不会真正看到太多性能上的差异。我的手机已经拥有足够的处理能力来玩国际象棋,并且可以持续地战胜我。 - Waleed Khan
4个回答

4
“标准”棋盘表示法(0x88,位棋盘等)的目标都是极致优化。具体来说,它们在两个方面进行了极致优化:
1. 尽可能快地运行; 2. 为程序员提供更好的工具箱来指导棋局搜索,从而提高人工智能水平。
“标准”棋盘表示法只是在写象棋程序并让它们在线上与其他人和计算机竞争的人群中才是“标准”。显然,这不是你想要的,所以我不建议你使用任何这些方法。
那些“标准”方法实际上是试图使用位操作技巧来每次节省1-2个CPU周期。你使用Python意味着在这里节省一些周期完全没有意义。Python很棒,但它并不快。
Python给你提供了很多好的工具。使用它们。你的程序会很慢,但这没关系。它不会“感觉”到很慢,这才是最重要的。如果我是你,我绝对会使用Python,并且不会考虑在Python中使用任何这些位操作技巧。如果你使用C或汇编语言编写代码,位操作是有趣的。但在Python中,这毫无意义。

1

我不认为你使用人工智能的决定应该影响到你的棋盘表示是否可以包括检查棋子是否在棋盘内。也就是说,无论是计算机还是玩家进行移动,都有利于你的底层表示能够检测和优雅地处理涉及无效方格的移动。

个人而言,我相信比特棋盘方法——我发现这种方法既非常快速(因为它依赖于位运算),又与现代64位架构逻辑上相符。此外,无论你是否决定进行人工智能,都不需要重新设计你的表示,因此更具有未来性。

与0x88相比,它更加节省内存,每个棋子只用一个位表示,并且在棋盘上的棋子越少,它变得更加友好。虽然内存可能不是现代计算机的最大问题,但它是一个没有实际缺点的优点。

使用比特棋盘,一个位运算可以计算出许多棋子的移动有效性,只需再进行几个操作即可确定数百个可能的移动(根据您所需的移动深度),以最快的方式进行计算,我个人认为比0x88要快得多。

如果您对位棋盘相关的代码感兴趣,请查看我的项目THUD!(一款棋盘游戏,其玩法与国际象棋不太相似,但在如何执行规则、表示棋盘和棋子方面完全相似)。同样,还设计了一个AI(甚至是多线程的),展示了位棋盘的可扩展性。如果您有任何问题,我很乐意亲自解答。


0

我同意你的观点,如果你不从事人工智能方面的工作,那么没有太多理由去进行微观优化。

我的一个建议是,如果你正在考虑从8x8转换到0x88(并且通常情况下,为了良好的代码质量),你应该尽可能地将棋盘访问逻辑抽象成函数。例如,编写并使用一个

getPieceAtLocation(char file, int rank)

并调用

Piece p = getPieceAtLocation('e', 2);

或者类似的方式。这样,如果您决定改变主意,您只需要重新编写getPieceAtLocation中的逻辑,而不是更改每个必须使用它的地方。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接