Rust Macroquad开发贪吃蛇:update移动函数优化咨询
Rust Macroquad 贪吃蛇Update函数优化方案
原始问题分析
你在开发贪吃蛇时写的update函数用了4个match语句,确实可以通过逻辑合并和枚举扩展来简化,同时保持甚至提升代码效率。
优化后的代码
首先扩展MoveMode枚举,添加方向向量的关联方法:
#[derive(Debug, Clone, Copy)] enum MoveMode { MovingUp, MovingDown, MovingLeft, MovingRight, } impl MoveMode { // 返回对应方向的(x, y)单位向量 fn direction(&self) -> (f32, f32) { match self { MoveMode::MovingUp => (0.0, -1.0), MoveMode::MovingDown => (0.0, 1.0), MoveMode::MovingLeft => (-1.0, 0.0), MoveMode::MovingRight => (1.0, 0.0), } } } // 修正原结构体定义的格式问题 struct Player { player: Rect, move_mode: MoveMode, }
然后简化update函数:
pub fn update(&mut self, dt: f32) { // 直接从按键状态映射到新的移动模式,仅单个方向键按下时生效 let new_move_mode = match ( is_key_down(KeyCode::Up), is_key_down(KeyCode::Down), is_key_down(KeyCode::Left), is_key_down(KeyCode::Right), ) { (true, false, false, false) => Some(MoveMode::MovingUp), (false, true, false, false) => Some(MoveMode::MovingDown), (false, false, true, false) => Some(MoveMode::MovingLeft), (false, false, false, true) => Some(MoveMode::MovingRight), _ => None, // 多键/无键按下时保持当前移动模式 }; // 仅当有有效输入时更新移动模式 if let Some(mode) = new_move_mode { self.move_mode = mode; } // 利用方向向量计算移动,替代原有的match分支 let (dx, dy) = self.move_mode.direction(); self.player.x += dx * dt * PLAYER_SPEED; self.player.y += dy * dt * PLAYER_SPEED; debug!("Move Mode is {:?}", self.move_mode); }
优化点说明
- 合并冗余匹配:把原有的按键判断→中间变量→两次match更新模式的逻辑,合并成一次按键到目标模式的映射,减少不必要的变量和分支
- 枚举行为封装:给
MoveMode添加direction方法,把方向逻辑和枚举本身绑定,既让移动计算更简洁,也方便后续扩展(比如添加斜向移动只需新增枚举值和对应向量) - 逻辑分层清晰:输入处理和移动计算完全分离,代码可读性更强,也更容易维护
- 保持原有输入逻辑:保留了你原本的“仅单个方向键按下才改变方向”的规则,如果需要调整按键优先级(比如同时按上下优先响应上),只需调整match分支的顺序即可
内容的提问来源于stack exchange,提问作者Tygris
相关产品推荐
相关产品推荐

