【问题标题】:Making an AI for a tile game [closed]为瓷砖游戏制作人工智能 [关闭]
【发布时间】:2014-10-23 12:15:43
【问题描述】:

我正在制作一个游戏,其中包含一个“瓷砖”表,其目的是将它们分成 2 x 2 的该颜色的块,有 16 种独特的颜色。我已经完成了游戏的这一部分,并想继续制作一个 AI 组件,它会为你完成游戏的最少步数提供建议。 我决定使用二维数组,这样它就可以识别每种颜色的位置,而不会直接影响电路板,我需要一些帮助。一旦我完成了数组,它应该做的是识别第一个图块的颜色并查找该图块的颜色并将它们与周围的块交换到右下方和下方和右侧。有人可以帮忙吗?

【问题讨论】:

  • 人工智能是一个复杂的话题。至少阅读一本介绍性书籍或参加一些大​​学课程以熟悉它。
  • 开始编码,如果您发现自己在任何时候都无法进一步进步,请随时再次来到这里。如果你不能自己开始,你绝对不应该这样做。
  • 因此,您需要创建一个函数来生成所有可能的棋盘状态,这些棋盘状态可以从特定棋盘状态一次移动到。您需要能够对您的棋盘状态进行评分(或者至少能够检测到完成状态)。然后你需要实施广度优先搜索来找到最接近你当前棋盘状态的棋盘状态。您可能还需要考虑添加启发式度量来引导您的搜索朝着正确的方向发展。

标签: javascript arrays artificial-intelligence cell


【解决方案1】:

听起来您想要解决一个更简单的问题,而该问题本身不需要人工智能。你最好的办法是为每个尝试的解决方案创建一个数组——可能在一个二维数组本身中——并多次解决每个谜题,跟踪移动。数组数组将充当列表,以确保您获得唯一的解决方案。

您可能希望实现一个递归求解算法来填充每个数组,对尝试次数或求解时间(或两者)设置上限,并提供具有最少转数的解作为提示。

您最终可能无法获得数学上可能的绝对最小圈数,但这至少是一个起点(通过对数学和算法优化的进一步研究,您可能会找到完美的数学解决方案)。那是一个游戏,所以玩得开心;-)。

【讨论】:

    【解决方案2】:

    不确定游戏是如何工作的,我假设它的工作方式是在相邻块之间交换颜色,直到达到完成条件。

    如果你想要找到最好的解决方案,你应该这样做:

    FUNCTION SEARCH(StackOfMoves I,O)
       FOR EACH position in chekcboard
           FOR EACH direction in possibleMoves
              makeMove(position , direction)
              StackOfMoves->addMoveToStack(position, direction)
              IF GameCompleted()
                  RETURN StackOfMoves
              ELSE 
                  SEARCH(StackOfMoves)
              END IF
           END FOR
       END FOR
    
       RETURN StackOfMoves
    END FUNCTION
    

    编辑

    安静地分析它,我认为除非你设置迭代限制或有条件退出,否则它不会正常工作,如果它选择一个错误的移动,它可能会一遍又一遍地迭代错误的移动。查看当前状态是否已被处理并返回 false 的条件可能会修复它,但肯定是更好的解决方案。稍后我会尝试给出更好的答案。

    【讨论】:

      【解决方案3】:

      在我看来,您可能希望对此进行深度优先搜索的变体。这实质上是移动,为新位置分配分数,然后回溯到先前的位置或进行另一次移动。游戏中可能的移动序列可以表示为一棵树,深度优先从树的根开始计算移动,直到它到达叶节点(或最大深度),然后回溯一个节点并评估下一个节点兄弟分支。这可以迭代或递归完成。

      计算每个棋盘位置的分数对于任何类型的搜索都很重要。您需要知道任何职位是否比其他职位更好或更差。您的评分算法确实取决于游戏。在您捕获棋子(例如国际象棋)的游戏中,一个非常基本的评分算法只会为每个棋子分配一个点值。你每个位置的分数只是你的棋子的总和减去敌人的棋子的总和。你必须为你自己的游戏想出一个评分算法。理想情况下,这将很快计算出来,并且在您接近获胜时会给出更好的分数。

      每个位置的得分可以存储在数据库中,因此如果可以通过不同的移动序列到达相同的位置,您只需计算该位置的得分一次。然后,如果您在搜索中再次到达相同的位置,您已经在数据库中获得了分数。程序通常会计算棋盘状态的哈希值来索引表中的位置。

      使用深度优先,所需的计算量部分取决于搜索的深度。许多国际象棋程序使用称为迭代深化的技术来允许搜索快速生成猜测,然后在更多搜索时间后生成更好的移动。您首先搜索深度为 1 步。这些位置中的每一个都存储在数据库中,因此您无需重新计算分数。将所有动作评估为深度 1 后,您将重新开始并将动作树评估为深度 2。每次迭代都需要指数级更多的计算时间,因此迭代深化可以让您在有更多思考时间时生成更好的动作。

      通过深度优先搜索和分数数据库,您可以进行分支修剪。如果当您下降一个分支时,您确定该分支的最佳分数比您已经评估过的分支差,那么您可以停止当前分支并回溯。这通常是通过两个玩家的游戏来完成的,每个玩家都试图最大化自己的分数并最小化对手的分数。搜索 alpha-beta pruning 了解更多信息。

      深度优先搜索只是您可以使用的一种算法。根据游戏的不同,您可以使用其他类型的算法获得更好的结果。例如,您可以使用神经网络,它可以用比赛前的训练时间代替比赛期间的搜索时间。无论如何,即使是看似简单的游戏,您也可以花费大量时间来开发 AI。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-08
        • 2011-11-21
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多