如果要编写国际象棋游戏引擎,您将使用哪种编程范例(OOP,过程等),为什么要选择它?象棋引擎是指程序的一部分,它可以评估当前板并确定计算机的下一个动作。
我问是因为我认为写象棋引擎可能很有趣。然后我想到可以将其用作学习函数式编程的项目。然后我想到有些问题不太适合功能范式。然后我想到这可能是很好的讨论饲料。
如果要编写国际象棋游戏引擎,您将使用哪种编程范例(OOP,过程等),为什么要选择它?象棋引擎是指程序的一部分,它可以评估当前板并确定计算机的下一个动作。
我问是因为我认为写象棋引擎可能很有趣。然后我想到可以将其用作学习函数式编程的项目。然后我想到有些问题不太适合功能范式。然后我想到这可能是很好的讨论饲料。
Answers:
我想这取决于您的目标,我认为这完全是教法。如果您要编写具有竞争力的产品,则希望在最低级别的评估人员中获得最高的效率。这里有很多机会进行位级并行处理。哈希表也有很多机会。还有利用并行性的机会。然后在更高的级别上,您可能想要一个对AI有好处的系统,因此这可能意味着功能性编程语言。显然,您不想做所有这些事情,只选择其中一两个,并满足于您的项目不会与更好的程序竞争的事实。
我在名为The Turk的国际象棋引擎中选择了OOP范例。我的国际象棋引擎的第一个版本编写的是程序化而非OOP,然后由于长代码块和不良设计,我很难改进我的国际象棋引擎。
这取决于编写国际象棋引擎时要实现的目标。如果要创建一个过于强大的国际象棋引擎,由于后期绑定速度较慢,甚至无法使用OOP语言来实现。如果您只是想学习编程,还希望通过编写象棋引擎获得乐趣,那么托管语言和OOP将是您的朋友。我可以建议您选择C#,因为也可以用更多的过程方式来编写国际象棋引擎。
我移植了一个简单的国际象棋程序,作为学习第四语言的一种手段。事实证明,这非常适合这个非常必要的问题,我学到了很多东西。开放式堆栈使我能够以独特的方式实现alpha-beta搜索,这使我对算法有了更深入的了解。
有人会认为函数式编程对于国际象棋程序会非常有用,因为核心算法(alpha-beta深度优先搜索,评估)是递归的并且功能严格。但是,国际象棋程序会因效率而生死,而当前的所有功能语言都没有实现这一目标。前一百个最先进的引擎都使用命令式语言(主要是C / C ++,然后是Delphi),以便最大程度地控制内存使用,多线程,全局状态和代码生成。所有功能语言都对核心数据结构使用动态内存分配,这对于国际象棋程序来说是致命的。
我仍然希望看到有人尝试使用一种功能语言闯入前100个国际象棋引擎。