实现一个象棋引擎有多难?

50
我在想实现一款国际象棋引擎有多难。是否已经存在开源实现?
似乎需要为给定的棋局设定一个评分函数,并以非常快的方式探索几个可能的未来棋局。当然不可能探索所有可能的未来着法,因此可以贪婪地跟随最有前途的着法,或者使用类似模拟退火这样的近似技术以概率性地跟随可能的着法。
您认为这是否在机器学习研究生项目的范围内——假设学生能够使用基本功能,例如返回给定棋子的下一步可能移动的开源实现?可能过于困难了吗?
有不同的团队研发国际象棋引擎然后让它们相互对战的确是一个有趣的项目...

感谢所有的回答。另一个方面是棋谱数据库。http://www.chessgames.com 上使用了一个大型的数据库,但是否有可供免费使用的数据库?此外,理想情况下,人们希望在比赛进行中学习对手的下棋方式,以更好地预测他或她的下一步棋。 - Frank
13个回答

56

我花了一年时间用C#构建自己的国际象棋引擎。这并不是很困难。在我的工作中,我犯了错误,发现互联网上的信息并没有表述得清晰明了,而且很多信息只是从其他网站复制而来。

为了让其他人更轻松地进行这个过程,我一直在记录我的国际象棋引擎开发过程,并在我的博客上发布了大量源代码:

http://www.chessbin.com

我甚至创建了一个国际象棋游戏开发工具包,可以帮助你开始开发自己的国际象棋引擎,其中包含:

  1. 表示国际象棋棋盘和棋子所需的所有代码
  2. 与验证棋子移动相关的代码
  3. 图形用户界面,显示国际象棋棋局并允许您在棋盘上移动棋子

我的网站基本上是专门为像你这样想要开始构建自己的国际象棋引擎的人而设的。


2
chessbin发生了什么?它消失了,我得到了404错误? - hr0m
3
对于那些未来查看此内容的人,我找到了Adam Berent的网站:https://www.adamberent.com/wp-content/uploads/2019/02/GuideToProgrammingChessEngine.html。 - eracer9

37

是的,这绝对属于学生项目范围内。以下是我的档案库中一些链接,供您开始使用:

  • 最后,这里是维基百科关于计算机国际象棋的解释

  • 1
    我只想指出旋转位板不再是首选的方法。现在,大多数使用旋转位板的程序员都使用一种称为魔术位板的技术(http://chessprogramming.wikispaces.com/Magic+Bitboards)。 - Mathieu Pagé
    谢谢,Mathieu - 我会进一步调查这个技术。 - HTTP 410
    我的新C#棋类引擎使用了神奇的位棋盘技术。它们非常快,但最初很难理解(旋转位棋盘甚至更糟)。 - HTTP 410
    这是对MTD的良好分析,一种复杂的搜索算法。链接似乎已过期。这里有一篇论文研究MTD(f):http://people.csail.mit.edu/plaat/mtdf.html - bytefire

    9

    Crafty 是顶尖的国际象棋引擎之一,完全开源。不过,我建议你不要在学生项目中使用它,因为它是用 C 语言编写的,非常复杂,并且高度优化,很难理解。

    对于教育目的,我建议查看 Adam Berents 网站,他在其中描述了他在 C# 中实现国际象棋引擎时经历的过程。当然也提供了源代码。在我看来,这是一个很好的起点。


    2
    Adam Berent已经回答了这个问题,他的答案绝对值得一看。 - Stefan Thyberg

    7

    我无法回答你的问题,但我可以回答你的最后一条评论

    "让不同的团队开发国际象棋引擎并让它们相互对弈将是一个有趣的项目..."

    FICS国际象棋服务器上已经实现了这个功能。我建议你登录该网站(需要使用telnet),查看文档,可能会与能够给你有关其国际象棋机器人的具体提示的人取得联系。


    6
    一个合理的现代PC上的国际象棋引擎当然是可行的,特别是如果你足够老,还记得有许多只使用了1和2 MHz 8位机器上几K内存的国际象棋程序可以下得相当不错。现在你可以用解释性语言编写一个国际象棋引擎,并击败顶尖的6502或Z80程序员编写的最紧凑、最快速的代码。

    我曾与丹·斯普拉克林(Dan Spracklen)一起工作,他在1978年与妻子凯瑟琳(Kathleen)一起创造了Sargon。凯瑟琳的兄弟将其移植到了Apple II上,我和他以及他的儿子一起工作过。(当我和这些人一起工作时,面向消费者的国际象棋业务已经结束了。我记得有个人推出了Atari ST和Amiga国际象棋游戏,但那时市场上真的没有太多需求。)

    Computer Gamesmanship》是1983年业余爱好者进行国际象棋编程的绝佳入门读物。它仍然很有趣。涵盖了alpha-beta、minimax等好东西。

    这是一本足够好的书,你可以从那里开始,然后了解自那时以来所取得的进展。

    alt text


    5
    制作一个好的棋引擎很困难,但可能是毕业项目的适当水平(当我攻读计算机科学学士学位时,我的一个朋友为他的毕业论文写了一个国际象棋引擎)。
    是的,有开源的棋引擎,其中领先的竞争者是GNU Chess,它非常受人尊敬。

    http://www.craftychess.com/ 也在那里。 - ephemient
    遗憾的是,GNU Chess现在已经落后于领先者很远。 - ABCD

    4
    这取决于您的目标强度水平和编程技能。假设您是一位有经验的程序员,这是我的意见(我知道很多引擎,但从未编写过一个):
    * 一个非常简单的引擎,可以击败初学者/业余爱好者(ELO 1200-1600):代码量大,但易于理解。
    * 一个可以击败“俱乐部选手”(ELO 1800-2000)的引擎:开始变得困难,您需要开局书、优化和坚实的人工智能。
    * 一个可以击败大师的引擎:难度大,需要几年的经验。
    * 顶级引擎(如Rybka、Houdini、Stockfish、Hiarcs),可以99%的时间击败地球上任何人类:这需要巨大的努力,需要很多耐心和多年的经验。
    这就是我的看法!

    我喜欢这个答案,因为我正在考虑采用它,并试图看到一个大致的指导方针,以便知道应该瞄准什么样的性能。不过,我想知道你是如何得出这些估计的? - emschorsch
    我是一名俱乐部级别的运动员和程序员。 - Fernando

    2
    每年在我们的大学,人工智能课程(三年级课程)要求学生从零开始创建一个象棋程序并撰写一篇论文。我们在讲座中涵盖了关于对抗搜索的章节,以便学生有足够的知识去完成这个项目。 对于我们来说,这个项目可以由我们自己完成,也可以与另一个人合作完成(如果与合作伙伴一起完成,则期望获得更好的程序,例如更深层次的ply等)。 因为计算机图形学课程也是一个三年级课程,所以学生被允许将该课程的期末项目与人工智能课程的期末项目相结合。
    由于我刚好在我的第三年,并且正在上这两门课程(现在已经结束了第一个学期),我和一个也在这两门课程中的朋友一起工作,自考试结束以来(大约在12月21日左右)我们一直在进行这个项目,截止日期是1月11日。
    它完全可以在一个月内完成(特别是作为研究生项目)。我们正在制作一个3D象棋程序,因此需要比仅仅制作象棋引擎更多的工作。 最困难的部分将是决定棋盘表示,实现所有规则(吃过路兵,短/长将军,升变等),创建启发式函数和游戏树(通常使用alpha-beta剪枝完成)。
    这是我们用来记录进展的网站,并且一旦完成后托管代码和论文(现在有点空)。http://sites.google.com/site/chessatbrock/

    0

    这可能太简单了,但仍然有一些有趣的教训可以学习:我向您介绍ZX81国际象棋游戏


    0

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