我正在为一种名为Algo或Coda的卡牌游戏编写不同的AI程序,目的是让它们相互对抗。由于我在Haskell方面的经验不足,我将不同的策略硬编码进了程序中,目前我有三个版本的同一游戏,但每个版本使用了不同的AI组合。让我举个例子说明一下。
简而言之,游戏的核心是猜测对手的卡牌。在一轮游戏中,玩家需要面对两到三个选择时刻:
- 选择宣布哪张卡作为猜测;
- 如果猜测正确,选择继续猜测还是结束回合;
- 在听到对手的猜测时,选择从中提取哪些信息。
假设a1、b1和c1是第一时刻可能的行动。同样,a2、b2和c2是第二时刻的,a3、b3和c3是第三时刻的。
在我的所有文件中,有一个文件是关于使用策略a1、b1、c1的AI与使用策略a2、b2、c2的AI对战的。还有另外两个文件使用了不同的策略组合。
然而,我希望有一个名为’Game’的模块,其中包含一个函数,该函数接收不同类型的玩家并运行游戏,应用每个玩家在每个选择时刻的策略。
我想到的一个解决方案是定义数据类型:
data Player = Player {moment1::StateOfTheGame -> Guess, moment2::StateOfTheGame -> Bool, moment3::Guess -> EpistemicState}
但我不知道如何定义moment1、moment2和moment3这些函数。
我还想到另一个方法,即将策略定义为一个类,并为Player数据类型编写每个策略的实例。但我也不确定如何具体实现这个想法。
如何创建一个名为’Game’的单一模块,其中包含一个函数,该函数接收不同类型的玩家并运行游戏,应用每个玩家在每个选择时刻的策略?
回答:
为每种策略创建一个模块。从模块中导出你需要实现玩家的函数。在你的主程序中创建一个玩家,并将你导出的函数传递给玩家的构造函数。你的程序的其余部分将与玩家交互,因此函数的命名并不重要,它们将通过玩家“接口”访问。这应该是一个相当直接的高阶函数应用。