正确的Dominion AI播放器的OOP结构

时间:2010-11-23 21:38:12

标签: c# oop artificial-intelligence

我一直在努力为流行的纸牌游戏Dominion(http://www.boardgamegeek.com/boardgame/36218/dominion)制作AI播放器。

如果你不熟悉这个游戏,它基本上是一个非常精简的魔术表演:The Gathering,那里有一个大型卡片库,上面有不同的规则。在游戏过程中,玩家会购买这些卡并将其合并到他们的套牌中。

我从机器学习的角度对这款游戏感兴趣 - 我想让机器人互相攻击,让他们玩数百万游戏,并试图获得能让他们玩得更好的数据洞察力。

我不确定如何将游戏规则(每张卡上印刷的逐字说明)与核心AI决策逻辑分开。

我开始的明显路径是为每张卡创建一个类,并将规则和AI内容放在同一个地方。这有点粗糙 - 但它似乎是阻力最小的道路。但也许每张卡最好支持某种接口,然后让AI组件对这些接口进行编码?

是否有“正确”的OOP设计?还是几种合理的可能性?

4 个答案:

答案 0 :(得分:5)

我倾向于将卡片的行为封装为自己的类,从而可以轻松地为具有多种行为(即选择)的卡片提供支持。它还允许您编写可参数化的行为,并将它们与卡片混合搭配。

因此卡片会包含卡片的费用,可以播放的时间,名称等等。它还包含卡片可以执行的行为列表。

这些行为被AI演员视为卡片的一部分。卡片上的另一个属性可以与成本一起称重。

实际上使用卡的行为的AI演员需要能够解释行为,因此行为类可能需要包含一些提示让AI理解它,但没有实际的AI逻辑本身应该包含在那里。如果AI需要针对特定​​卡片的特定行为,请将此类事物写入AI演员,而不是卡片行为。

如果一个AI演员需要知道,例如,这种行为的预期胜利点回报为.2点/回合,这可能是行为的一部分,在选择什么牌时作为AI的暗示买/玩。

但实际上我不知道你是如何接近你的AI演员设计所以也许这没有意义。但我认为将行为视为卡片的属性而不是卡片的基本部分本身可能有所帮助。

它为您提供了将AI actor的默认操作(演员可以不需要卡片的事情)封装为行为的优势,因此您可以在没有任何特殊情况代码的情况下权衡这些操作与卡片操作。

答案 1 :(得分:5)

有几个“正确”的OOP设计,取决于你想如何建模游戏过程和游戏代理的AI

就个人而言,我会在游戏中为有效的回合获取最少数量的牌,并将其作为Card类的实例实现,并将玩家实施为Agent类的实例,并实施一些简单的播放策略作为策略(模式)类的实例,然后看看会发生什么

进行一些测试,有一个完全随机的玩家作为陪衬,查看短期获利/损失最大/最小操作员,尝试使用遗传算法改变代理的策略,下载XCS分类器并查看它是否有用推导出策略...

......正确模型的概念在很大程度上取决于它的使用方式。一旦你理解了你需要如何使用游戏元素并模拟/操纵玩家策略/战术,那么你就会知道你的解决方案的“正确”结构是什么

答案 2 :(得分:0)

我不熟悉Dominion中所有卡片的变化,但为每个卡片写一个类的想法似乎很麻烦。理想情况下,您可能希望创建一个通用卡类,该类封装了卡上指令的所有变体,然后将给定卡的特定值加载到该通用类中。

我可以想象一个包含权力和限制的类可能是一个很好的一般表示。类似的东西:

  • 玩游戏资源需要
  • 禁止比赛的状态
  • 伤害类型/值
  • 健康/法力变化
  • 对其他卡片的影响(可能是卡片ID和效果的字典)
  • 等...

答案 3 :(得分:0)

我一直在考虑非AI版Dominion的逻辑,现在仍然很难搞清楚。

你几乎每个卡片组都有一个课程,每个卡片类型都有一个界面,请记住,卡片可能有多种类型(例如Great Hall,它既是动作又是胜利)。

目前,所有的攻击卡也都是动作,因此您可能希望进行攻击接口的子类操作。对于大多数卡,Action只会调用Attack方法。但是,有一些卡需要不同,例如对于Minion,您可以选择是否进行攻击。

反应牌也是动作,但也需要特殊处理,因为它们可以在对手轮到响应攻击牌时显示。至于繁荣,他们也可以通过除了攻击之外的其他事情来揭示......任何时候你都可以获得了守望台。

持续时间卡(我在之前的7种卡类型列表中遗漏了这些卡)是可以继续使用的动作...还可以计算Peddle在繁荣中的购买成本。

编辑:哎呀,我在这里根本没有解决AI问题......可能是因为我自己的开发更多的是针对多人网络版本。