简单的游戏算法检查移动是否有效

时间:2017-08-31 08:56:44

标签: c++ algorithm multidimensional-array dijkstra

我正在编写我的第一个游戏,我还有最后一个问题需要解决。我需要一个算法来检查我是否可以将选定的球移动到选定的位置。

看看这张照片:

规则是,如果我在白色背景上拾取蓝色球(在中间),我可以将它移动到所有绿色空间,我无法将其移动到紫色球,因为它们有点像被其他球围起来。我自然不能把它移到其他球的地方。球只能向上,向下,向左和向右移动。

现在我知道有两种已经存在的算法:A *和Dijkstra的算法可能会有所帮助,但它们看起来太复杂了我需要的东西(都使用我尚未教过的载体或东西,我'对编程很新,这是我的学期项目)。我不需要找到最短路,我只需要知道所选目的地是否被其他球围起来。

我在游戏中的电路板是9x9阵列,如果它是空的地方,则只需填充'/',如果它被拍摄,则为7个字母中的一个。

我是否可以通过简单的方式对算法进行编码?

[我去了洪水填充它工作得很好,谢谢你的帮助,如果有人有类似的问题 - 我建议使用洪水填充,它真的很简单快速] < / p>

2 个答案:

答案 0 :(得分:11)

我建议使用Flood fill算法:

  

Flood填充,也称为种子填充,是一种确定填充的算法   连接到多维数组中给定节点的区域。它是   用于填充工具的“桶”填充工具来填充连接,   具有不同颜色的类似颜色的区域,以及诸如的游戏   Go和Minesweeper确定清除哪些碎片。什么时候   应用于图像以用颜色填充特定的有界区域   也被称为边界填充。

就复杂性时间而言,该算法将等于递归的算法:O(N×M),其中N和M是输入矩阵的维度。关键的想法是,在两种算法中,每个节点最多只处理一次。

在此link中,您可以找到算法实施指南。

更具体地说,正如Martin Bonner所说,实施有一些关键概念:

  1. 将所有空单元格标记为未知(所有完整单元格都无法访问)
  2. 将源单元格添加到一组可路由的单元格
  3. 虽然该集合不为空:
    • 弹出集合中的元素;
    • 将所有相邻的未知单元格标记为“可达”并将其添加到集合
  4. 无法访问所有剩余的未知单元格。
  5. PS:您可能需要阅读Flood fill vs DFS

答案 1 :(得分:4)

您可以使用BFS(Breadth First Search)算法非常简单地执行此操作。

为此,您需要学习 Graph 数据结构。一旦你理解它,它很容易实现。

关键理念

您的单元格将充当顶点,而边缘将告诉您是否能够从一个单元格移动到另一个单元格。

使用邻接列表邻接矩阵表示实现图形后,您最好使用BFS算法来执行您尝试执行的操作