如何校验国际象棋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即可(横纵移动距离相等,刚好沿对角线移动)
- 骑士(Knight):走日字,满足
- 前置判断:如果当前位置和目标位置完全相同,直接返回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
相关产品推荐
相关产品推荐

