在 2D tilemap 中生成随机路径的算法
algorithm to generate random path in 2D tilemap
我需要在 2D 瓦片地图中生成一个简单的随机路径。输入参数是步数。条件是每个方块在路径上只有两个相邻的方块,所以没有房间也没有十字路口。
我在网上寻找一些解决方案,但没有找到类似的解决方案。酒鬼算法创造房间,其他一切都是迷宫生成算法。可能我搜索的关键词不对
重要的是随机性,因为我每次都需要完全不同的路径。
编辑:添加示例图片
示例路径:
主要特点是每个图块只有 2 个邻居。
改进后的版本是使用特定的目标方块作为路径的终点以及步数的最小值和最大值,但这现在并不那么重要。
谢谢你的想法。
将其分解为子部分,您唯一需要做的随机决定是是否在路径上的给定点 left/right/up/down 走而不形成路口,这可以使用任意生成让我们说机器的时间戳,例如,检查天气最后一位数字是偶数还是奇数,然后左转为偶数,右转为奇数,向上为模 4 等,从而每次都为您提供相当随机的路径。
尝试在相对较快的情况下放慢计算速度,以跨越大量时间,引入更多随机性。
或者,在二维地图上做一个类似DFS的遍历,将每条唯一的路径存储在一个hash map或set中,并在这个map中添加一个唯一的数字作为key,这是预处理部分,现在随机选择来自一组所有可能解决方案的唯一密钥,将其从集合中删除,如果您需要另一个随机唯一路径,只需从剩余的可用路径中随机选择一个。
创建二维地图
因此创建地图大小的二维数组并通过例如 0
清除它
添加N
个随机障碍物
例如地图中的实心圆圈
使用A*求最短路径
你可以用我的...C++ A* example
如果你想要更复杂的东西,那么你可以创建随机地形并使用 A* 找到最短路径(向上会比向下花费更多...)。要创建随机地形,您可以使用:
可用于随机地图生成...
我正在为类似流氓的地牢爬虫创建一个随机地图生成器,我的入口到出口路径的方法是这样的:
1. Randomly select a tile as the dungeon entrance. Add it to the path and set it as currentTile
2. Randomly pick a neighboring tile of currentTile that's not already in the path. Add it to the path and set it as currentTile.
3. Repeat step 2 until your path reaches the desired length. If a deadlock occurs, restart from 1.
在你的情况下,你应该稍微改变第 2 步:你应该检查相邻的图块本身和它的所有邻居(当然除了 currentTile)不在路径中。这可能会导致您的算法多次陷入死锁,但对于像您图片中的路径一样小的路径,重复几次不会有问题。
我需要在 2D 瓦片地图中生成一个简单的随机路径。输入参数是步数。条件是每个方块在路径上只有两个相邻的方块,所以没有房间也没有十字路口。
我在网上寻找一些解决方案,但没有找到类似的解决方案。酒鬼算法创造房间,其他一切都是迷宫生成算法。可能我搜索的关键词不对
重要的是随机性,因为我每次都需要完全不同的路径。
编辑:添加示例图片
示例路径:
主要特点是每个图块只有 2 个邻居。
改进后的版本是使用特定的目标方块作为路径的终点以及步数的最小值和最大值,但这现在并不那么重要。
谢谢你的想法。
将其分解为子部分,您唯一需要做的随机决定是是否在路径上的给定点 left/right/up/down 走而不形成路口,这可以使用任意生成让我们说机器的时间戳,例如,检查天气最后一位数字是偶数还是奇数,然后左转为偶数,右转为奇数,向上为模 4 等,从而每次都为您提供相当随机的路径。
尝试在相对较快的情况下放慢计算速度,以跨越大量时间,引入更多随机性。
或者,在二维地图上做一个类似DFS的遍历,将每条唯一的路径存储在一个hash map或set中,并在这个map中添加一个唯一的数字作为key,这是预处理部分,现在随机选择来自一组所有可能解决方案的唯一密钥,将其从集合中删除,如果您需要另一个随机唯一路径,只需从剩余的可用路径中随机选择一个。
创建二维地图
因此创建地图大小的二维数组并通过例如
0
清除它
添加
N
个随机障碍物例如地图中的实心圆圈
使用A*求最短路径
你可以用我的...C++ A* example
如果你想要更复杂的东西,那么你可以创建随机地形并使用 A* 找到最短路径(向上会比向下花费更多...)。要创建随机地形,您可以使用:
可用于随机地图生成...
我正在为类似流氓的地牢爬虫创建一个随机地图生成器,我的入口到出口路径的方法是这样的:
1. Randomly select a tile as the dungeon entrance. Add it to the path and set it as currentTile
2. Randomly pick a neighboring tile of currentTile that's not already in the path. Add it to the path and set it as currentTile.
3. Repeat step 2 until your path reaches the desired length. If a deadlock occurs, restart from 1.
在你的情况下,你应该稍微改变第 2 步:你应该检查相邻的图块本身和它的所有邻居(当然除了 currentTile)不在路径中。这可能会导致您的算法多次陷入死锁,但对于像您图片中的路径一样小的路径,重复几次不会有问题。