如何优化这个简单的python pygame代码

如何优化这个简单的python pygame代码,python,optimization,pygame,pygame-surface,Python,Optimization,Pygame,Pygame Surface,我被设定了一个挑战,要用pygame制作一个游戏(我制作snake应该很容易…但我从来没有用过pygame),所以使用更高效的语言是不可能的。所以我的问题是,我更新snake网格太慢了,而且我在pygame方面没有足够的经验来解决这个问题,任何人都可以帮忙。也作为一个提示,如果我只填充网格,蛇后面就看不清了。 使用python 3.8 import pygame import time import random pygame.init() display_width = 800 displ

我被设定了一个挑战,要用pygame制作一个游戏(我制作snake应该很容易…但我从来没有用过pygame),所以使用更高效的语言是不可能的。所以我的问题是,我更新snake网格太慢了,而且我在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()
导入pygame
导入时间
随机输入
pygame.init()
显示宽度=800
显示高度=600
display=pygame.display.set_模式((显示宽度、显示高度))
pygame.display.set_标题(“蛇”)
纯蓝色=(0,0255)
纯红色=(255,0,0)
纯绿色=(0255,0)
白色=(255255)
黑色=(1,1,1)
灰色=(50,50,50)
暗灰色=(25,25,25)
clock=pygame.time.clock()
蛇形块=10
蛇行速度=30
font\u style=pygame.font.SysFont(无,50)
def drawGrid():
块大小=10
对于范围内的x(显示宽度):
对于范围内的y(显示高度):
rect=pygame.rect(x*blockSize,y*blockSize,blockSize,blockSize)
pygame.draw.rect(display,darkgrey,rect,1)
def消息(消息,颜色):
text=font\u style.render(味精、真、彩色)
blit(文本,[显示宽度/2,显示高度/2])
def SnakeGameLoop():
游戏结束=错误
X=显示宽度/2
Y=显示高度/2
X_变化=0
Y_变化=0
虽然游戏尚未结束:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
游戏结束=正确
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
X_变化=-10
Y_变化=0
elif event.key==pygame.K_RIGHT:
X_变化=10
Y_变化=0
elif event.key==pygame.K_UP:
X_变化=0
Y_变化=-10
elif event.key==pygame.K_向下:
X_变化=0
Y_变化=10
如果X>=显示宽度或X<0或Y>=显示高度或Y<0:
游戏结束=正确
X+=X_变化
Y+=Y_变化
显示。填充(灰色)
drawGrid()
pygame.draw.rect(显示,纯绿色,[X,Y,10,10])
pygame.display.update()
时钟滴答(15)
信息(“你输了”,纯红色)
pygame.display.update()
时间。睡眠(2)
pygame.quit()
退出
蛇形配子环()

要提高游戏性能,请在应用程序循环之前,在屏幕大小为的对象上绘制网格:

def绘图网格(surf):
冲浪填充(灰色)
块大小=10
对于范围内的x(显示宽度):
对于范围内的y(显示高度):
rect=pygame.rect(x*blockSize,y*blockSize,blockSize,blockSize)
pygame.draw.rect(冲浪,黑暗,rect,1)
grid\u surf=pygame.Surface(display.get\u size())
drawGrid(网格冲浪)
在显示器上每帧绘制一次曲面,而不是在应用程序循环中每帧绘制一次栅格

def SnakeGameLoop():
# [...]
虽然游戏尚未结束:
# [...]
显示.blit(网格(0,0))
pygame.draw.rect(显示,纯绿色,[X,Y,10,10])
pygame.display.update()

你确定是
drawGrid
让你的游戏变低了吗?每秒帧数受到时钟的限制。勾选(15)(每秒15帧)我尝试过增加帧数,但它所做的只是让加载速度变慢,然后让蛇撞到墙上。非常感谢这帮了大忙,问这个问题我真的觉得很愚蠢,但我无法改变网格中实际块的颜色它只是一直是黑色的,我如何改变这一点我最希望在RGB值为(50,50,50)的网格和网格线之间(75,75,75)也作为一个旁注,我一直在搞乱这是无论如何,当块不是10时,将蛇放在网格上。(我已经更改了它,所以网格块的大小始终与蛇相同,但它不与蛇对齐,我不知道我将如何做到这一点)@D.cm1。我改变了答案。绘制网格之前,先填充(
surf.Fill(灰色)
)网格曲面。2.这是应用程序中的一个错误。然而,这是一个新问题。