我尝试从link实现蛇游戏教程,但是运行.py文件后,屏幕立即关闭。我一直在寻找屏幕即时关闭错误的方法,并尝试通过添加运行块来修复它,但是现在只要我尝试绘制矩形,屏幕就会变成黑色。
import os
os.environ['SDL_AUDIODRIVER'] = 'dsp'
import pygame
import sys
import random
import subprocess
import pygame
pygame.init()
display_width = 500
display_height = 500
display = pygame.display.set_mode((display_width,display_height))
window_color= (200,200,200)
red = (255,0,0)
black = (0,0,0)
apple_image = pygame.image.load('apple.jpg')
snake_head = [250,250]
pygame.display.set_caption("Snake AI")
snake_position = [[250,250],[240,250],[230,250]]
apple_position = [random.randrange(1,50)*10,random.randrange(1,50)*10]
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run =False
if event.type == pygame.KEYDOWN:
command = "python sample.py"
subprocess.call(command)
def display_snake(snake_position):
for position in snake_position:
pygame.draw.rect(display,red,pygame.Rect(position[0],position[1],10,10))
def display_apple(display,apple_position, apple):
display.blit(apple,(apple_position[0], apple_position[1]))
pygame.display.update()
pygame.quit()
答案 0 :(得分:1)
您需要将pygame.quit()命令放在检查事件“ for”循环下。因为它当前正在做的事情正在您的程序中运行,并且一旦退出,它就完成了主循环:
while True: # you don't need a flag here, unless
# you have an activation button of
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
command = "python sample.py"
subprocess.call(command)
通常,一种可行的做法是将上述所有代码重构为功能,或者在不同的模块中完成它们,然后将它们作为对象导入到所谓的main.py
文件中(此文件包含主要游戏循环) )。
答案 1 :(得分:1)
您已经定义了display_apple()
和display_snake()
的调用位置。
将display_apple()
和display_snake()
函数的定义移出while循环,然后将其移至顶部。在以前定义它们的地方,请调用它们。您将在屏幕上看到蛇和苹果。
def display_snake(snake_position):
for position in snake_position:
pygame.draw.rect(display,red,pygame.Rect(position[0],position[1],10,10))
def display_apple(display,apple_position, apple):
display.blit(apple,(apple_position[0], apple_position[1]))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run =False
if event.type == pygame.KEYDOWN:
command = "python sample.py"
subprocess.call(command)
display_apple(display, apple_position, apple_image)
display_snake(snake_position)
pygame.display.update()
我将定义放在while
循环的上方,这样您就可以看到它们,但是通常在pygame.init()
调用是个好地方之前,我通常将它们定义得更高。
您通常希望将函数定义和类定义(如果有的话,但目前还没有)与执行的代码分开。
事实上,我更喜欢将执行代码的主体也放置在一个函数中,通常该函数被称为main()
,然后仅调用该函数。这意味着除了调用函数main()
之外,没有顶级的实际执行代码。这样做确实需要您注意全局变量,但这会在此处引起一些问题。