生成地牢
修改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会可怜的卡在墙里。