CS50 Flappy Bird:PipePair与PlayState共享随机管道间隙高度方案
Flappy Bird克隆管道间隙随机化Bug修复方案
核心思路
每次生成管道对时动态生成60-120的随机间隙高度,通过构造函数传递或实例属性访问的方式让PipePair和PlayState共享该值,同时约束顶部管道的y坐标范围,避免底部管道超出屏幕。
具体实现步骤
1. 改造PipePair类,支持随机间隙
两种实现方式选其一即可:
方式一:PipePair内部生成随机间隙
PipePair = Class{} function PipePair:init(y) -- 生成60-120之间的随机间隙高度 self.gapHeight = math.random(60, 120) -- 初始化顶部管道 self.topPipe = Pipe('top', y) -- 基于间隙计算底部管道的y坐标 self.bottomPipe = Pipe('bottom', y + PIPE_HEIGHT + self.gapHeight) -- 管道对基础属性 self.x = VIRTUAL_WIDTH self.remove = false end
方式二:由PlayState生成间隙并传递给PipePair
PipePair = Class{} function PipePair:init(y, gapHeight) self.gapHeight = gapHeight self.topPipe = Pipe('top', y) self.bottomPipe = Pipe('bottom', y + PIPE_HEIGHT + gapHeight) self.x = VIRTUAL_WIDTH self.remove = false end
2. 调整PlayState的管道生成逻辑,约束y坐标范围
无论用哪种方式,都要在生成管道对时确保顶部管道的y坐标不会导致底部管道超出屏幕:
function PlayState:update(dt) self.timer = self.timer + dt if self.timer > PIPE_SPAWN_DELAY then local gapHeight = math.random(60, 120) -- 计算顶部管道的合法y范围:顶部管道最少露出10像素,底部管道最少露出10像素 local minY = -PIPE_HEIGHT + 10 local maxY = VIRTUAL_HEIGHT - PIPE_HEIGHT - gapHeight - 10 local y = math.random(minY, maxY) -- 对应方式一的实例化 local newPipePair = PipePair(y) -- 对应方式二的实例化 -- local newPipePair = PipePair(y, gapHeight) table.insert(self.pipePairs, newPipePair) self.timer = 0 end -- 遍历更新管道对,需要时直接访问pair.gapHeight获取间隙值 for k, pair in pairs(self.pipePairs) do pair:update(dt) end end
3. 验证修复效果
运行游戏后,每次生成的管道间隙会在60-120区间随机变化,且底部管道始终保持在屏幕可见范围内,不会出现超出屏幕的情况。
内容的提问来源于stack exchange,提问作者apex2022
相关产品推荐
相关产品推荐

