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
相关产品推荐
相关产品推荐

