我怎样才能生成这样的地图?

时间:2015-06-08 03:38:46

标签: c algorithm bitmap

enter image description here

我正在尝试用C制作游戏的基本街道地图。每个块在数组中用1或0表示。在图像中,1是白色,代表街道。黑色为零,代表构建块。街道到处都是一个街区,你可以从任何一条街道到达任何一条街道。

我尝试了一些快速算法,但它们没有给我像图像中的变化。我尝试的一种方法是选择随机的水平和垂直线,但后来我得到了一个无趣的格子式计划。

我尝试在整个图像上翻转随机位,但是验证是否所有街道都可以到达并且如果不是可以修复它们则很麻烦。

我的下一个最好的猜测是水平和垂直生成随机线段,而不是整行,但是我很确定仍然可能生成孤立的街道碎片。

我可以使用遗传算法来生成候选人,但如果有一个更简单的解决方案,我真的不想去那个麻烦。

我有没有想到明显的解决方案?解决方案应该能够生成给定的图像,以及其他变体。

3 个答案:

答案 0 :(得分:3)

  • 从一个包含一个矩形的队列开始,即整个地图。

  • 循环:从队列中取一个矩形。

    • 如果矩形足够小,那么(有一定概率)什么都不做,你就完成了那个矩形。
    • 否则,选择一个长边。用街道切割那边(修改数组)并将两边的矩形添加到队列中。

当您确定矩形是否足够小以及如何确定切割矩形的位置时,可以有一定的灵活性。通过不切割4x1或更小的矩形,可以避免留下1x1的正方形。你可以让你有机会保持一个3x5的矩形,并有机会你切割它。

答案 1 :(得分:2)

通过在左上角绘制建筑物来创建地图。这定义了两条街道,并以这种方式递归和构建地图的其余部分。

作为一个具体的例子,让我们看看你有13x9网格的例子。

从(1,1)开始随机选择建筑物大小。让我们说在你的例子中,我得到一个4x2的建筑物。好。所以现在我添加街道。然后我递归并为其右侧的4x6区域和下方的8x9区域创建地图。所以起初我有:

xx 111111
xx 111111
xx 111111
xx 111111

222222222
222222222
222222222
...

x”标记建筑物的位置,“”街道。 “1”是我仍然需要制作地图的一个区域。 “2”是我需要制作地图的另一个区域。

现在让我们在标有右侧1的4x6区域上工作。在该区域的(1,1)位置或绝对位置(1,4)。我随机选择1x2建筑物。所以,现在我把一条街道围绕着,我就有了:

xx xx 3333
xx    3333
xx 44 3333
xx 44 3333

2222222222
2222222222
2222222222
....

等等。请注意,2x2区域4,进一步细分将添加一条街道添加到另一条街道。如果您不想要这个,那么一旦到达2或更小的区域,就不要细分。

答案 2 :(得分:0)

例如,您可以使用DFS(http://en.wikipedia.org/wiki/Depth-first_search)检查孤立的街道和平。然后,您可以通过将两个最接近(或任何其他)点连接到每个点来连接这些碎片。