You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame雪花生成器报错:randrange()范围为空问题求助

解决Pygame雪花生成器的错误与优化

嘿,我来帮你搞定这个雪花生成器的问题!你遇到的错误和代码里的几个小细节问题我都梳理清楚了,咱们一步步来修复:

错误根源:无效的随机数范围

你碰到的 ValueError: empty range for randrange() 是因为**randint(a, b)要求第一个参数必须小于等于第二个参数**。你写的 randint(-10, -50) 里,-10比-50大,这个范围是不存在的,所以Python直接抛出了错误。

代码里的其他小问题

除了这个随机范围的错误,还有两个容易忽略的细节:

  • 退出逻辑的变量名写错了:你用 close=True,但循环判断的是 closed,这会导致点击关闭按钮后程序没法正常退出;
  • 雪花生成逻辑有性能隐患:现在每帧都会往snow列表里添加新雪花,运行几分钟后列表会变得无比庞大,程序会越来越卡。

修正后的完整代码

import pygame
from random import randint

pygame.init()

Black = (0, 0, 0)
White = (255, 255, 255)
size = (800, 600)

game_display = pygame.display.set_mode(size)
pygame.display.set_caption('Snowflakes')

closed = False
clock = pygame.time.Clock()
pygame.mouse.set_visible(False)

# 初始化固定数量的雪花(比如100个),避免列表无限增长
snow = []
for _ in range(100):
    x_coord = randint(0, 800)
    y_coord = randint(-50, 0)  # 初始让雪花从屏幕上方外出现
    snow.append([x_coord, y_coord])

while not closed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            closed = True  # 修正变量名
    
    game_display.fill(Black)
    
    # 遍历雪花列表,更新位置并绘制
    for flake in snow:
        pygame.draw.circle(game_display, White, flake, 2)
        flake[1] += 1  # 雪花下落
        
        # 触底后重新生成到屏幕上方外
        if flake[1] > 600:
            flake[0] = randint(0, 800)
            flake[1] = randint(-50, -10)  # 修正randint参数顺序
    
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quit()

关键修改说明

  1. 修正随机范围:把 randint(-10, -50) 改成 randint(-50, -10),确保生成的y坐标是从-50到-10的负数,让雪花从屏幕顶部外重新出现;
  2. 修复退出变量名:把 close=True 改成 closed=True,保证点击关闭按钮能正常退出程序;
  3. 优化雪花生成逻辑:初始化时生成固定数量的雪花(这里是100个),而不是每帧都添加,避免列表无限增长导致性能下降;
  4. 简化遍历逻辑:用 for flake in snow 代替 for i in range(len(snow)),代码更简洁易读。

这样修改后,你的雪花生成器就能正常运行,雪花触底后会从屏幕上方重新出现,而且不会有性能问题啦!

内容的提问来源于stack exchange,提问作者BigBoiBif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:34:31