在Haskell中实现卡牌游戏的不同策略

我正在为一种名为Algo或Coda的卡牌游戏编写不同的AI程序,目的是让它们相互对抗。由于我在Haskell方面的经验不足,我将不同的策略硬编码进了程序中,目前我有三个版本的同一游戏,但每个版本使用了不同的AI组合。让我举个例子说明一下。

简而言之,游戏的核心是猜测对手的卡牌。在一轮游戏中,玩家需要面对两到三个选择时刻:

  1. 选择宣布哪张卡作为猜测;
  2. 如果猜测正确,选择继续猜测还是结束回合;
  3. 在听到对手的猜测时,选择从中提取哪些信息。

假设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’的单一模块,其中包含一个函数,该函数接收不同类型的玩家并运行游戏,应用每个玩家在每个选择时刻的策略?


回答:

为每种策略创建一个模块。从模块中导出你需要实现玩家的函数。在你的主程序中创建一个玩家,并将你导出的函数传递给玩家的构造函数。你的程序的其余部分将与玩家交互,因此函数的命名并不重要,它们将通过玩家“接口”访问。这应该是一个相当直接的高阶函数应用。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注