저는 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
; 던전 자체가 틀림없이 틀린 것이지, 스크린에 어떻게 나타나고있는 것은 아닙니다. 알고리즘이 이런 식으로 잘못되어야하는 이유를 찾을 수 없습니다.
편집 : 위의 다이어그램에 표시된 코드의 원래 버전은 벽을 만든 부분 아래에 "내부 영역"부분이있었습니다. 내가 그랬듯이 그것을 맨 위에 올려 놓으면 전체 방이 벽으로 이루어져 있지만 여전히 너무 넓어집니다. 지금까지 나는 그들이 동등한 결과를 가져야한다고 말할 수있다. 그들은하지 않습니다.
방을 만드는 각 블록의 앞뒤에 self.floor를 보려고 했습니까? – Nobody
루프를 사용하여 개별 벽 세그먼트를 작성해야하는 좌표를 지정하고 다른 결과를 보려면 차례대로 함수의 각 부분을 주석 처리/주석 처리하지 않았습니다. 하나의 행으로 줄이거 나하더라도 행은 여전히 물리적 인 것처럼 넓기보다는 오히려 그 행만큼 넓습니다. –