2012-02-03 3 views
1

저는 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

방을 만드는 각 블록의 앞뒤에 self.floor를 보려고 했습니까? – Nobody

+0

루프를 사용하여 개별 벽 세그먼트를 작성해야하는 좌표를 지정하고 다른 결과를 보려면 차례대로 함수의 각 부분을 주석 처리/주석 처리하지 않았습니다. 하나의 행으로 줄이거 나하더라도 행은 여전히 ​​물리적 인 것처럼 넓기보다는 오히려 그 행만큼 넓습니다. –

답변

3

문제 (또는 그 중 하나 이상)가 makeFloor의 정의입니다. 대신이 시도 :

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

설명 : 당신이 할 경우 [X] * 10, 다음 x는 각각 10 개 요소를 포함하는 목록을 얻을 - 같은 X를. 하나를 변경하면 나머지는 변경됩니다. 마찬가지로 [10] [10]을 수행하면 10 개의 하위 목록을 포함하는 목록을 얻게됩니다. 각 하위 목록은 하위 목록 인 하위 목록입니다. 다시 변경하면 모두 변경됩니다.

+0

정확히 말하자면, 방은 당신의 정의와 정확히 일치해야합니다. 감사! –