在Haskell的纸牌游戏中的不同策略

时间:2014-07-18 16:48:15

标签: haskell artificial-intelligence

我正在为这款纸牌游戏(称为Algo或Coda)编写不同的AI,目的是让它们互相对抗。由于我在Haskell方面缺乏经验,我将不同的策略硬连线到代码上,我目前有3个版本的同一个游戏,但有不同的AI组合。我举一个例子。

简单地说,游戏包括猜测对手的牌,在一轮中玩家面临两到三个选择时刻:

  1. 选择宣布哪张卡作为猜测;
  2. 如果猜测正确,请选择继续猜测或完成转弯;
  3. 当听到对手的猜测时,请选择从中吸引哪些信息。
  4. 假设a1,b1和c1是时刻1的可能动作。类似地,a2,b2和c2用于时刻2而a3,b3和c3用于时刻3.

    在我的所有文件中,我有一个AI文件,策略a1,b1,c1与策略a2,b2,c2对抗Ai。另外两个文件采用不同的策略。

    然而,我想要的是一个名为“游戏”的模块。具有接收各种玩家并运行游戏的功能,应用每个玩家对每个选择时刻的策略。

    我想解决这个问题的一个想法是定义数据类型:

    data Player = Player {moment1::StateOfTheGame -> Guess, 
                          moment2::StateOfTheGame -> Bool, 
                          moment3::Guess -> EpistemicState}
    

    但他们我不知道如何定义函数moment1,moment2和moment3。

    我的另一个想法是将策略定义为一个类,并为数据类型Player编写每个策略的实例。但我又不知道如何拼出这个想法。

    我怎样才能拥有一个名为' Game'有一个功能,接收各种玩家并运行游戏应用每个玩家在每个选择时刻的策略?

1 个答案:

答案 0 :(得分:1)

为每个策略制作一个模块。导出从模块实现播放器所需的功能。在你的主程序中创建一个玩家并传递你导出到玩家构造函数的函数。你的程序的其余部分与玩家合作,所以你甚至不知道你的名字是什么,他们将通过玩家“界面”访问。它应该是高阶函数的相当直接的应用。