Pygame星星全屏分布问题:现有代码仅生成于左上角求解决
Pygame星星全屏分布问题解决方案
我正在学习Pygame编程,当前任务是让星星铺满整个游戏屏幕。我编写了代码,但星星仅在屏幕左上角生成,不清楚如何修改实现全屏分布。以下是我的分布逻辑代码:
def x_demension(custom_settings, star): available_x = custom_settings.width - 2*star.rect.width #available space along abscissa axis count_numbers = int(available_x / (2*star.rect.width)) #quantity of stars throught weight return count_numbers def y_demension(custom_settings, star, spaceship): available_y = custom_settings.height - 2*star.rect.height - spaceship.rect.height #available space along ordinate axis number_rows = int(available_y / (2*star.rect.height)) #quantity of rows throught height return number_rows def create_star(screen, custom_settings, number, row_number, stars): star = Star(screen, custom_settings) #create an instance of a star star.rect.x = star.rect.width + 2*star.rect.width * randint(0,number) #coordinate x of a star x = randint(0, star.rect.x) star.rect.x = x star.rect.y = star.rect.height + 2*star.rect.height * randint(0,row_number) #coordinate y of a star y = randint(0,star.rect.y) star.rect.y = y stars.add(star) #added stars if len(stars) > 50: #limiter of the star adding stars.remove(star) else: stars.add(star) def starsky(custom_settings, screen, spaceship, stars): star = Star(custom_settings, screen) #created as an instance of a random star number_stars = x_demension(custom_settings, star) number_rows = y_demension(custom_settings, star, spaceship) for row_number in range(number_rows): for number in range(number_stars): create_star(screen, custom_settings, number, row_number, stars)
问题分析
你的代码里星星只在左上角生成,核心原因是create_star函数的坐标计算逻辑出了问题:
- 你先基于行列索引计算了一个有限的坐标范围,然后又在这个小范围内随机,直接把星星的生成区域限制在了左上角。
- 同时存在重复添加星星的问题(先
stars.add(star),else分支又重复add),而且星星数量限制的逻辑也不够合理。
修改后的代码
我们可以简化逻辑,直接在整个屏幕的可用区域内随机生成星星坐标,同时修正数量限制的逻辑:
import random # 确保导入了random模块 def create_star(screen, custom_settings, stars): star = Star(screen, custom_settings) # 直接在整个屏幕宽度内随机x坐标,确保星星不会超出屏幕 star.rect.x = random.randint(0, custom_settings.width - star.rect.width) # 在屏幕高度内随机y坐标,留出飞船的位置(如果需要) star.rect.y = random.randint(0, custom_settings.height - star.rect.height - custom_settings.ship_height) # 先判断数量,再添加,避免重复操作 if len(stars) < 50: stars.add(star) def starsky(custom_settings, screen, spaceship, stars): # 如果星星数量不够50,就持续生成直到达到上限 while len(stars) < 50: create_star(screen, custom_settings, stars)
额外优化建议
如果希望星星分布更均匀(而非完全随机),也可以保留行列逻辑,但去掉多余的随机嵌套,同时加入小范围偏移让分布更自然:
import random def x_demension(custom_settings, star): return int(custom_settings.width / (2 * star.rect.width)) def y_demension(custom_settings, star, spaceship): available_y = custom_settings.height - spaceship.rect.height return int(available_y / (2 * star.rect.height)) def create_star(screen, custom_settings, number, row_number, stars): star = Star(screen, custom_settings) # 按行列均匀分布,同时加入随机偏移避免过于规整 base_x = star.rect.width + 2 * star.rect.width * number star.rect.x = base_x + random.randint(-star.rect.width//2, star.rect.width//2) base_y = star.rect.height + 2 * star.rect.height * row_number star.rect.y = base_y + random.randint(-star.rect.height//2, star.rect.height//2) # 确保星星不会超出屏幕边界 star.rect.x = max(0, min(star.rect.x, custom_settings.width - star.rect.width)) star.rect.y = max(0, min(star.rect.y, custom_settings.height - star.rect.height)) if len(stars) < 50: stars.add(star) def starsky(custom_settings, screen, spaceship, stars): star = Star(custom_settings, screen) number_stars = x_demension(custom_settings, star) number_rows = y_demension(custom_settings, star, spaceship) for row_number in range(number_rows): for number in range(number_stars): if len(stars) >= 50: break create_star(screen, custom_settings, number, row_number, stars) if len(stars) >= 50: break
这样修改后,星星就能铺满整个屏幕了,两种方案分别适用于完全随机分布和均匀带偏移的分布,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

