我正在尝试使用wxPython中的GUI创建一个2人国际象棋程序,该程序能够验证移动并遵循每个国际象棋规则。
现在,我正处于设计的开始阶段,并想出我应该使用哪种电路板表示技术。我最近想到了明显的二维数组,但后来我读到了0x88 board representation,它在查找方面应该更快,并且逻辑上检查方块是否在棋盘内。但是,如果我制作一个没有人工智能的程序,就没有必要检查是否有人移动了一个不在董事会之外的移动。
我不知道哪个0x88表示有什么其他优点,你推荐哪一个,8x8方法或0x88。此外,首先使用8x8表示是否容易,然后,如果我决定添加AI,可能使用0x88表示? 非常感谢你的想法。
答案 0 :(得分:4)
已经提到的“标准”电路板表示(0x88,位板等)都有一个极端优化的目标。具体而言,在两个方面进行了极端优化:
“标准”董事会代表只是编写国际象棋程序并让他们在线竞争其他人和其他计算机的人群中的“标准”。这显然不是你所追求的,所以我不建议你使用任何这些方法。
这些“标准”方法实际上是试图使用比特笨拙的技巧来节省1-2个CPU周期。您使用Python的事实使得在这里节省几个周期并且完全没有意义。 Python很棒,但它并不快。
Python为您提供了许多好工具。使用它们。你的程序会很慢,而且没有任何问题。它不会“感觉”缓慢,这就是最重要的。如果我是你,我绝对会使用Python,我不会再考虑在Python中使用任何这些有点蠢蠢欲动的想法。如果你是用C语言或汇编语言编写的话,那就很有趣了。在Python中它毫无意义。
答案 1 :(得分:1)
我同意你的看法,如果你不做人工智能,就没有太多理由进行微观优化。
我要提出的一个建议是,如果您正在考虑从8x8切换到0x88(并且通常,为了获得良好的代码质量),您应该尽可能多地将电路板访问逻辑抽象为函数。例如,编写并使用
getPieceAtLocation(char file, int rank)
并致电
Piece p = getPieceAtLocation('e', 2);
或类似的东西。这样,如果你决定改变主意,你只需要在getPieceAtLocation
中重新编写逻辑,而不是改变你必须使用它的每个地方。
答案 2 :(得分:1)
http://en.wikipedia.org/wiki/Board_representation_%28chess%29
http://chessprogramming.wikispaces.com/0x88
这可能会帮助你...无法添加评论,因此将其作为答案发布。
答案 3 :(得分:1)
我不相信你决定使用AI应该对你的董事会代表是否可以包括检查广场是否在棋盘内是否有任何影响。也就是说,无论是计算机还是进行移动的玩家,您的底层表示都能够检测并优雅地处理涉及无效方块的移动。
就我个人而言,我相信比特板方法 - 我发现这种方法非常快速(因为它依赖于按位运算)并且与现代64位架构逻辑上相符。最重要的是,无论您是否决定进行人工智能,都不需要重新设计您的代表,因此它也更具有前瞻性。
与0x88相比,它更加内存友好,每个部分由一个比特代表,并且它更友好,棋盘上的棋子更少。虽然记忆可能不是现代计算机上最大的问题,但它也没有真正的缺点。
使用位板,一个按位操作可以计算多个部分的移动有效性,剩下的令牌只需要几个,这意味着你可以以最快的方式确定数百个可能的移动(加上你想要的移动深度),据我所知,相信会跑到0x88左右。
如果您对某些与位板相关的代码感兴趣,请参阅我的项目THUD!(棋盘游戏不像棋子中的国际象棋,但在执行它们方面完全相似,代表棋盘和棋子。同样,也有一个人工智能设计(多线程甚至),这说明了位板的可扩展性。如果你有任何问题,我会很乐意亲自介绍它们。
答案 4 :(得分:0)
您还应该查看一些其他wxPython(或其他)国际象棋项目的想法: