我正在使用Python 2.7 libtcod创建一个Roguelike,并且目前正在尝试使用基于给定楼层数x1,x2,y1和y2坐标集创建单个房间的功能。预期的行为是,我应该得到一个有墙壁的房间,否则充满了空虚。例如,makeRoom(0,1,1,10,10)应该给出:
----------
|********|
|********|
|********|
|********|
|********|
|********|
|********|
|********|
----------
然而,相反,我得到的房间和地牢一样宽,仅尊重高度,而侧面的墙壁永远不会到达。所以相反,我得到一个更像这样的安排:
---------------------------
***************************
***************************
***************************
***************************
***************************
***************************
***************************
***************************
---------------------------
改变地牢地板的总可用宽度会导致房间缩小或水平增长,无论我要求它具有多大的尺寸。无论我如何调整范围,我调整它们,或者我评论或取消注释,侧壁都不会出现。简而言之,无论我尝试什么,都只能遵守高度和顶部/底部。
base.py(主游戏循环):
import sys
import libtcodpy as libtcod
import entity
import dungeon
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 50
LIMIT_FPS = 20
libtcod.console_set_custom_font('../dejavu10x10_gs_tc.png', libtcod.FONT_TYPE_GRAYSCALE | libtcod.FONT_LAYOUT_TCOD)
libtcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'MadNet Zero', False)
libtcod.console_set_foreground_color(0, libtcod.white)
# The buggy functions
saturnSeven = dungeon.Dungeon(5)
saturnSeven.makeRoom(0, 1, 1, 10, 10)
player = entity.Player(25,25,3,4,0)
libtcod.console_print_left(0, player.X, player.Y, libtcod.BKGND_NONE, '@')
libtcod.console_flush()
while not libtcod.console_is_window_closed():
libtcod.console_set_foreground_color(0, libtcod.white)
#clear the player's old position
libtcod.console_print_left(0, player.X, player.Y, libtcod.BKGND_NONE, ' ')
#print terrain
for y in range(len(saturnSeven.floor[player.Z][0])):
for x in range(len(saturnSeven.floor[player.Z])):
symbol = saturnSeven.getTerrainSymbol(x,y,player.Z)
libtcod.console_print_left(0, x, y, libtcod.BKGND_NONE, symbol)
libtcod.console_print_left(0, player.X, player.Y, libtcod.BKGND_NONE, player.char)
libtcod.console_flush()
dungeon.py(做的工作):
# Define terrain types as a pseudo-enum
wall, empty, solid = range(3)
class Cell(object):
def __init__(self, terrain, items):
self.terrain = terrain
self.items = items
def isPassable(self):
if self.terrain != wall:
return True
else:
return False
class Dungeon(object):
def __init__(self, numfloors):
self.MAXFLOORS = numfloors
self.floor = [None]*numfloors
for i in range(numfloors):
self.floor[i] = makeFloor(20,20)
def makeRoom(self, floorNum, Xmin, Ymin, Xmax, Ymax):
#inner area
for x in range(Xmin+1, Xmax):
for y in range(Ymin+1, Ymax):
self.floor[floorNum][x][y] = Cell(empty, None)
#top/bottom wall
for x in range(Xmin,Xmax+1):
self.floor[floorNum][x][Ymin] = Cell(wall, None)
self.floor[floorNum][x][Ymax] = Cell(wall, None)
#left/right wall
for y in range(Ymin, Ymax+1):
self.floor[floorNum][Xmin][y] = Cell(wall, None)
self.floor[floorNum][Xmax][y] = Cell(wall, None)
def getTerrainSymbol(self, X, Y, Z):
if self.floor[Z][X][Y] == None:
return ' '
if self.floor[Z][X][Y].terrain == wall:
return '#'
if self.floor[Z][X][Y].terrain == solid:
return ' '
if self.floor[Z][X][Y].terrain == empty:
return '.'
def makeFloor(Xmax, Ymax):
return [[Cell(solid, None)]*Xmax]*Ymax
我已将图形消除为一个问题;地牢本身绝对是错的,而不是它在屏幕上的显示方式。但是,我无法找到任何理由以这种方式算法错误。
编辑:给出上图的代码的原始版本在构成墙壁的部分下方具有“内部区域”部分;把它放在上面,就像我一样,导致整个房间由墙壁组成,但仍然太宽。据我所知,他们应该给出相同的结果;他们没有。
答案 0 :(得分:3)
您的问题(或至少其中一个)是makeFloor的定义。试试这个:
def makeFloor(Xmax, Ymax):
return [[Cell(solid,None) for i in range(Xmax)]
for j in range(Ymax)]
说明:如果你执行[x] * 10,那么你得到一个包含10个元素的列表,每个元素都是x - 相同的 x。如果你换一个,那么其他人也会改变。类似地,如果你执行[[x]] * 10,那么你会得到一个包含10个子列表的列表,每个子列表都是相同的子列表 - 再次,更改一个将全部更改它们。