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会可怜的卡在墙里。
效果图

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值