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

如何校验国际象棋Knight与Bishop的走法是否合法并实现Python函数

国际象棋棋子移动合法性校验实现方案

实现思路

  • 第一步:位置坐标转换,将a1~h8格式的棋盘位置转换为可计算的数值坐标
    • 列坐标:取位置第一个字符,用ASCII码差值转成0~7的整数(a对应0,b对应1...h对应7)
    • 行坐标:取位置第二个字符转成整数后减1,转成0~7的整数(1对应0,2对应1...8对应7)
  • 第二步:计算当前位置到目标位置的横纵坐标差的绝对值dx、dy
  • 第三步:根据棋子类型判断移动是否合法
    • 骑士(Knight):走日字,满足dx * dy == 2即可(一个方向差1,另一个方向差2,乘积固定为2)
    • 主教(Bishop):走斜线,满足dx == dy即可(横纵移动距离相等,刚好沿对角线移动)
  • 前置判断:如果当前位置和目标位置完全相同,直接返回False(棋子不能原地不动)

完整实现代码

def valid_move_or_not(piece, currentpos, nextpos):
    # 原地移动直接判定为不合法
    if currentpos == nextpos:
        return False
    # 把棋盘位置字符串转换为数值坐标
    curr_col = ord(currentpos[0]) - ord('a')
    curr_row = int(currentpos[1]) - 1
    next_col = ord(nextpos[0]) - ord('a')
    next_row = int(nextpos[1]) - 1
    # 计算横纵方向的位移差绝对值
    dx = abs(curr_col - next_col)
    dy = abs(curr_row - next_row)
    # 按棋子类型校验移动规则
    if piece == "Knight":
        return dx * dy == 2
    elif piece == "Bishop":
        return dx == dy
    # 异常类型容错,题目限定仅传入两种棋子,默认返回False
    return False

if __name__=='__main__':
    # 测试用例
    print(valid_move_or_not("Knight", "a1", "a2"))  # 输出False,骑士无法走单格竖线
    print(valid_move_or_not("Knight", "a1", "b3"))  # 输出True,骑士走日字符合规则
    print(valid_move_or_not("Bishop", "a1", "c3"))  # 输出True,主教沿对角线移动合法
    print(valid_move_or_not("Bishop", "a1", "a2"))  # 输出False,主教无法走竖线

补充说明

题目已经限定currentpos和nextpos都是a1`h8`范围内的合法位置,因此代码不需要额外校验入参位置的合法性。坐标转换使用07范围而不是1~8,是因为仅需要计算位移差,两种范围的计算结果完全等价,不需要额外调整逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:36:03