python - 如何在我的蛇应用程序中的网格之间填充颜色
问题描述
我遇到了这个问题,我可以为我的蛇画一个网格,但我不能在它之间填充颜色。问题似乎是因为表面上的网格覆盖了背景的实际颜色,但我不知道如何解决这个问题,任何了解 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()
解决方案
您需要使用背景颜色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()
# [...]
推荐阅读
- actions-on-google - 如何使用 Google Actions 为 NetworkControl 设备特征执行 TestNetworkSpeed 命令?
- ubuntu - bcdedit /deletevalue {default} 安全启动显示:尝试删除指定数据元素时出错。未找到元素
- vb.net - ListView Subitems:几个复选框列?
- kubernetes - 全局禁用 kubernetes enableServiceLinks?
- bash - 单击网页上的下载按钮并使用 shellnium 将文件保存在 bash 中
- sql-server - 从 2 个不同的表中查找计数
- flutter - 是否有一些方法可以增加在没有互联网且应用程序仍在运行时收到的通知数量
- batch-file - 通过批处理自动将文件发送到新文件夹
- java - 无法从核心模块类 LibGDX Android Studio 访问 Java 对象
- c++ - 从 3 小时时段延长至 N 天