随机世界一代街道

时间:2013-10-02 15:42:39

标签: algorithm random language-agnostic terrain

我正在尝试为游戏随机生成地形,这样位置x, y的对象的类型编号为f(x, y)(所以我不必存储所有值的值对象。我试图创造一个像城市一样的环境,街道和街区之间有街区。

例如:

# # # # #   # # #   # # # # 
# # # # #   # # #   # # # # 
# # # # #   # # #   # # # # 
# # # # #   # # #   # # # #
# # # # #
# # # # #   # # # # #   # # 
            # # # # #   # # 
# # # # #   # # # # #   # #  
# # # # #   # # # # #   # # 

#   # # # # # # #   # # # # 
#   # # # # # # #   # # # # 
#   # # # # # # #   # # # # 
#   # # # # # # #   # # # #

我可以使用f(x, y): (x*y) mod n以常规模式生成类似的内容,其中n是常量,如果f(x, y) == 0,结果切片只为空。

例如,n为5:

# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 

# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 

# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 
# # # #   # # # #   # # # # 
# # # #   # # # #   # # # #

如何更改算法(或获取新算法)以获得更像第一个示例的结果?

或者我是否完全以错误的方式解决这个问题?

2 个答案:

答案 0 :(得分:0)

对于第一个问题:这取决于你想要它的“自然”程度。 您可以轻松使用随机生成器生成特定长度的道路;或者更好,走一条路,然后从两端开始一条新的道路等。

如果是更自然的方式,请考虑一个真实的城镇/城市的样子:较长的道路,内部较小的道路。这当然必须反映在算法中。

我不明白你的第二个问题,......只是用不同类型的符号(表示不同的建筑物)来改变每个#?在这种情况下,请考虑不同大小的建筑物。您最好首先进行街道布局,然后是剩余部分(甚至可以沿着街道左/右侧),填充建筑物。

编辑:

您也可以使用上面的“ASCII”映射来使用指向对象的指针。 例如。在上面的14x14地图中,而不是使用一个ASCII字符,使用对象指针。哪个可以指向: - 道路 - 建筑(从多种建筑类型继承)

您可以将多个方块指向同一个对象(表示较大的建筑物)或同一条街道。 好处: - 您可以使用所有类型的房产(例如建筑物的类型,建筑物的功能,年龄,每栋建筑的统计数据) - 对于道路:名称,与其连接的其他道路的指针(用于导航)。

答案 1 :(得分:0)

我发现了一个能够产生或多或少产生我想要的功能,但它肯定可以改进。

伪代码:

function f(x, y):
if x mod size_of_zones == 0 or y mod size_of_zones == 0:
    return 0
elif x % (a number between the maximum and minimum block sizes, randomly picked but the same for each block) == 0:
    return 0
elif y % (a number between the maximum and minimum block sizes, randomly picked but the same for each block) == 0:
    return 0
else:
    return 1

a number between the maximum and minimum block sizes, randomly picked but the same for each block的代码是:

shuffled_list_of_integers_between_min_and_max_block_sizes[(y floordiv zone_size) mod maximum_block_size]

代表x

shuffled_list_of_integers_between_min_and_max_block_sizes[(x floordiv zone_size) mod maximum_block_size]

代表y