Python从零模仿我的世界(五)

本文介绍了在Python中构建我的世界模型类的初始化过程,包括如何添加方块。文章详细阐述了方块和区块的概念,以及如何区块化坐标。还提到了方块的可见性判断,指出并非所有方块都需要显示,因为GPU需要优化。最后,作者分享了一个关于代码可读性的趣事,强调代码的可读性很重要。
摘要由CSDN通过智能技术生成

模型类

初始化

有了方块类,我们现在终于可以添加方块了。

添加方块

现在我们来编写添加方块的代码:

class Model:
    ...
    def add_block(self, position, block, immediate=True):
        # 如果该位置已经存在了方块那么先删除原方块,用新的方块替代它
        if position in self.world:
            self.remove_block(position, immediate, real)
        # 填充 world 字典,这里会调用 Block.__call__
        self.world[position] = blocks[block](self, *position)
        # == A ==
        self.sectors.setdefault(sectorize(position), []).append(position)
        # immediate 为 True 即为立即显示这个方块
        if immediate:
            # == B ==
            if self.exposed(position):
                self.show_block(position)
            self.check_neighbours(position)

A:世界的最小单位是一个方块(Block),组织方块的单位是一个区块(Sector)。区块的大小定义在Settings类中(为16),sectorize 函数就是把一个坐标区块化,例如(0, 0, 0)位于区块(0, 0, 0)(0, 0, 15)也位于区块(0, 0, 0),但是(0, 0, 16)就位于区块(0, 0, 1)。注意,一个区块的y坐标永远为0,因为区块是平铺在世界里的。

B:世界中会存在许多的方块,但是不是每个方块都是看得见的。换句话说,并不是每一个方块都是要显示的。GPU:我压力山大…… 有的方块的上下前后左右都被别的(不透明的)方块所包围着,这样的方块就是不用显示的。exposed函数会检查一个方块是否有露出的一面。check_neighbours函数我们后面再说。

接下来编写exposed函数:

class Model:
    ...
    # 这个是 exposed 函数的容易理解的版本
    def exposed(self, position):
        x, y, z = position
        # 检查上下前后左右6个方向的方块
        for dx, dy, dz in Settings.faces:
            # 只要有一个方向没有方块,就要显示了
            if (x + dx, y + dy, z + dz) not in self.world:
                return True
        # 所有面都被覆盖着
        return False

但是当我把这段代码写到 Microsoft Visual Studio 里的时候,它擅自帮我给改成了这个样子:

class Model:
    ...
    # 这个是 exposed 函数的难懂的版本
    def exposed(self, position):
        x, y, z = position
        return any(
            (x + dx, y + dy, z + dz) not in self.world
            for dx, dy, dz in Settings.faces
        )

如果真的照着第2种办法写的话,我都没有办法讲了(笑),我还是推荐大家写第1种。引用import this中的话:

Readability counts.
可读性很重要。

那么我们这篇文章就讲完啦,如果有不懂欢迎评论区讨论哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值