Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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
python和libtcod:使用柏林噪波生成地形_Python_Libtcod - Fatal编程技术网

python和libtcod:使用柏林噪波生成地形

python和libtcod:使用柏林噪波生成地形,python,libtcod,Python,Libtcod,我发现了一个关于世界一代的好帖子,可以找到 它很好地描述了需要做的事情,但是我很难弄清楚如何在python中完成它。我相信它是在as3中完成的,但我不确定。不管怎样,我还发现了柏林噪声的libtcod函数: noise2d=libtcod.noise_new(2) value = libtcod.noise_turbulence_perlin(noise2d,[0.5,0.7],32.0) 我真的不知道如何实现这一点,然后根据高度分配字符 如果有人能帮我将文章中的步骤翻译成python,我将不

我发现了一个关于世界一代的好帖子,可以找到

它很好地描述了需要做的事情,但是我很难弄清楚如何在python中完成它。我相信它是在as3中完成的,但我不确定。不管怎样,我还发现了柏林噪声的libtcod函数:

noise2d=libtcod.noise_new(2)
value = libtcod.noise_turbulence_perlin(noise2d,[0.5,0.7],32.0)
我真的不知道如何实现这一点,然后根据高度分配字符


如果有人能帮我将文章中的步骤翻译成python,我将不胜感激。谢谢

这是我几年前写的一个类,它为我的roguelike原型创建了一个世界地图。有关部分载于附件

它将噪波应用于高度贴图,对其进行规格化,并基于高度贴图的值创建平铺

我正在使用颜色贴图创建从一种瓷砖到另一种瓷砖的平滑过渡

from constants.constant import *
from world import World
from worldtile import WorldTile

class WorldGenerator(object):
  """Randomly generates a new world with terrain and objects"""

  def regular(self):
    """Randomly generate a new world with some water, swamps, hills, some objects etc"""

    idx = [ 0 , 15, 75, 90, 101 ] # indexes of the keys 
    col = [ T.Color(0,100,100),
            T.Color(0,75,0), 
            T.Color(50,150,0), 
            T.Color(150,120,80), 
            T.Color(180,180,180)]

    map=T.color_gen_map(col,idx)

    tiles = zip(idx, [[SWAMP, PLAINS],
                      [PLAINS, FOREST], 
                      [HILLS, FOREST],
                      [HILLS, HILLS, MOUNTAINS],
                      [HILLS, MOUNTAINS,MOUNTAINS]])

    world = self.__generate(map, tiles)
    return world

  def __generate(self, colormap, mtiles, noise_zoom=1, noise_octaves=10):
    hm = T.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT)
    hm1 = T.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT)
    hm2 = T.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT)

    noise = T.noise_new(2)
    T.heightmap_add_fbm(hm1, noise, noise_zoom, noise_zoom, 0.0, 0.0, noise_octaves, 0.0, 1.0)
    T.heightmap_add_fbm(hm2, noise, noise_zoom*2, noise_zoom*2, 0.0, 0.0, noise_octaves/2, 0.0, 1.0)

    T.heightmap_multiply_hm(hm1, hm2, hm)
    T.heightmap_normalize(hm, mi=0.0, ma=1)

    tiles = {}

    # 0...100 -> value from noised heightmap
    for x in xrange(0, 101):
      lower = [c for c in mtiles if c[0] <= x][-1] # tile is between lower and upper color
      upper = [c for c in mtiles if c[0] > x][0]

      # calculating percentage
      lower_c = x - lower[0]
      upper_c = upper[0] - x
      count = lower_c + upper_c

      tiles[x] = colormap[x], lower[1], int(upper_c * 1.0 / count * 100), upper[1] 

    # generate world grid
    grid = []
    for x in xrange(WORLD_WIDTH):
      grid.append([])
      for y in xrange(WORLD_HEIGHT):
        hm_v = T.heightmap_get_value(hm, x, y)
        grid[x].append(WorldTile(*tiles[int(hm_v * 100)]))

    T.heightmap_delete(hm)
    T.heightmap_delete(hm1)
    T.heightmap_delete(hm2)

    objects = []
    while len(objects) < 5:
      for x in xrange(WORLD_WIDTH):
        for y in xrange(WORLD_HEIGHT):
          r = random.randrange(0, 10000)
          pos = [wo for wo in WORLDOBJECTS if wo.chance >= r and grid[x][y].tile in wo.tiles]
          if pos:
            o = random.choice(pos).create(x, y)
            objects.append(o)

    return World(grid, objects)
from constants.constant import*
从世界进口世界
从worldtile导入worldtile
类WorldGenerator(对象):
“”“随机生成具有地形和对象的新世界”“”
def常规(自我):
“”“随机生成一个包含一些水、沼泽、山丘、一些对象等的新世界”“”
idx=[0,15,75,90,101]#键的索引
col=[T.Color(0100),
T.颜色(0,75,0),
T.Color(50150,0),
T.Color(150120,80),
T.Color(180180)]
map=T.color\u gen\u map(col,idx)
tiles=zip(idx,[[沼泽,平原],
[平原,森林],
[山林],
[山,山,山],
[山,山,山])
世界=自我。\u生成(地图、分幅)
回归世界
定义生成(自、彩色贴图、mtiles、噪波缩放=1、噪波倍频程=10):
hm=T.高度地图(世界宽度、世界高度)
hm1=T.heightmap\u new(世界宽度、世界高度)
hm2=T.heightmap\u new(世界宽度、世界高度)
噪音=T.噪音\新(2)
T.heightmap_添加_fbm(hm1,噪音,噪音缩放,噪音缩放,0.0,0.0,噪音八度,0.0,1.0)
T.heightmap_添加_fbm(hm2,噪音,噪音缩放*2,噪音缩放*2,0.0,0.0,噪音八度/2,0.0,1.0)
T.heightmap_multiply_hm(hm1,hm2,hm)
T.heightmap_归一化(hm,mi=0.0,ma=1)
tiles={}
#0…100->有噪高度贴图中的值
对于x范围内的x(0,101):
lower=[c表示多文件中的c,如果c[0]x][0]
#计算百分比
下_c=x-下[0]
上_c=上[0]-x
计数=下限值+上限值
tiles[x]=colormap[x],下[1],int(上[u c*1.0/计数*100),上[1]
#生成世界网格
网格=[]
对于x范围内的x(世界宽度):
grid.append([])
对于X范围内的y(世界高度):
hm_v=T.heightmap_获取值(hm,x,y)
网格[x].追加(WorldTile(*tiles[int(hm_v*100)])
T.heightmap_删除(hm)
T.heightmap_删除(hm1)
T.heightmap_删除(hm2)
对象=[]
而len(对象)<5:
对于x范围内的x(世界宽度):
对于X范围内的y(世界高度):
r=random.randrange(0,10000)
pos=[如果wo.chance>=r和网格[x][y,则WORLDOBJECTS中wo的wo.平铺]
如果pos:
o=随机选择(位置)。创建(x,y)
objects.append(o)
返回世界(网格、对象)
示例世界地图如下所示:


请注意,此游戏使用libtcod1.5.1b1,一些函数名在较新版本中有所更改。

几年前,a编写了一个类似流氓的原型,使用不同的地下城/世界生成器,使用litcod/noise。你可以找到它(注意它使用的是旧的litcod版本),尤其是。谢谢Dominic,这真是太棒了!告诉我,如果我做对了:你创建一个高度贴图,给它添加噪音,然后根据每个位置的高度分配瓷砖?这看起来真的很好。然而,我查看了它,我不确定如何在我当前的设计中实现它。我正在关注,也许我会在不久的将来扩展这个教程。好的,那很好。再次感谢你迄今为止的帮助