我正在制作一个涉及“瓷砖”桌面的游戏。其目的是将它们分组成2×2的那种颜色的块,其中有16种独特的颜色。我已完成游戏的这一部分,并希望继续制作一个AI组件,提供一个建议,你可以完成游戏的最小数量的动作。 我决定使用2d阵列,因此它可以识别每种颜色的位置,而不会直接影响电路板,我需要一些帮助。一旦我完成了数组,它应该做的是识别第一个瓷砖的颜色并寻找该瓷砖的颜色,并将它们与周围的块一起交换到右下方和下方和右侧。有人可以帮忙吗?
答案 0 :(得分:1)
听起来你正在寻找的是解决一个本身不应该需要AI的简单问题。最好的办法是为每个尝试的解决方案创建一个阵列 - 可能是二维阵列本身 - 并且多次解决每个难题,跟踪移动。数组数组将作为列表,以确保您获得独特的解决方案。
您可能希望实现一个递归求解算法来填充每个数组,对尝试次数或解决时间(或两者)都有一个上限,并提供具有最少匝数的解决方案作为提示。
你可能不会以数学方式得到绝对最小匝数,但它至少是一个起点(并且对数学和算法优化有一些进一步的研究,你可能会遇到完美的数学解决方案)。那就是游戏,所以玩得开心; - )。
答案 1 :(得分:0)
不确定游戏是如何工作的,我认为它的工作方式是在相邻的块之间交换颜色,直到达到完成条件。
如果您想要的是找到最佳解决方案,您应该这样做:
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可能会修复它,但肯定可能是更好的解决方案。我稍后会尝试给出更好的答案。
答案 2 :(得分:0)
听起来对你来说,你可能想要一个深度优先搜索的变体。这基本上是一个移动,为新位置分配一个分数,并回溯到前一个位置或进行另一个移动。游戏中可能的移动序列可以表示为树,深度优先从树的根开始并评估移动直到它到达叶节点(或最大深度),然后回溯一个节点并评估下一个节点兄弟姐妹。这可以迭代或递归完成。
计算每个董事会职位的分数对于任何类型的搜索都很重要。您需要知道任何位置是否比其他位置更好或更差。你的得分算法实际上取决于游戏。在你捕捉国际象棋等棋子的游戏中,一个非常基本的得分算法只会为每个棋子分配一个点值。每个位置的得分只是你的碎片总和减去敌人的总和。你必须为自己的游戏提出一个评分算法。理想情况下,这将是快速计算,并将在您接近获胜时给出更好的分数。
每个位置的得分可以存储在数据库中,因此如果可以通过不同的移动顺序到达相同的位置,则只需计算该位置的得分一次。然后,如果您在搜索中再次达到相同位置,则您已在数据库中获得该分数。程序通常计算电路板状态的散列以索引表中的位置。
使用深度优先,所需的计算量部分取决于搜索的深度。许多国际象棋程序使用称为迭代加深的技术,以允许搜索快速生成猜测,然后在更多搜索时间之后生成更好的移动。首先搜索深度为1的移动。这些位置中的每一个都存储在数据库中,因此您无需重新计算分数。一旦你评估了所有向深度为1的移动,你就重新开始并评估移动树到深度2.每次迭代需要指数级的时间来计算,所以迭代加深可以让你产生更好的移动,因为你有更多的时间思考。
通过深度优先搜索和分数数据库,您可以进行分支修剪。如果您下降分支时,您确定该分支的最佳分数比您已评估的分支更差,那么您可以停止当前分支并回溯。这通常通过两个玩家游戏来完成,其中每个玩家都试图最大化他自己的得分并最小化对手的得分。有关此问题的更多信息,请搜索alpha-beta修剪。
深度优先搜索只是您可以使用的一种算法。根据游戏,您可以使用其他类型的算法获得更好的结果。例如,您可以使用神经网络,它可能会在比赛前用训练时间取代搜索时间。无论如何,你可以花很多时间来开发人工智能,即使对于看似简单的游戏也是如此。