如何在Pygame中严格填充网格内的单元格?
Pygame网格点击填充问题修复
问题说明
在Pygame中绘制网格后,点击单元格期望填充整个单元格,但当前点击后会在鼠标位置绘制矩形,而非对齐到目标单元格。尝试对齐网格坐标时所有坐标归零,无法实现需求。
问题根源
- 直接使用鼠标原始坐标绘制矩形,未转换为网格单元格的起始坐标
- 生成
set_x、set_y的逻辑冗余且无必要,徒增内存消耗 - 未保存已填充的单元格位置,窗口刷新后填充的矩形会消失
- 缺失
sys模块导入,退出程序时会报错
修复后的代码
import pygame import sys class Grid: def __init__(self, width, height, color): self.width = width self.height = height self.color = color self.cell_size = 25 self.grid_gap = 1 self.cell_total_size = self.cell_size + self.grid_gap self.filled_cells = [] # 保存已填充的单元格坐标 def draw_grid(self): pygame.init() win = pygame.display.set_mode((self.width, self.height)) pygame.display.set_caption("Grid Click Fill") while True: # 填充背景 win.fill(self.color) # 绘制网格线 for x in range(0, self.width, self.cell_total_size): for y in range(0, self.height, self.cell_total_size): pygame.draw.rect(win, (200, 200, 200), (x, y, self.cell_size, self.cell_size), 1) # 绘制所有已填充的单元格 for cell_x, cell_y in self.filled_cells: pygame.draw.rect(win, (255, 0, 100), (cell_x, cell_y, self.cell_size, self.cell_size)) # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: mouse_x, mouse_y = pygame.mouse.get_pos() # 计算当前点击的单元格起始坐标 cell_start_x = (mouse_x // self.cell_total_size) * self.cell_total_size cell_start_y = (mouse_y // self.cell_total_size) * self.cell_total_size # 避免重复添加相同单元格 if (cell_start_x, cell_start_y) not in self.filled_cells: self.filled_cells.append((cell_start_x, cell_start_y)) pygame.display.flip() def run(): GREEN = (55, 55, 55) grid = Grid(1100, 700, GREEN) grid.draw_grid() run()
关键修复点
- 单元格坐标计算:使用
(mouse_x // cell_total_size) * cell_total_size将鼠标坐标对齐到最近的网格单元格起始位置,这是核心修复逻辑 - 保存填充状态:用
filled_cells列表记录所有已填充的单元格,确保窗口刷新后内容不会丢失 - 简化网格绘制:直接用
range的步长参数生成网格坐标,去掉冗余的set_x、set_y列表 - 修复模块缺失:添加
import sys,确保退出功能正常
内容的提问来源于stack exchange,提问作者Александр Кузнецов
相关产品推荐
相关产品推荐

