Python 0x88棋盘表示法

Python 0x88棋盘表示法,python,wxpython,artificial-intelligence,chess,Python,Wxpython,Artificial Intelligence,Chess,我正在尝试用wxPython中的GUI制作一个2人国际象棋程序,该程序能够验证移动并遵循每一个国际象棋规则 现在,我正处于设计的开始阶段,正在考虑应该使用哪种电路板表示技术。我最近想到了一个明显的二维数组,但后来我读到了一篇文章,认为它在查找和逻辑上检查正方形是否在棋盘内。但是,如果我制作了一个没有人工智能的程序,就不需要检查是否有人移动了一个跳板之外的移动 0x88表示法是否还有我不知道的其他优点?您推荐哪一种,8x8表示法还是0x88表示法。另外,首先使用8x8表示是否容易,然后,如果我决定

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

现在,我正处于设计的开始阶段,正在考虑应该使用哪种电路板表示技术。我最近想到了一个明显的二维数组,但后来我读到了一篇文章,认为它在查找和逻辑上检查正方形是否在棋盘内。但是,如果我制作了一个没有人工智能的程序,就不需要检查是否有人移动了一个跳板之外的移动

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

我同意您的看法,如果您不使用人工智能,那么就没有太多理由像这样进行微优化

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

getPieceAtLocation(char file, int rank)
打电话

Piece p = getPieceAtLocation('e', 2);
或者类似的东西。这样,如果你决定改变主意,你只需要在
getPieceAtLocation
中重新编写逻辑,而不是改变你必须使用它的每个地方。



这可能对您有所帮助…无法添加评论,因此将此作为答案发布。

您还应查看其他wxPython(或其他)国际象棋项目,以获取想法:

  • (wx)
  • (特金特)
  • PyGame-

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

就我个人而言,我相信位板方法——我发现这种方法速度非常快(因为它依赖于位操作),并且在逻辑上符合现代64位体系结构。最重要的是,无论您是否决定进行人工智能,都不需要对您的表示进行任何重新设计,因此它也更能证明未来

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

对于位板,一次按位操作可以计算出多个块的移动有效性,而剩余的标记只需多计算几个,这意味着您可以以尽可能快的方式确定数百个可能的移动(再加上您所需的移动深度),据我所知,这种方式大约运行0x88圈

如果您对一些与比特板相关的代码感兴趣,请参阅我的项目(一款与游戏规则中的国际象棋不太相似的棋盘游戏,但在如何执行它们、表示棋盘和棋子方面完全相似。同样,也设计了一款AI(甚至多线程),这说明了比特板的可扩展性。如果您有任何疑问,我很乐意亲自填写。

前面提到的“标准”电路板表示法(0x88,比特板等)都有一个极端优化的目标。具体来说,极端优化有两个方面:

  • 快一点,越快越好
  • 为程序员提供更好的工具箱来指导象棋树搜索,从而提高了人工智能
  • “标准”棋盘表示法只是编写国际象棋程序并让他们在线与其他人和其他计算机进行竞争的人群中的“标准”。这显然不是你想要的,因此我不建议你使用这些方法中的任何一种

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


    Python给了你很多好的工具。使用它们。你的程序会很慢,这没有什么错。它不会“感觉”慢,这才是最重要的。如果我是你,我绝对会使用Python,而且我不会再考虑在Python中使用任何这些琐碎的想法。如果你是用C或汇编语言编写的,琐碎的琐碎是有趣的。在Python中它是毫无意义的。

    你不会真正看到消费类计算机的性能差异今天,我的手机有足够的处理能力下国际象棋,并且一直打败我。