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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:06:03