【问题标题】:Correct OOP Structure for a Dominion AI PlayerDominion AI 播放器的正确 OOP 结构
【发布时间】:2010-11-23 21:38:11
【问题描述】:

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

如果你不熟悉这款游戏,它基本上是《万智牌》的一个非常精简的表亲,其中有一个庞大的卡片库,上面有不同的规则。在游戏过程中,玩家会购买这些卡片并将它们整合到自己的牌组中。

我从机器学习的角度对这款游戏很感兴趣 - 我希望让机器人相互对抗,让它们玩数百万场游戏,并尝试挖掘数据洞察力,让它们玩得更好。

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

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

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

【问题讨论】:

  • 当您说“...为每张卡片创建一个类,并且...”时,您是指具有多个实例的类 Card 还是字面意义上的多个类,每张卡片一个?跨度>

标签: c# oop artificial-intelligence


【解决方案1】:

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

所以卡片会包含卡片的费用、可以播放的时间、卡片的名称等内容。它还会包含卡片可以执行的行为列表。

AI 演员将这些行为视为卡片的一部分。卡片的另一个属性可以与成本一起衡量。

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

如果 AI 参与者需要知道,例如,此行为的预期胜利点数为 0.2 分/轮,这可能是行为的一部分,在选择什么牌时向 AI 提示买/玩。

但我真的不知道你是如何处理你的 AI 演员设计的,所以这可能没有意义。但我认为将行为视为卡片的属性而不是卡片本身的基本部分可能会有所帮助。

它还为您提供了将 AI 参与者的默认操作(参与者无需卡片即可执行的操作)封装为行为的优势,因此您无需任何特殊情况代码即可权衡这些操作与卡片操作。

【讨论】:

    【解决方案2】:

    对此有几种“正确”的 OOP 设计,具体取决于您希望如何为游戏过程和游戏代理的 AI 建模

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

    运行一些测试,让一个完全随机的玩家作为陪衬,查看短期增益/损失最大/最小算子,尝试使用遗传算法改变智能体的策略,下载 XCS 分类器并查看它是否有用导出策略...

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

    【讨论】:

      【解决方案3】:

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

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

      • 游玩所需的游玩资源
      • 禁止玩耍的国家
      • 伤害类型/价值
      • 生命值/法力值变化
      • 对其他卡片的影响(可能是卡片 ID 和效果的字典)
      • 等等……

      【讨论】:

      • Dominion 有很多卡片,其中很多都有自定义操作。
      • @R.贝姆罗斯:确实。将每种卡片类型的行为封装在一个类中绝对是正确的。行为应该在 Card 类的扩展中还是在 Card 实例或其他方法拥有的 CardBehaviour 类的扩展中是另一个问题。
      • 那些动作不能以任何方式概括?
      • @jball:之前只玩过一次,我可以说卡牌有很多不同的效果。我觉得它并不容易参数化。
      • 到目前为止我所做的唯一概括是宝藏和胜利点卡。
      【解决方案4】:

      我一直在思考非 AI 版本 Dominion 的逻辑,但仍然一团糟。

      您几乎必须为每个卡片组设置一个类,并为每种卡片类型设置一个接口,请记住卡片可能有多种类型(例如大厅,它既是动作又是胜利)。

      目前所有的Attack卡也是Actions,所以你可能想要将Attack接口子类化为action。对于大多数卡片,Action 只会调用 Attack 方法。但是,有几张牌需要有所不同,例如小兵,你可以选择是否攻击。

      反应卡也是行动,但也需要特殊处理,因为它们可以在对手的回合中显示出来以响应攻击卡。就繁荣而言,它们也可以在应对攻击以外的事物时显示出来……在你获得一张牌的任何时候都可以显示瞭望塔。

      持续时间卡(我之前在我的 7 种卡类型列表中遗漏了)是在游戏中停留额外回合的行动......并且也计入繁荣中小贩的购买成本。

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

      【讨论】:

      • 您的实施情况如何?我刚开始自己​​做,你的代码在某处可用吗?
      • @AndreasKnudsen:很遗憾,它已经搁置了一段时间。总有一天,我会有动力回去完成它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多