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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:04