我正在编写我的第一个游戏,我还有最后一个问题需要解决。我需要一个算法来检查我是否可以将选定的球移动到选定的位置。
看看这张照片:
规则是,如果我在白色背景上拾取蓝色球(在中间),我可以将它移动到所有绿色空间,我无法将其移动到紫色球,因为它们有点像被其他球围起来。我自然不能把它移到其他球的地方。球只能向上,向下,向左和向右移动。
现在我知道有两种已经存在的算法:A *和Dijkstra的算法可能会有所帮助,但它们看起来太复杂了我需要的东西(都使用我尚未教过的载体或东西,我'对编程很新,这是我的学期项目)。我不需要找到最短路,我只需要知道所选目的地是否被其他球围起来。
我在游戏中的电路板是9x9阵列,如果它是空的地方,则只需填充'/',如果它被拍摄,则为7个字母中的一个。
我是否可以通过简单的方式对算法进行编码?
[我去了洪水填充它工作得很好,谢谢你的帮助,如果有人有类似的问题 - 我建议使用洪水填充,它真的很简单快速] < / p>
答案 0 :(得分:11)
我建议使用Flood fill算法:
Flood填充,也称为种子填充,是一种确定填充的算法 连接到多维数组中给定节点的区域。它是 用于填充工具的“桶”填充工具来填充连接, 具有不同颜色的类似颜色的区域,以及诸如的游戏 Go和Minesweeper确定清除哪些碎片。什么时候 应用于图像以用颜色填充特定的有界区域 也被称为边界填充。
就复杂性时间而言,该算法将等于递归的算法:O(N×M)
,其中N和M是输入矩阵的维度。关键的想法是,在两种算法中,每个节点最多只处理一次。
在此link中,您可以找到算法实施指南。
更具体地说,正如Martin Bonner所说,实施有一些关键概念:
PS:您可能需要阅读Flood fill vs DFS。
答案 1 :(得分:4)
您可以使用BFS(Breadth First Search)算法非常简单地执行此操作。
为此,您需要学习 Graph 数据结构。一旦你理解它,它很容易实现。
关键理念
您的单元格将充当顶点,而边缘将告诉您是否能够从一个单元格移动到另一个单元格。
使用邻接列表或邻接矩阵表示实现图形后,您最好使用BFS算法来执行您尝试执行的操作