15.5.1 对弈引擎的设计
在介绍对局的时候我们提到过对弈引擎,对弈引擎的作用就是根据当前的局面生成落子点,但是,对弈引擎并不是主动地去下棋,它是被对局安排在某个对局中,在需要它下棋的时候才去下棋。由此,对弈引擎的接口应该尽可能的简洁,使之更加方便的被使用。
并且,我们的目的是找到更好的下棋策略,而目前并没有一个固定的思路,我们是抱着一种探索的态度。所以,在我们的程序中,对弈引擎也并不唯一,不同的引擎实现不同的策略,借此可以让不同的引擎来互相对弈,以找到效果最好的策略。
从整个程序的构架上讲,引擎模块起一个承上启下的连接作用。一方面,引擎模块需要被对局类调用产生相应的落子位置,另一方面,引擎模块需要整合所有其他模块的资源来为生成落子位置这一总目标服务。
为此,在实现上,为了避免调用不同的引擎就需要一套不同的代码,我们就需要让各个引擎有个统一的接口,将引擎的所有功能都封装起来,在调用时只通过这个统一的接口来调用引擎,只是根据实例的不同来选择不同的实现。
这样看来,对于引擎模块,我们需要一个抽象类作为基类。在这个抽象类中,我们以一个纯虚函数作为接口函数,所有继承自该抽象类的子类也就都必须实现该虚函数,进而,所有的引擎类就都可以通过这样一个统一的接口来进行处理。
有了统一的接口,我们便可以拥有众多继承自这个抽象类的子类,这些引擎类具有不同的策略,策略不只是指引擎的判断逻辑,也包括可以从终端或者网络来接收落子信息。通过这样,我们的程序便不止可以实现程序本身的对弈,也可以实现人机对弈、人人对弈,并且,也可以和实现了同一协议的其他程序间进行对弈,以此来获得更广泛的交流。
引擎模块在整个程序中的地位见图15.1。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。