为地牢建造一个房间给了错误的尺寸/没有墙

2024-09-22 11:31:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

----------
|********|
|********|
|********|
|********|
|********|
|********|
|********|
|********|
----------

然而,相反,我得到了一个和地牢地面一样宽的房间,只考虑到高度,而侧面的墙壁永远也不会到达。所以,我得到了一个更像这样的安排:

^{pr2}$

改变地牢地板的总可用宽度会导致房间水平收缩或增长,无论我要求它有多大。无论我如何调整范围,在哪里调整它们,或者我评论或取消注释,侧墙永远不会出现。简言之,无论我做什么尝试,只有高度和顶部/底部被遵守。在

在基准.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()

在地牢.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

我已经排除了图形的问题;地牢本身肯定是出了什么问题,而不是它在屏幕上的显示方式。不过,我找不到任何理由让算法以这种方式出错。在

编辑:给出上图的代码的原始版本在构成墙的部分下面有“内部区域”部分;像我一样,把它放在上面,会导致整个房间由墙组成,但仍然太宽。就我所知,他们应该给出同等的结果,但他们没有。在


Tags: inselfnoneforreturndefcellrange
1条回答
网友
1楼 · 发布于 2024-09-22 11:31:09

你的问题(或者至少其中一个)是makeFloor的定义。试试这个:

def makeFloor(Xmax, Ymax):
    return [[Cell(solid,None) for i in range(Xmax)]
            for j in range(Ymax)]

说明:如果你做了[x]*10,那么你会得到一个包含10个元素的列表,每个元素都是x the相同的x。如果你改变一个元素,那么其他元素也会改变。类似地,如果你做[[x]]*10,那么你会得到一个包含10个子列表的列表,每个子列表都是相同的子列表,更改一个将更改所有子列表。在

相关问题 更多 >