1

我正在尝试为游戏随机生成地形,以使位置x, y上的对象是数字类型f(x, y)(因此我不必存储所有对象的值。我正在尝试生成像城市这样的环境,它们之间有街道和街区。

例如:

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

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

我可以在常规模式中生成类似这样的东西,使用f(x, y): (x*y) mod n, wheren是一个常数,并且结果图块只有在 时才为空f(x, y) == 0

例如,使用nas 5:

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

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

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

我怎样才能改变我的算法(或得到一个新的)以获得更像第一个例子的结果?

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

4

2 回答 2

0

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

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

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

编辑:

您也可以使用指向对象的指针来代替上面的“ASCII”映射。例如,在上面的 14x14 映射中,不使用一个 ASCII 字符,而是使用对象指针。它可以指向任何东西: - 道路 - 建筑物(继承自多种建筑类型)

您可以让多个正方形指向同一个对象(表示更大的建筑物)或同一条街道。优点: - 您可以使用所有类型的属性(如建筑类型、建筑功能、年龄、每栋建筑的统计数据) - 对于道路:名称、指向与其相连的其他道路的指针(用于导航目的)。

于 2013-10-02T15:53:38.227 回答
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.

于 2013-10-06T18:56:16.307 回答