当我绘制矩形时,Pygame显示黑屏

时间:2020-07-17 00:25:26

标签: python pygame

我尝试从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()

2 个答案:

答案 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()之外,没有顶级的实际执行代码。这样做确实需要您注意全局变量,但这会在此处引起一些问题。