You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 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变为负数)
  • 最后将向量转换为迭代器返回

注意:代码仅处理了坐标非负的边界判断,未限制棋盘的右/下边界(比如x+2超过棋盘最大宽度),这类超出范围的点可能会在后续逻辑中被过滤,或者游戏本身无固定右/下边界限制。

内容的提问来源于stack exchange,提问作者Sarang Dutta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:05:15