有很多有趣的方法可以将地图数据导入程序。
通常,使用 roguelike,您将生成该数据。当然,这并不是绝对必要的。
一个非常基本的生成方法是尝试 libtcod 的高度图工具包。这是从我写的一个游戏中提取的,可能会给你一个很好的想法来解决这个问题。此代码是从我的 Map 类中提取的:
import random
import libtcodpy as libtcod
class Map
def __init__(self,w,h) :
self.width = w
self.height = h
self._hm = libtcod.heightmap_new(w,h)
self._cells = []
self.initMap()
def initMap(self) :
print "Initing map"
for y in range(self.height) :
for x in range(self.width) :
c = cell.Cell(x,y)
self._cells.append(c)
self.resetMap()
return
def resetMap(self):
print "Resetting map"
for y in range(self.height) :
for x in range(self.width) :
self._cells[x + y * self.width].reset()
## Heightmap generation
self.randomizeHeightmap()
for y in range(self.height) :
for x in range(self.width) :
alt = libtcod.heightmap_get_value(self._hm, x, y)
self._cells[x + y * self.width].dig(alt > 1)
def randomizeHeightmap(self) :
print "Setting up heightmap"
hills = 1000
hillSize = 7
halfX = self.width / 2
halfY = self.height / 2
libtcod.heightmap_clear(self._hm)
for i in range(hills) :
size = random.randint(0,hillSize)
hillX1 = random.randint(0,halfX - hillSize / 2)
hillY1 = random.randint(0,self.height)
hillX2 = random.randint(halfX + hillSize / 2, self.width)
hillY2 = random.randint(0,self.height)
libtcod.heightmap_add_hill(self._hm,hillX1, hillY1, size, size)
libtcod.heightmap_add_hill(self._hm,hillX2, hillY2, size, size)
libtcod.heightmap_normalize(self._hm, 0.0, 2.0)
[...]
注意我在这里没有使用 libtcod 的地图功能。你当然可以,这也可以让你使用内置的视野工具包(这太棒了!)。
Cell 类的 dig 方法接受一个布尔值来确定单元格是否可以通过。生成高度图后,我对其进行规范化,使其仅包含 0、1 和 2 的值。然后,我只需将任何以“高度”为 2 的墙和 1 或 0 为开口的相应单元格制作。这给了我一个很好的平衡。
高度图功能非常适合创建具有圆形特征的有机布局,而不是roguelikes中常见的典型方形地牢。
如果您希望生成更传统的地下城,libtcod 中包含一个 BSP 工具包,该工具包专为该任务而设计。请参阅此处的文档。
还有一个令人难以置信的 python 教程,这里有一个专门的地图部分。
我过去使用过其他方法,包括但不限于读取简单 .bmp 图像中的每个像素并解释 rgb 值,每个值都表示地图中给定坐标的不同之处(红色可能是墙壁/开放,蓝色可能表示存在/不存在屋顶等)。
然而,基本的想法是只有一个坐标数组。它可能像数组或整数一样简单,其中 0 表示可通过,1 表示墙,或者,在我的例子中,也可以存储一些对您的游戏有用的其他信息的对象数组。
您可以使用二维数组(有时这更容易让您的头绕起来,因为您会引用坐标map[x][y]
而不是map[x + y*width]
)而不是我在示例中使用的一维数组代码。
世界是你的牡蛎!:) 只需将该数据放入您可以读取的结构中,然后检查您感兴趣的坐标。