Python 为地下城创建房间会给出错误的尺寸/没有墙

Python 为地下城创建房间会给出错误的尺寸/没有墙,python,python-2.7,roguelike,Python,Python 2.7,Roguelike,我正在使用Python2.7制作一个Roguelike,目前正在尝试获取一个函数,根据给定的楼层编号x1、x2、y1和y2坐标集创建一个单独的房间。预期的行为是,我应该得到一个以墙为界的房间,否则就充满了空虚。例如,MakerRoom(0、1、1、10、10)应提供: ---------- |********| |********| |********| |********| |********| |********| |********| |********| ---------- 然而,我

我正在使用Python2.7制作一个Roguelike,目前正在尝试获取一个函数,根据给定的楼层编号x1、x2、y1和y2坐标集创建一个单独的房间。预期的行为是,我应该得到一个以墙为界的房间,否则就充满了空虚。例如,MakerRoom(0、1、1、10、10)应提供:

----------
|********|
|********|
|********|
|********|
|********|
|********|
|********|
|********|
----------
然而,我得到了一个与地牢地板一样宽的房间,只考虑高度,而侧面的墙永远不会到达。因此,我得到了一个更像这样的安排:

---------------------------
***************************
***************************
***************************
***************************
***************************
***************************
***************************
***************************
---------------------------
更改地下城地板的总可用宽度会导致房间水平收缩或增长,而不管我要求它有多大。无论我如何调整范围、在何处调整范围、注释或取消注释什么,侧墙都不会出现。简而言之,无论我做什么尝试,都只遵守高度和顶部/底部

base.py(主游戏循环):

dungeon.py(完成工作的主要部分):

我已经消除了图形作为一个问题;地牢本身肯定是出了问题,而不是它在屏幕上的显示方式。不过,我找不到任何理由证明算法在这种情况下是错误的

编辑:给出上图的代码的原始版本在构成墙的部分下面有“内部区域”部分;把它放在上面,就像我做的那样,结果整个房间都是由墙组成的,但还是太宽了。据我所知,他们应该给出相同的结果;它们没有。

您的问题(或至少其中一个)是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个子列表的列表,每个子列表都是相同的子列表——同样,更改一个子列表会更改所有子列表。

您是否尝试在创建房间的每个块之前和之后查看self.floor?我让循环给我它应该写入各个墙段的坐标,我依次对函数的每个部分进行了注释/取消注释,以查看不同的结果。即使我把它缩小到一行,那一行仍然会尽可能地宽,而不是像它设定的那样宽。这就是事实:房间按照你的定义设置得恰到好处。谢谢
# 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
def makeFloor(Xmax, Ymax):
    return [[Cell(solid,None) for i in range(Xmax)]
            for j in range(Ymax)]