python3+libtcod學習(四)生成地牢

上一篇 python3+libtcod學習(三)繪製地圖

生成地牢

修改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會可憐的卡在牆裏。
效果圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章