Python + pygame 程序崩溃解决方案

67 阅读3分钟

一位用户在使用 Python 和 Pygame 库制作一个简单的动画时遇到了程序崩溃的问题。用户反复检查代码,但未能找到错误。代码如下:

import pygame
import random

# 常量
SIZE = (800,600)
WHITE = (255,255,255)
BLACK = (0,0,0)
BROWN = (139,69,19)
YELLOW = (255,255,0)
MAX_SNOWFLAKES = 800

# 函数
x_sun = 40
y_sun = 55

def sun():
    x_sun = -40
    y_sun = 55
    for i in range(1000000):
        screen.fill(BLACK)
        for i in range(1):
            pygame.draw.circle(screen, YELLOW, (x_sun, y_sun), 40)
            x_sun +=1
            if x_sun > 640:
                x_sun = 0
        pygame.display.flip()
        pygame.time.wait(10)


def snowman(x,y):
    pygame.draw.circle(screen, WHITE, (x,y), 30)
    pygame.draw.circle(screen, WHITE, (x,y-110), 30)
    pygame.draw.circle(screen, WHITE, (x,y-50),40)
    pygame.draw.circle(screen, WHITE, (x-30,y-30),50)
    pygame.draw.circle(screen, WHITE, (x+30,y-30),50)
    pygame.draw.circle(screen, BLACK, (x+20,y-20),5)
    pygame.draw.circle(screen, BLACK, (x-20,y-20),5)
    pygame.draw.line(screen, BROWN, (x+20, y-20), (x+40, y-20), 2.5)
    pygame.draw.line(screen, BROWN, (x-20, y-20), (x-40, y-20), 2.5)
    pygame.draw.line(screen, BROWN, (x+40, y-20), (x+60, y-20), 2.5)
    pygame.draw.line(screen, BROWN, (x-40, y-20), (x-60, y-20), 2)
    pygame.draw.line(screen, BROWN, (x-60, y-20), (x-60, y-5), 2)
    pygame.draw.line(screen, BROWN, (x+60, y-20), (x+60, y-5), 2)
    pygame.display.flip()

# x 和 y 列表
xlist_snow = []
ylist_snow = []

# 显示屏幕
screen = pygame.display.set_mode(SIZE)

# 为雪花创建 x + y 列表
for i in range(MAX_SNOWFLAKES):
    x_num = random.randint(0,MAX_SNOWFLAKES)
    xlist_snow += [x_num]
    y_num = random.randint(0,(MAX_SNOWFLAKES-200))
    ylist_snow += [y_num]

# 循环打印雪花
for i in range(10000):
    screen.fill(BLACK)

    # 通过向下移动雪花来使其动画
    for i in range(len(xlist_snow)):
        pygame.draw.circle(screen, WHITE, (xlist_snow[i], ylist_snow[i]), 3)
        ylist_snow[i] = ylist_snow[i]+1

        # 如果 y 位置等于 0,则重置
        if ylist_snow[i] >= 600:
            ylist_snow[i] = 0


    pygame.draw.circle(screen, YELLOW, (x_sun, y_sun), 40)

    x_sun += 1
    if x_sun > 600:
        x_sun = 0

    #snowman(300,300)

    pygame.display.flip()
    pygame.time.wait(50)

pygame.time.wait(3000)
pygame.quit()

解决方案:

仔细检查代码后,发现问题出在函数 sun()。在该函数中,for 循环嵌套了两层,并且在内层循环中,x_sun 变量的值一直递增。因此,随着时间的推移,x_sun 的值会不断增大,最终导致程序崩溃。

为了解决这个问题,可以将 sun() 函数修改为如下:

def sun():
    x_sun = 40
    y_sun = 55
    for i in range(1000000):
        screen.fill(BLACK)
        for i in range(1):
            pygame.draw.circle(screen, YELLOW, (x_sun, y_sun), 40)
            if x_sun > 640:
                x_sun = 0
            else:
                x_sun +=1
        pygame.display.flip()
        pygame.time.wait(10)

在修改后的代码中,x_sun 变量的值只会在 if 语句中递增,因此可以确保 x_sun 的值不会超出屏幕的边界。

代码示例:

以下是可以正常运行的完整代码示例:

import pygame
import random

# 常量
SIZE = (800,600)
WHITE = (255,255,255)
BLACK = (0,0,0)
BROWN = (139,69,19)
YELLOW = (255,255,0)
MAX_SNOWFLAKES = 800

# 函数
x_sun = 40
y_sun = 55

def sun():
    x_sun = 40
    y_sun = 55
    for i in range(1000000):
        screen.fill(BLACK)
        for i in range(1):
            pygame.draw.circle(screen, YELLOW, (x_sun, y_sun), 40)
            if x_sun > 640:
                x_sun = 0
            else:
                x_sun +=1
        pygame.display.flip()
        pygame.time.wait(10)


def snowman(x,y):
    pygame.draw.circle(screen, WHITE, (x,y), 30)
    pygame.draw.circle(screen, WHITE, (x,y-110), 30)
    pygame.draw.circle(screen, WHITE, (x,y-50),40)
    pygame.draw.circle(screen, WHITE, (x-30,y-30),50)
    pygame.draw.circle(screen, WHITE, (x+30,y-30),50)
    pygame.draw.circle(screen, BLACK, (x+20,y-20),5)
    pygame.draw.circle(screen, BLACK, (x-20,y-20),5)
    pygame.draw.line(screen, BROWN, (x+20, y-20), (x+40, y-20), 2.5)
    pygame.draw.line(screen, BROWN, (x-20, y-20), (x-40, y-20), 2.5)
    pygame.draw.line(screen, BROWN, (x+40, y-20), (x+60, y-20), 2.5)
    pygame.draw.line(screen, BROWN, (x-40, y-20), (x-60, y-20), 2)
    pygame.draw.line(screen, BROWN, (x-60, y-20), (x-60, y-5), 2)
    pygame.draw.line(screen, BROWN, (x+60, y-20), (x+60, y-5), 2)
    pygame.display.flip()

# x 和 y 列表
xlist_snow = []
ylist_snow = []

# 显示屏幕
screen = pygame.display.set_mode(SIZE)

# 为雪花创建 x + y 列表
for i in range(MAX_SNOWFLAKES