Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Libtcod在Python中创建/导入自定义映射?_Python_Roguelike_Libtcod - Fatal编程技术网

使用Libtcod在Python中创建/导入自定义映射?

使用Libtcod在Python中创建/导入自定义映射?,python,roguelike,libtcod,Python,Roguelike,Libtcod,我一直在用Python创建一个类似Roguelike的程序,使用Libtcod 然而,我一直面临的一个主要障碍是,我完全不知道如何制作自定义映射,如中所示,我定义了单元格及其包含的元素,或者,如果可能的话,也不知道如何使用Libtcod将自定义映射导入Python 到目前为止,我使用的定义基本上是在特定的模式、房间数量、无交叉点等之后渲染地图-但我希望这样做,以便我可以导入一个已经定制的地图-或者实际上只是为一个创建了一个定义,以便我可以在给定的标准中加载它 在此问题上的任何帮助都将不胜感激,谢

我一直在用Python创建一个类似Roguelike的程序,使用Libtcod

然而,我一直面临的一个主要障碍是,我完全不知道如何制作自定义映射,如中所示,我定义了单元格及其包含的元素,或者,如果可能的话,也不知道如何使用Libtcod将自定义映射导入Python

到目前为止,我使用的定义基本上是在特定的模式、房间数量、无交叉点等之后渲染地图-但我希望这样做,以便我可以导入一个已经定制的地图-或者实际上只是为一个创建了一个定义,以便我可以在给定的标准中加载它


在此问题上的任何帮助都将不胜感激,谢谢!:

有很多有趣的方法可以将地图数据导入到程序中

通常,使用roguelike,您将生成该数据。当然,这并不是绝对必要的

一种非常基本的生成方法是试用libtcod的heightmap工具包。这是从我写的一个游戏中摘录出来的,可能会给你一个解决问题的好主意。此代码是从my 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方法接受一个布尔值来确定单元格是否可以通过。生成heightmap后,我将其规格化,使其仅包含0、1和2的值。然后我只做了一个相应的单元格,它的高度是2,是墙,1或0,是开口。这给了我一个很好的平衡

heightmap功能非常适合创建一种有机布局,具有圆形特征,而不是典型的方形房间地牢,这种地牢通常出现在盗贼身上

如果您希望生成更传统的地下城,那么libtcod附带了一个BSP工具包,它正是为这项任务而设计的。请参阅相关文档

还有一个令人难以置信的python教程,其中有一个专门的映射部分

我过去使用过其他方法,包括但不限于读取简单的.bmp图像中的每个像素并解释rgb值,每个都表示地图中给定坐标的不同之处红色可能是墙/开的,蓝色可能表示是否有屋顶,等等

不过,其基本思想是只需要一个坐标数组。它可能像一个数组或整数一样简单,其中0表示可以通过,1表示墙,或者像我的例子一样,一个对象数组,它还存储了一些对游戏有用的其他信息

你可以使用一个二维数组,这非常容易让你的头绕起来,有时,因为你会参考像map[x][y]这样的坐标,而不是map[x+y*width],而不是我在示例代码中使用的一维数组

世界就是你的牡蛎只需将数据放入一个可以读取的结构中,然后检查您感兴趣的坐标