3

我正在尝试使用 wxPython 中的 GUI 制作一个 2 人国际象棋程序,该程序能够验证移动并遵循每条国际象棋规则。

现在,我正处于设计的开始阶段,并正在考虑应该使用哪种电路板表示技术。我最近想到了明显的二维数组,但后来我读到了0x88 棋盘表示,它在查找方面应该更快,并在逻辑上检查方块是否在棋盘内。但是,如果我在没有 AI 的情况下编写程序,则无需检查是否有人移动了棋盘之外的棋子。

0x88 表示还有其他我不知道的优点吗?你会推荐哪一个,8x8 方法或 0x88。此外,首先使用 8x8 表示是否容易,然后,如果我决定添加 AI,使用 0x88 表示是否容易?非常感谢您的想法。

4

4 回答 4

4

已经提到的“标准”板表示(0x88、位板等)都有一个极端优化的目标。具体来说,在两个方面进行了极致优化:

  1. 让它快点,越快越好
  2. 为程序员提供了更好的工具箱来指导国际象棋树的搜索,提高了AI

“标准”棋盘表示只是在编写国际象棋程序并让他们与其他人和其他计算机进行在线竞争的人群中的“标准”。这显然不是你所追求的,所以我不建议你使用任何这些方法。

那些“标准”方法实际上是在尝试使用比特旋转技巧来节省 1-2 个 CPU 周期。您使用 Python 的事实使得在这里和那里节省几个周期完全没有意义。Python 很棒,但它一点也不快。

Python 为您提供了很多很好的工具。使用它们。你的程序会很慢,这并没有错。它不会“感觉”很慢,这才是最重要的。如果我是你,我绝对会使用 Python,而且我不会再考虑在 Python 中使用任何这些琐碎的想法。如果您使用 C 或汇编程序编写代码,那么小玩意儿会很有趣。在 Python 中这是没有意义的。

于 2012-09-01T02:58:49.027 回答
1

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

就个人而言,我相信位板方法——我发现这种方法既非常快速(因为它依赖于按位运算),又在逻辑上适合现代 64 位架构。最重要的是,无论您是否决定使用 AI,都不需要对您的表示进行任何重新设计,因此它也更具前瞻性。

与 0x88 相比,它对内存更友好,每一块都由一个位表示,并且板上的块越少,它就越友好。虽然内存可能不是现代计算机最关心的问题,但它的好处也没有真正的缺点。

使用位板,一个按位运算可以计算出许多棋子的移动有效性,而剩下的标记只计算几个,这意味着您可以以最快的方式确定数百个可能的移动(加上您想要的移动深度),我轶事相信在 0x88 左右跑圈。

如果您对一些与位板相关的代码感兴趣,请参阅我的项目THUD!(棋盘游戏在游戏规则中不太像国际象棋,但在执行它们的方式上完全相似,代表棋盘和棋子。同样,也设计了一个 AI(甚至是多线程),它说明了位板的可扩展性。如果你有任何问题,我很乐意亲自提出。

于 2012-07-20T18:13:17.877 回答
0

我同意你的观点,如果你不做人工智能,就没有太多理由像那样进行微优化。

我要提出的一个建议是,如果您正在考虑从 8x8 切换到 0x88(并且通常是为了获得良好的代码质量),您应该将尽可能多的板访问逻辑抽象为函数。例如,编写并使用

getPieceAtLocation(char file, int rank)

并打电话

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

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

于 2012-07-20T17:40:34.780 回答
0

您还应该查看其他一些 wxPython(或其他)国际象棋项目的想法:

于 2012-07-20T17:47:00.250 回答