Python 现代开发学习笔记

(十五)按累计时间生成障碍

1. 为新障碍选择位置和速度

继续把 spawn 写进 World:

# 续写同一文件:dodge_project/src/dodgegame/models.py
    # 按当前分数计算下落速度,为新障碍分配独立编号,避免重复计分。
    def spawn(self):
        width = self.rng.randint(36, 72)
        height = self.rng.randint(28, 48)
        x = self.rng.uniform(LEFT, RIGHT - width)
        speed = 180 + min(self.score, 30) * 4 + self.rng.uniform(0, 60)
        self.obstacles.append(
            Obstacle(self.next_uid, x, TOP - height, width, height, speed)
        )
        self.next_uid += 1

宽度在 36 至 72、高度在 28 至 48 中选择整数;x 的取值让整个障碍位于游戏区域横向范围中。初始 y 为 TOP−height,先让障碍下边缘到达区域上边,随后逐步落入可见画面。

速度从每秒 180 像素加上随机变化和随分数增加的部分。min(score, 30) 让这一项在加到 120 后保持不再增加。uid 每次递增,使两块同样大小、同样位置的障碍也仍然是两个独立对象。

2. 一次生成后保留剩余时间

假设把累计器单独拿出来,每次加 0.4 秒,生成间隔为 0.75 秒:第一次到 0.4,不生成;第二次到 0.8,生成一次并减去 0.75,留下 0.05;之后继续在这个余量上累积。

直接归零会丢掉每次超过间隔的部分,长期看生成节奏会越来越慢。完整游戏每个固定小步增加经过秒数,用 while 逐次扣除已经消费的间隔。

生成累计器从0.4到0.8,消费0.75后保留0.05,后续继续累积而不丢失余量

笔记正文与全部题解 · Ctrl / ⌘ K