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

如何在Pygame中严格填充网格内的单元格?

Pygame网格点击填充问题修复

问题说明

在Pygame中绘制网格后,点击单元格期望填充整个单元格,但当前点击后会在鼠标位置绘制矩形,而非对齐到目标单元格。尝试对齐网格坐标时所有坐标归零,无法实现需求。

问题根源

  1. 直接使用鼠标原始坐标绘制矩形,未转换为网格单元格的起始坐标
  2. 生成set_x、set_y的逻辑冗余且无必要,徒增内存消耗
  3. 未保存已填充的单元格位置,窗口刷新后填充的矩形会消失
  4. 缺失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,提问作者Александр Кузнецов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:40:35