生成地牢
修改game_map.py中的代碼:
class GameMap:
...
def initialize_tiles(self):
# 將這裏的False改爲True
tiles = [[Tile(True) for y in range(self.height)] for x in range(self.width)]
# 刪掉之前用於測試的“小牆”
return tiles
...
爲什麼要把False改爲True呢?在此之前我們默認每個區塊都是可行走的,以便我們可以輕鬆移動進行測試,因此我們傳遞False給Tile類。然而我們的地牢生成的工作方式正好相反:我們從一個完全是圍牆的地圖開始,然後開始“挖掘”部分可以行走的區塊。因此我們默認初始化所有區塊都是“圍牆”。
爲了方便生成地牢,創建一個新文件,命名爲rectangle.py並寫下以下代碼:
class Rect:
def __init__(self, x, y, w, h):
self.x1 = x
self.y1 = y
self.x2 = x + w
self.y2 = y + h
現在來繼續修改game_map.py中的代碼:
class GameMap:
...
def initialize_tiles(self):
tiles = [[Tile(True) for y in range(self.height)] for x in range(self.width)]
return tiles
def make_map(self):
# 0.創建兩個房間和一個通道用於測試
room1 = Rect(20, 15, 10, 15)
room2 = Rect(35, 15, 10, 15)
self.create_room(room1)
self.create_room(room2)
self.create_h_tunnel(25, 40, 23)
# 1.創建用於連接房間的通道,橫的和豎的
def create_h_tunnel(self, x1, x2, y):
for x in range(min(x1, x2), max(x1, x2) + 1):
self.tiles[x][y].blocked = False
self.tiles[x][y].block_sight = False
def create_v_tunnel(self, y1, y2, x):
for y in range(min(y1, y2), max(y1, y2) + 1):
self.tiles[x][y].blocked = False
self.tiles[x][y].block_sight = False
def create_room(self, room):
# 2.在全是‘牆’的地圖上‘挖’出房間和通道來
for x in range(room.x1 + 1, room.x2):
for y in range(room.y1 + 1, room.y2):
self.tiles[x][y].blocked = False
self.tiles[x][y].block_sight = False
...
注意不要忘記import Rect類。
最後修改engine.py調用make_map() 函數。
...
game_map = GameMap(map_width, map_height)
game_map.make_map()
...
現在運行程序我們將看到兩個房間和一個通道,之前生成的NPC會可憐的卡在牆裏。