在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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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