Rust跳棋实现:解析Coordinate的跳步与移动目标计算方法
解析《Programming WebAssembly with Rust》中Coordinate结构体的两个移动方法
首先看问题中的原始代码:
impl Coordinate { pub fn jump_targets_from(&self) -> impl Iterator<Item = Coordinate> { let mut jumps = Vec::new(); let Coordinate(x, y) = *self; if y >= 2 { jumps.push(Coordinate(x + 2, y - 2)); } jumps.push(Coordinate(x + 2, y + 2)); if x >= 2 && y >= 2 { jumps.push(Coordinate(x - 2, y - 2)); } if x >= 2 { jumps.push(Coordinate(x - 2, y + 2)); } jumps.into_iter() } pub fn move_targets_from(&self) -> impl Iterator<Item = Coordinate> { let mut moves = Vec::new(); let Coordinate(x, y) = *self; if x >= 1 { moves.push(Coordinate(x - 1, y + 1)); } moves.push(Coordinate(x + 1, y + 1)); if y >= 1 { moves.push(Coordinate(x + 1, y - 1)); } if x >= 1 && y >= 1 { moves.push(Coordinate(x - 1, y - 1)); } moves.into_iter() } }
这两个方法为Coordinate结构体(代表棋盘上的(x,y)坐标点,假设坐标从(0,0)开始计数)实现了两种移动逻辑:斜向跳两步的合法目标计算和斜向走一步的合法目标计算,以下是详细解析:
1. jump_targets_from:斜向跳两步的合法目标
该方法生成所有从当前坐标斜向跳2格后,坐标仍非负(未超出棋盘上/左边界)的目标点,具体逻辑:
- 先解构当前坐标为
(x, y),创建空向量存储合法目标 - 逐个判断四个斜向跳步方向的合法性:
- 右上跳2格:
Coordinate(x + 2, y - 2)→ 仅当y >= 2时合法(避免y-2变为负数,超出棋盘上边界) - 右下跳2格:
Coordinate(x + 2, y + 2)→ 直接加入(x+2不会为负,若棋盘有下边界限制,后续逻辑会过滤) - 左上跳2格:
Coordinate(x - 2, y - 2)→ 仅当x >= 2 且 y >= 2时合法(避免x/y变为负数) - 左下跳2格:
Coordinate(x - 2, y + 2)→ 仅当x >= 2时合法(避免x变为负数)
- 右上跳2格:
- 最后将向量转换为迭代器返回,方便后续遍历所有目标点
2. move_targets_from:斜向走一步的合法目标
该方法生成所有从当前坐标斜向走1格后,坐标仍非负的目标点,具体逻辑:
- 同样解构当前坐标为
(x, y),创建空向量存储目标 - 逐个判断四个斜向一步方向的合法性:
- 右上走1格:
Coordinate(x - 1, y + 1)→ 仅当x >= 1时合法(避免x-1变为负数,超出左边界) - 右下走1格:
Coordinate(x + 1, y + 1)→ 直接加入 - 左下走1格:
Coordinate(x + 1, y - 1)→ 仅当y >= 1时合法(避免y-1变为负数,超出上边界) - 左上走1格:
Coordinate(x - 1, y - 1)→ 仅当x >= 1 且 y >= 1时合法(避免x/y变为负数)
- 右上走1格:
- 最后将向量转换为迭代器返回
注意:代码仅处理了坐标非负的边界判断,未限制棋盘的右/下边界(比如x+2超过棋盘最大宽度),这类超出范围的点可能会在后续逻辑中被过滤,或者游戏本身无固定右/下边界限制。
内容的提问来源于stack exchange,提问作者Sarang Dutta
相关产品推荐
相关产品推荐

