Python 算法帮助:构建游戏板,但需要知道方块何时被锁定

Python 算法帮助:构建游戏板,但需要知道方块何时被锁定,python,algorithm,Python,Algorithm,我已经建立了一个游戏板,其中包括一个网格,然后网格被随机分配,“墙”到一个单元。一旦细胞建成,我如何检查某个细胞是否被“锁定”,这样我就不会在那里放置玩家 我考虑过这一点,第一次之前我提出了检查四面墙的方法,但是很明显,一个单元可以被开放的单元包围,然后被墙包围 另一个是“逃逸到外面”算法,它基本上是试图找到一条通向外墙的路径,这意味着它没有被锁定,但如果该块位于外墙上并被块包围,它就会被锁定 这通常是如何处理的?如果这对任何代码示例都很重要,我将使用python 谢谢 您基本上需要一个泛洪填充

我已经建立了一个游戏板,其中包括一个网格,然后网格被随机分配,“墙”到一个单元。一旦细胞建成,我如何检查某个细胞是否被“锁定”,这样我就不会在那里放置玩家

我考虑过这一点,第一次之前我提出了检查四面墙的方法,但是很明显,一个单元可以被开放的单元包围,然后被墙包围

另一个是“逃逸到外面”算法,它基本上是试图找到一条通向外墙的路径,这意味着它没有被锁定,但如果该块位于外墙上并被块包围,它就会被锁定

这通常是如何处理的?如果这对任何代码示例都很重要,我将使用python


谢谢

您基本上需要一个泛洪填充算法。

编辑
我想我误解了你对“锁定”和“逃跑”的定义。

如果你有有限的游戏板,那里的每个单元格都被锁定在某个空间。如果我没弄错的话,你只是希望空间足够大。嗯,你可以很容易地用洪水填充算法计算它的面积。

这实际上取决于你游戏板的大小。如果我们说的是小电路板,可以给出每个单元之间的距离。如果您不想将播放器放得离其他播放器或其他功能太近,这可能会有双重用途

第二种选择是设计一个原则上不能创建锁定房间的墙生成器。在没有封闭房间的情况下生成随机(地牢大小)地图


最后,如果你必须在一张巨大的地图上找到一个合适的大空间,使用细节层次的方法可以帮助你。查找分布在地图上的一组稀疏点的互连图(这可能是地图生成器的直接结果)。这应该足以安置一名球员。但是,如果您需要有关某个特定点的更多详细信息,找到这些点之一的路径可以告诉您房间是否被锁定。这可能在极度密集的迷宫中不起作用。

我不确定你的游戏板到底是什么样子,但如果你有这样的东西:

+----------------------+
|      +-----+         |
|      | c   |         |
|      |     |         |
|      +-----+         |
|                      |
|                      |
|                      |
+----------------------+
你要避免把角色放在
c
上,因为它是“被墙围起来的”,即使它不是完全被墙围起来的,你也可以很容易地实现-only,而不是试图走出你正在检查的迷宫,看看你是否回到了同一个坐标

也许就是你要找的。在那篇文章中,我回答了如何计算网格上可以放置点的不同点区域的数量。你的问题是类似的,除了没有“点”,你有墙。这篇文章中给出的算法将为您提供网格G的一个版本,其中

G[x1][y1] == G[x2][y2]
仅当玩家可以从(x1,y1)到达(x2,y2)时,也就是说,如果从第一点到第二点有一条没有围墙的清晰路径


这就是你要找的吗?您想了解更多详细信息,还是想让我根据您的具体问题调整代码?

当我进一步思考这一点时,我应该做的是在每个打开的单元上使用泛光填充(为了提高效率,如果单元已经处于泛光填充中,请跳过它),并且最大数量的泛光填充应该保持打开,所有其他单元都应该保持打开填充。如果您只想了解单个区域的范围,洪水填充解决方案会很好。如果你想发现所有不同的区域,有一个经过调整的洪水填充版本更有效(我在回答中已经描述过)。@NoahClark你完全正确,如果你想计算地图上所有连接的区域,通常就是这样做的。@Jérémie它不可能“更有效”,至少在时间方面是这样的。洪水填充(诺亚已经描述了如何改变它来考虑所有区域)具有O(m)复杂性,其中m是细胞的数量。显然,不能做得更快,因为你必须考虑每一个细胞至少一次。@尼基塔:洪水填充是一个模糊的想法,因为具体的“泛洪”算法从来没有指定;但除此之外,我所指的“更高效”是,使用标志来确定某个单元是否已被访问比知道您只会访问它一次的效率要低——更不用说,泛洪填充算法必须在每个已访问单元的相邻单元上进行多次测试,以确定它是否可以继续。本质上,两个解当然都是O(m),但你所启发的解有一个更大的常数,大约是8或者类似的。