Javascript 为瓷砖游戏制作AI

Javascript 为瓷砖游戏制作AI,javascript,arrays,artificial-intelligence,cell,Javascript,Arrays,Artificial Intelligence,Cell,我在做一个游戏,包括一张“瓷砖”的桌子,目标是把它们分成2乘2的块,有16种独特的颜色。我已经完成了游戏的这一部分,我想继续制作一个AI组件,为你完成游戏的最少移动次数提供建议。 我决定使用2d阵列,这样它可以识别出每种颜色的位置,而不会直接影响电路板,我需要一些帮助。一旦我完成了阵列,它应该做的是识别第一块瓷砖的颜色,并寻找该瓷砖的颜色,然后将它们与周围的方块交换到右下方、下方和右侧。有人能帮忙吗?听起来你想做的是解决一个简单的问题,而这个问题本身不需要人工智能。你最好的办法是为每个尝试的解决

我在做一个游戏,包括一张“瓷砖”的桌子,目标是把它们分成2乘2的块,有16种独特的颜色。我已经完成了游戏的这一部分,我想继续制作一个AI组件,为你完成游戏的最少移动次数提供建议。
我决定使用2d阵列,这样它可以识别出每种颜色的位置,而不会直接影响电路板,我需要一些帮助。一旦我完成了阵列,它应该做的是识别第一块瓷砖的颜色,并寻找该瓷砖的颜色,然后将它们与周围的方块交换到右下方、下方和右侧。有人能帮忙吗?

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

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


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

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

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

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可能会修复它,但肯定是更好的解决方案。稍后我会尝试给出一个更好的答案。

我觉得您可能需要一种不同的深度优先搜索。这实际上是一个移动,为新位置分配分数,或者返回到前一个位置,或者进行另一个移动。游戏中可能的移动序列可以表示为一棵树,深度首先从树的根开始计算移动,直到到达叶节点(或最大深度),然后回溯一个节点并计算下一个兄弟分支。这可以迭代或递归地完成

计算每个董事会职位的分数对于任何类型的搜索都很重要。你需要知道任何职位比其他职位好还是坏。你的得分算法真的取决于比赛。在您捕获棋子(如国际象棋)的游戏中,一个非常基本的计分算法只会为每个棋子分配一个分值。你每个位置的得分就是你的棋子总数减去敌人棋子总数。你必须为自己的比赛想出一个得分算法。理想情况下,这将是快速计算,并会给一个更好的分数,因为你接近胜利

每个位置的分数都可以存储在数据库中,因此,如果可以通过不同的移动序列到达同一位置,则只需计算该位置的分数一次。然后,如果您在搜索中再次到达相同的位置,则数据库中已经有了分数。程序通常计算电路板状态的散列,以索引表中的位置

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

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


深度优先搜索只是您可以使用的一种算法。根据游戏的不同,您可以使用其他类型的算法获得更好的结果。例如,你可以使用神经网络,它可以用游戏前的训练时间来代替游戏中的搜索时间。无论如何,你可以花很多时间开发人工智能,即使是看似简单的游戏。

AI是一个复杂的话题。至少读一本介绍性的书或参加一些大学课程来熟悉它。开始编码,如果你发现你在任何时候都无法进一步进步,欢迎再次来到这里。如果你无法启动自己,你绝对不应该这样做。因此,你需要创建一个函数,生成所有可能的板状态,这些状态可以从特定的板状态一次移动到。您需要能够对板状态进行评分(或者至少能够检测到完成状态)。然后,您需要实现广度优先搜索,以查找最接近当前板状态的板状态。你也可以考虑