Unity 2D/3D – 为三消游戏创建电脑对手(AI)

我正在寻找指导和建议,关于如何开始为三消游戏创建一个电脑AI对手。这个问题困扰了我多年(字面上),因为我一直无法解决。我已经用尽了Google来寻找这个答案。

具有电脑对手的三消游戏样本包括:Puzzle QuestCrystal Battle

在创建这样的AI对手时使用了哪些编程方法论,我如何将其应用于Unity 2D脚本?我应该从哪里开始?如何开始?我主要在寻找一个教程或一些能让我朝正确方向前进的东西。我意识到这不是一件简单快速的事情,但我希望一步一步尝试,以便更好地理解这些内容。

提前感谢!


回答:

这里有两个问题:

  • 生成可能的移动
  • 选择最佳移动

如果你的棋盘相当小,你可以简单地使用蛮力方法来解决这两个问题。对于你网格中的所有位置,检查是否可以向上、向下、向左或向右移动,你就有了移动生成器。(你应该已经为单人游戏版本实现了有效移动的检查)。

选择最佳移动会稍微复杂一些,因为你必须评估每个移动。常见的方法是使用MiniMax方法。基本思路是,你构建一个包含未来几回合所有可能移动的树,并为每个叶子节点分配一个分数。然后你简化树,使得父节点在AI移动时成为max(leaves),在玩家移动时成为min(leaves)。最终,你会在根节点得到你的移动分数。

对于这种基本的AI编程,一个很好的资源是Chess Programming Wiki(你不需要那里描述的90%的内容。从MiniMax和AlphaBeta算法开始)。

另一方面,对于最简单的AI,你可以随机选择一个移动,三消游戏在规划移动方面并不是最 demanding的。

编辑:作为事后思考,以下似乎是一个合理的三消游戏AI策略:

假设每次移动后添加的所有随机宝石都无法匹配:

  1. 选择一个使我的对手无法移动的移动(没有子节点)。
  2. 如果1.不可行,选择任何移动,无论我的对手选择哪个移动,都能保证我有另一个移动(没有子节点是叶子节点)。
  3. 如果2.不可行,随机选择一个移动。

Related Posts

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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