检查移动是不是有效的简单游戏算法
Posted
技术标签:
【中文标题】检查移动是不是有效的简单游戏算法【英文标题】:Simple game algorithm checking if the move is valid检查移动是否有效的简单游戏算法 【发布时间】:2018-02-09 04:02:29 【问题描述】:我正在编写我的第一个游戏,我还有一个问题要解决。我需要一个算法来检查我是否可以将选定的球移动到选定的位置。
看这张图:
规则是,如果我捡起白色背景上的蓝色球(在最中间),我可以将它移动到所有绿色空间,但不能将它移动到紫色空间,因为它们有点像被其他球围起来。我自然不能把它移到其他球占据的地方。球只能上下左右移动。
现在我知道已经存在两种算法:A* 和 Dijkstra 的算法可能会有所帮助,但它们对于我需要的东西来说似乎太复杂了(无论是使用向量还是我还没有学过的东西,我我对编程很陌生,这是我的学期项目)。我不需要找到最短的路,我只需要知道选择的目的地是否被其他球围起来。
我在游戏中的棋盘是 9x9 数组,如果它是一个空的地方,则简单地填充“/”,或者如果它被占用,则填充 7 个字母之一。
有没有一种方法可以让我以简单的方式编写算法代码?
[我选择了洪水填充,它工作得很好,感谢您的所有帮助,如果有人遇到类似的问题 - 我建议使用洪水填充,它非常简单快捷]
【问题讨论】:
深度优先搜索或广度优先搜索都可以正常工作。 你基本上是在寻找 flood fill algorithm,谷歌一下。即使是最简单的算法实现也足以满足 9x9 网格的需求。 既然你说你没有被告知向量是什么,这是最基本的东西。如果你真的,真的很着急,跳过它,否则你真正应该做的是阅读一些基础教程。如果没有向量(或其他 STL 容器),您的字段如何存储?在原始数组中?以后很容易给你带来麻烦。 @Aziuth 方形游戏板是std::vector
会分散std::array
注意力的极少数 地方之一。对于 this 示例,我建议使用 std::array<std::array<char, 9>, 9>
。 char[9][9]
太容易混淆字符串了。
@dtech:一个带有相关图片的问题,之前对算法的研究确实在技术上是正确的,但是对于有限的输入大小来说是过度的?有很多非初学者仍在提出更糟糕的问题。
【参考方案1】:
我建议使用Flood fill算法:
洪水填充,也称为种子填充,是一种算法,用于确定 连接到多维数组中给定节点的区域。它是 用于绘制程序的“桶”填充工具来填充连接, 类似颜色的区域具有不同的颜色,以及在游戏中,例如 去和扫雷来确定哪些碎片被清除。什么时候 应用于图像以用颜色填充特定的有界区域,它 也称为边界填充。
就复杂度时间而言,此算法将等于递归算法:O(N×M)
,其中 N 和 M 是输入矩阵的维度。关键思想是,在这两种算法中,每个节点最多处理一次。
在这个link,你可以找到算法实现的指南。
更具体地说,正如 Martin Bonner 所建议的,有一些实施的关键概念:
-
将所有空单元格标记为未知(所有已满单元格都无法访问)
将源单元格添加到一组可路由单元格中
当集合不为空时:
从集合中弹出一个元素;
将所有相邻的未知单元格标记为“可达”并将它们添加到集合中
所有剩余的未知单元格都无法访问。
PS:您可能想阅读Flood fill vs DFS。
【讨论】:
@Caleth,什么“细胞集合”? 在您的伪代码“集合”中。set
、list
、vector
、array
都是“...的集合”的类模板,具有不同的细节
我不是反对者。在你添加伪代码之前我没有投票。
@Caleth:当我说“set”时,我指的是最多可以包含一个元素一次的数学对象。显而易见的实现是std::unordered_set<coordinate_pair>
。如果这是一个性能瓶颈(可能是在更大的、空的板上),人们可以看看位图的巧妙技巧和类似***.com/a/21644413/771073 之类的“pop front”。【参考方案2】:
您可以使用BFS(Breadth First Search) 算法非常简单地做到这一点。
为此,您需要研究 Graph 数据结构。一旦你理解它,它的实现非常简单。
关键思想
您的单元格将充当顶点,而边将告诉您是否能够从一个单元格移动到另一个单元格。
一旦您使用 邻接列表 或 邻接矩阵 表示来实现您的图形,您就可以使用 BFS 算法来做您想做的事情.
【讨论】:
我发现您使用code formatting
表示非代码很令人困惑
@gsamaras 我希望我没有抱怨太多,只是想提出建议。无论如何,O(NxN)
显然不是代码,但vertices
和edges
看起来像是指一些特定的类型或变量名,当我将其理解为指的是不需要特殊格式的顶点和边的抽象概念时
@gsamaras 是的,我喜欢这两个答案,我也喜欢这个问题。我觉得这很有趣,因为我从来没有机会尝试 BFS 或 Flood Fill。我很想尝试一下,您的两个答案都将是一个不错的起点。不幸的是,这不是我在工作时间可以做的事情;)
嗨 Sumeet — 在英语中,当您强调某事或定义一个新术语时,惯例是使用 bold 或 italics。 (例如:“A dog 是一种像狼一样的动物,有四条腿。”)将代码格式化用于非代码的东西是不正确的。我已经为你修复了你的帖子。
投反对票的人,请解释一下您为什么不喜欢这个答案。以上是关于检查移动是不是有效的简单游戏算法的主要内容,如果未能解决你的问题,请参考以下文章