用于编写国际象棋引擎的范式是什么?


9

如果要编写国际象棋游戏引擎,您将使用哪种编程范例(OOP,过程等),为什么要选择它?象棋引擎是指程序的一部分,它可以评估当前板并确定计算机的下一个动作。

我问是因为我认为写象棋引擎可能很有趣。然后我想到可以将其用作学习函数式编程的项目。然后我想到有些问题不太适合功能范式。然后我想到这可能是很好的讨论饲料。


1
这类似于从头开始编写C编译器。我不会重新发明轮子。我将首先研究现有的。
工作

10
@工作:我的目标是过程而不是结果。即使我最终遇到了一个非常糟糕的引擎,我认为在分析问题并开发出解决问题的方法的过程中也可能会有价值,尤其是当我在过程中学习了一些新的编程方法时。

1
祝好运。没有真正的雇主会要求您从头开始发展,但是在面试中他们可能会问您如何解决问题。
工作

6
@Job拥抱编程生涯的大部分时间是在编写代码,这并不是因为确实需要它们,而是因为可以。

1
@Mark,拥抱生活如何?)=旅行,语言,戏剧,诗歌,户外活动等等?我喜欢编程,但是当我本身不这样做时,我还有1000件事要做。
工作

Answers:


7

就我所知,评估不是一个可并行化的问题,但是评估不同的链则是,因此我肯定会编写它来利用多核和多线程。

无论您是去功能性还是半功能性,都取决于品味。我个人将使用OOP,并使用对功能编程和并行化的支持,例如C#

在旁注中,如果我要编写一个象棋引擎,我会尝试制作一个真正可以“思考”国际象棋的引擎。使用棋盘评估进行暴力破解,所有可能的组合都被成功地完成了,而且效果非常好,但是afaik在开发更具思维/模糊性的国际象棋引擎方面并没有取得太大进展。那将是一个挑战!:)

查找一些具有非常棘手的位置游戏和强力动作(标记为!或!!)的游戏,并使用它们来训练和测试您的引擎。


2

我想这取决于您的目标,我认为这完全是教法。如果您要编写具有竞争力的产品,则希望在最低级别的评估人员中获得最高的效率。这里有很多机会进行位级并行处理。哈希表也有很多机会。还有利用并行性的机会。然后在更高的级别上,您可能想要一个对AI有好处的系统,因此这可能意味着功能性编程语言。显然,您不想做所有这些事情,只选择其中一两个,并满足于您的项目不会与更好的程序竞争的事实。


2

我在名为The Turk的国际象棋引擎中选择了OOP范例。我的国际象棋引擎的第一个版本编写的是程序化而非OOP,然后由于长代码块和不良设计,我很难改进我的国际象棋引擎。

这取决于编写国际象棋引擎时要实现的目标。如果要创建一个过于强大的国际象棋引擎,由于后期绑定速度较慢,甚至无法使用OOP语言来实现。如果您只是想学习编程,还希望通过编写象棋引擎获得乐趣,那么托管语言和OOP将是您的朋友。我可以建议您选择C#,因为也可以用更多的过程方式来编写国际象棋引擎。


如何评价ELO?比狡猾?

@ThorbjørnRavn Andersen-Crafty是用C语言编写的高级开源国际象棋引擎之一,他一生都在国际象棋编程中度过。不幸的是我没有测试过elo等级,因为在测试elo等级之前还有很多事情要做。目前的评估只是评估件值,因此它的评估能力很弱,而且我还没有实现所有必要的算法。不幸的是,我现在没有时间在这个项目上花费。我希望有一天可以继续进行下去。
Freshblood 2011年

抱歉,我以为它可以播放。我的错。

@ThorbjørnRavn Andersen-我在那里发布了一些版本,并准备构建最新的存储库变更集。我只是想说目前还很薄弱。
Freshblood 2011年

2

我移植了一个简单的国际象棋程序,作为学习第四语言的一种手段。事实证明,这非常适合这个非常必要的问题,我学到了很多东西。开放式堆栈使我能够以独特的方式实现alpha-beta搜索,这使我对算法有了更深入的了解。

有人会认为函数式编程对于国际象棋程序会非常有用,因为核心算法(alpha-beta深度优先搜索,评估)是递归的并且功能严格。但是,国际象棋程序会因效率而生死,而当前的所有功能语言都没有实现这一目标。前一百个最先进的引擎都使用命令式语言(主要是C / C ++,然后是Delphi),以便最大程度地控制内存使用,多线程,全局状态和代码生成。所有功能语言都对核心数据结构使用动态内存分配,这对于国际象棋程序来说是致命的。

我仍然希望看到有人尝试使用一种功能语言闯入前100个国际象棋引擎。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.