如何在Pygame绘制的棋盘中处理鼠标移动事件实现单元格高亮?
Pygame棋盘单元格悬停高亮实现方案
你代码的核心问题是没有记录上一次高亮的单元格位置,导致旧的高亮状态无法重置。以下是可直接运行的修正后代码:
import pygame # 初始化pygame pygame.init() # 颜色定义 YELLOW = (204, 250, 35) RED = (255, 0, 0) # 单元格尺寸、棋盘行列数定义 CELL_WIDTH = 80 CELL_HEIGHT = 80 ROW_COUNT = 8 COL_COUNT = 15 # 计算窗口尺寸 SCREEN_WIDTH = COL_COUNT * CELL_WIDTH + (COL_COUNT + 1) SCREEN_HEIGHT = ROW_COUNT * CELL_HEIGHT + (ROW_COUNT + 1) screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("棋盘悬停") clock = pygame.time.Clock() SG = True # 初始化棋盘状态,0为红色,1为黄色高亮 grid = [] for row in range(ROW_COUNT): grid.append([]) for column in range(COL_COUNT): grid[row].append(0) # 记录上一次高亮的单元格坐标 last_highlight = None # 主循环 while SG: # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: SG = False if event.type == pygame.MOUSEMOTION: pos = pygame.mouse.get_pos() # 计算当前鼠标所在单元格坐标 column = pos[0] // (CELL_WIDTH + 1) row = pos[1] // (CELL_HEIGHT + 1) # 校验坐标是否在棋盘范围内 if 0 <= row < ROW_COUNT and 0 <= column < COL_COUNT: # 重置上一次高亮的单元格 if last_highlight is not None: last_r, last_c = last_highlight grid[last_r][last_c] = 0 # 设置当前单元格高亮 grid[row][column] = 1 last_highlight = (row, column) print("悬停位置 ", pos, "网格坐标: ", row, column) # 绘制棋盘 for row in range(ROW_COUNT): for column in range(COL_COUNT): color = YELLOW if grid[row][column] == 1 else RED x = column * CELL_WIDTH + (column + 1) y = row * CELL_HEIGHT + (row + 1) pygame.draw.rect(screen, color, (x, y, CELL_WIDTH, CELL_HEIGHT), 0) # 刷新屏幕 pygame.display.flip() # 控制帧率60,避免占用过高资源 clock.tick(60) pygame.quit()
关键修改说明
- 新增
last_highlight变量记录上一次高亮的单元格位置,每次鼠标移动到新单元格时,先把上一个单元格的状态重置为0,再更新当前单元格状态 - 统一了棋盘初始化和绘制的行列数,避免出现坐标越界问题
- 补全了pygame初始化、窗口创建、帧率控制、程序退出释放资源的基础逻辑
- 新增了坐标合法校验,避免鼠标移出棋盘范围时报错
内容的提问来源于stack exchange,提问作者Wilports
相关产品推荐
相关产品推荐

