Как я мог оптимизировать этот простой код python pygame

Мне поставили задачу создать игру с использованием pygame (я делаю змейку, поэтому это должно быть легко ... но я никогда не использовал pygame), поэтому использование более эффективного языка не вариант. что я обновляю сетку змейки слишком медленно, и у меня недостаточно опыта в pygame, чтобы исправить это, может кто-нибудь, кто может помочь. Также в качестве примечания, если я только заполняю сетку, она не очищается за змеей. Использование Python 3.8

import pygame
import time
import random

pygame.init()

display_width = 800
display_height = 600
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)
white = (255,255,255)
black = (1,1,1)
grey = (50,50,50)
darkgrey = (25,25,25)


clock = pygame.time.Clock()

snake_block = 10
snake_speed = 30

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

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

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 = -10
                    Y_change = 0
                elif event.key == pygame.K_RIGHT:
                    X_change = 10
                    Y_change = 0
                elif event.key == pygame.K_UP:
                    X_change = 0
                    Y_change = -10
                elif event.key == pygame.K_DOWN:
                    X_change = 0
                    Y_change = 10

        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)
        drawGrid()
        pygame.draw.rect(display,puregreen,[X,Y,10,10])

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

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

    pygame.quit()
    quit()

SnakeGameLoop()

person D.CMorgan    schedule 20.12.2020    source источник
comment
Вы уверены, что drawGrid снижает вашу игру? количество кадров в секунду ограничено clock.tick(15) (15 кадров в секунду)   -  person Rabbid76    schedule 20.12.2020
comment
Я попытался поднять его, и все, что он сделал, - это замедлил загрузку, а затем заставил змею врезаться в стену.   -  person D.CMorgan    schedule 21.12.2020


Ответы (1)


Чтобы улучшить производительность игры, нарисуйте сетку на объекте pygame.Surface с размером экрана, до цикла приложения:

def drawGrid(surf):
    surf.fill(grey)
    blockSize = 10 
    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)

blit вместо этого поверхность один раз за кадр на дисплее рисования сетки один раз за кадр, в цикле приложения:

def SnakeGameLoop():
    # [...]

    while not game_over:
        # [...]

        display.blit(grid_surf, (0, 0))
        
        pygame.draw.rect(display,puregreen,[X,Y,10,10])

        pygame.display.update()
person Rabbid76    schedule 20.12.2020
comment
Большое спасибо, это очень помогает, я чувствую себя действительно глупо, спрашивая об этом, но я не могу изменить цвет фактических блоков в сетке, он просто постоянно черный, как мне это изменить, я оптимально хочу между сетками при значении RGB ( 50,50,50), а линии сетки должны быть (75,75,75) - person D.CMorgan; 21.12.2020
comment
Также в качестве побочного примечания я возился с этим, в любом случае поместите змею в сетку, когда блок не равен 10. (Я изменил его, поэтому блоки сетки всегда имеют тот же РАЗМЕР, что и змея, но он не совпадает с это и я не знаю, как бы я это сделал) - person D.CMorgan; 21.12.2020
comment
@ D.CMorgan 1. Я изменил ответ. Заполните (surf.fill(grey)) поверхность пояса перед рисованием сетки. 2. Это ошибка вашего приложения. Однако это новый вопрос. - person Rabbid76; 21.12.2020