Python开发国际象棋游戏如何减少代码中冗余的if判断语句?
国际象棋合法走法代码重构方案
核心思路
把重复的边界校验、落点校验逻辑抽离为通用工具方法,再用方向向量替代硬编码的单方向判断,绝大多数通用走法逻辑可以抽到棋子父类复用,仅特殊棋子的特殊规则单独处理即可。
1. 抽离通用复用逻辑
你现有代码重复做了两类判断:目标坐标是否在棋盘范围内、目标位置是否可以落脚(空位/敌方棋子),直接把这两个逻辑抽为通用方法,所有棋子都能复用:
# 通用棋盘边界校验 def is_on_board(row, col): return 0 <= row < 8 and 0 <= col < 8 # 通用落点合法性校验 def is_valid_target(current_piece, target_piece): return target_piece == 0 or target_piece.color != current_piece.color
2. 用方向向量替代硬编码方向
不同棋子的移动方向、最大移动步数都是固定属性,可以直接在子类里定义,不需要逐个方向写判断:
以你贴出的国王走法为例,国王的移动规则是8个方向各走1步,直接定义方向列表即可:
class King(Piece): # 格式为(行偏移量, 列偏移量) move_directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)] max_move_step = 1
其他棋子也可以用同样的方式定义属性:
- 车:
move_directions = [(-1,0), (1,0), (0,-1), (0,1)],max_move_step =7 - 象:
move_directions = [(-1,-1), (-1,1), (1,-1), (1,1)],max_move_step=7 - 后:合并车和象的方向,
max_move_step=7 - 马:直接定义8个日字偏移量,
max_move_step=1
3. 父类通用合法走法实现
把走法生成逻辑抽到父类Piece中,所有子类只要定义自己的方向和步数属性就可以直接复用:
class Piece: def valid_moves(self, board): current_row = self.row current_col = self.col moves = [] # 遍历所有允许的移动方向 for di, dj in self.move_directions: # 按最大步数逐步遍历当前方向的所有可能落点 for step in range(1, self.max_move_step +1): new_row = current_row + di * step new_col = current_col + dj * step # 超出边界直接终止当前方向的遍历 if not is_on_board(new_row, new_col): break target_piece = board[new_row][new_col] # 落点合法就加入走法列表 if is_valid_target(self, target_piece): moves.append((new_col, new_row)) # 遇到任意棋子直接终止当前方向遍历,不能跳子 if target_piece !=0: break return moves
重构后原来几十行的国王走法逻辑只需要几行属性定义就可以实现,完全消除了重复if嵌套,后续维护修改规则也只需要修改对应属性即可。
4. 特殊规则处理
兵、王车易位、吃过路兵这类特殊规则,直接在对应子类重写valid_moves方法补充特殊逻辑即可,不影响其他棋子的通用逻辑。
内容的提问来源于stack exchange,提问作者wEF454
相关产品推荐
相关产品推荐

