You need to enable JavaScript to run this app. Python3.7与Pygame国际象棋开发:如何实现车的不越子可移动格高亮
优惠活动
大模型
产品
解决方案
定价
更多

Python3.7与Pygame国际象棋开发:如何实现车的不越子可移动格高亮

白车高亮逻辑修改方案

原代码核心问题

你当前的白车逻辑通过双层遍历全棋盘,只要同行/同列是空格就加入高亮列表,完全没有检查路径上的遮挡棋子,因此会出现被挡住的格子也被高亮的问题。

替换后的白车代码

直接替换你现有# white rook对应的代码块即可,完全适配你当前的代码结构:

# white rook
if piece == "wr":
    # 清空上一次的高亮缓存,避免位置残留
    highlight_squares_lst.clear()

    # 定义车的四个移动方向:(行偏移量, 列偏移量) 对应上、下、左、右
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]

    for dr, dc in directions:
        # 从当前棋子的相邻下一格开始遍历,避免把当前位置加入高亮
        current_r = from_row + dr
        current_c = from_col + dc

        # 只要坐标在棋盘边界内就继续沿当前方向走
        while 0 <= current_r <= 7 and 0 <= current_c <= 7:
            current_piece = ppos[current_r][current_c]
            current_color = get_piece_colour(current_piece)

            # 坐标计算完全复用你原有逻辑,不会出现绘制错位
            square_x = current_r * square_size
            square_y = current_c * square_size
            square_xy_tuple = (square_x, square_y)

            if current_color == "e":
                # 空格可走,加入高亮后继续沿当前方向走下一格
                highlight_squares_lst.append(square_xy_tuple)
                current_r += dr
                current_c += dc
            elif current_color == "black":
                # 遇到对方棋子可吃掉,加入高亮后立刻停止当前方向
                highlight_squares_lst.append(square_xy_tuple)
                break
            else:
                # 遇到己方棋子,直接停止当前方向的遍历
                break

    # 高亮绘制逻辑和你原有写法完全一致
    for t in highlight_squares_lst:
        board.blit(green_highlight, (t[1], t[0]))

逻辑说明

  • 完全复用你已有的坐标计算、高亮绘制、棋子颜色判断逻辑,不会和已经写完的白兵功能冲突
  • 按四个方向逐格推进,遇到棋子即停止,完全符合车不能越子的规则:
    • 遇到空格:加入高亮列表,继续沿当前方向走下一格
    • 遇到对方棋子:加入高亮列表(表示可以吃掉该子),立刻停止当前方向的遍历
    • 遇到己方棋子:直接停止当前方向的遍历,不会计算后方被遮挡的格子

额外小提示

你可以在highlight_possible_squares函数的最开头(绘制基础高亮的那行代码下方)加一行highlight_squares_lst.clear(),避免多次切换选中棋子时残留之前的高亮位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 06:54:02