首页 > 解决方案 > 如何在我的蛇应用程序中的网格之间填充颜色

问题描述

我遇到了这个问题,我可以为我的蛇画一个网格,但我不能在它之间填充颜色。问题似乎是因为表面上的网格覆盖了背景的实际颜色,但我不知道如何解决这个问题,任何了解 pygame 的人都可以帮忙。请参阅我的代码的第 74 行,这就是它应该的颜色。 我如何优化这个简单的 python pygame 代码

import pygame
import time
import random

pygame.init()

display_width = 960
display_height = 540
display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Snake")

pureblue = (0,0,255)
purered = (255,0,0)
puregreen = (0,255,0)
green = (0,150,0)
white = (255,255,255)
black = (1,1,1)
grey = (75,75,75)
darkgrey = (50,50,50)


clock = pygame.time.Clock()

snake_block = 10
snake_speed = 5

font_style = pygame.font.SysFont(None, 50)

def drawGrid(surf):
    blockSize = snake_block 
    for x in range(display_width):
        for y in range(display_height):
            rect = pygame.Rect(x*blockSize, y*blockSize,blockSize, blockSize)
            pygame.draw.rect(surf, darkgrey, rect, 1)
grid_surf = pygame.Surface(display.get_size())
drawGrid(grid_surf)

def message(msg, colour):
    text = font_style.render(msg, True, colour)
    display.blit(text, [display_width/2, display_height/2])

def SnakeGameLoop():
    game_over = False

    X = display_width/2
    Y = display_height/2

    X_change = 0
    Y_change = 0

    while not game_over:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    X_change = -snake_block
                    Y_change = 0
                elif event.key == pygame.K_RIGHT:
                    X_change = snake_block
                    Y_change = 0
                elif event.key == pygame.K_UP:
                    X_change = 0
                    Y_change = -snake_block
                elif event.key == pygame.K_DOWN:
                    X_change = 0
                    Y_change = snake_block

        if X >= display_width or X < 0 or Y >= display_height or Y < 0:
            game_over = True

        X += X_change
        Y += Y_change
        display.fill(grey)
        display.blit(grid_surf, (0,0))

        pygame.draw.rect(display,puregreen,[X,Y,snake_block,snake_block])

        pygame.display.update()
        clock.tick(snake_speed)

    message("You lost", purered)
    pygame.display.update()
    time.sleep(2)

    pygame.quit()
    quit()
SnakeGameLoop()

标签: pythonpygamepygame-surface

解决方案


您需要使用背景颜色fill的网格表面:

def drawGrid(surf):

    surf.fill(grey) # <--- ADD

    blockSize = snake_block 
    for x in range(display_width):
        for y in range(display_height):
            rect = pygame.Rect(x*blockSize, y*blockSize,blockSize, blockSize)
            pygame.draw.rect(surf, darkgrey, rect, 1)

grid_surf = pygame.Surface(display.get_size())
drawGrid(grid_surf)

由于网格Surface覆盖了整个显示屏,因此无需在应用程序循环中清除显示屏:

def SnakeGameLoop():
    # [...]

    while not game_over:
        # [...]

        # display.fill(grey) <--- DELETE

        display.blit(grid_surf, (0,0))

        pygame.draw.rect(display,puregreen,[X,Y,snake_block,snake_block])

        pygame.display.update()
 
        # [...]

推荐阅读