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

Pygame碰撞检测后切换背景时如何正确显示对应数量的气球?

你的代码存在三个核心问题导致气球数量显示异常:

  1. 直接修改了原始气球图片资源的透明度,全局的气球素材被修改后无法在切换背景时恢复显示
  2. 没有维护气球数量配额变量,仅用固定的num_balloons=7,无法随击中次数动态调整显示数量
  3. 切换背景时没有重新生成对应数量的气球位置,始终复用首次生成的7个气球坐标

修改后的完整代码

import pygame as pg
import random as r
import sys

pg.init()

# 背景资源
bg = pg.image.load('bg.jpg')
bg = pg.transform.scale(bg, (688,387))
new_bg = pg.image.load('new_bg.jpg')
new_bg = pg.transform.scale(new_bg, (688,387))

radius = 30
diameter = 2 * radius

# 原始气球素材(不做修改,仅作复制使用)
raw_balloons = []
for i in range(1,8):
    b = pg.image.load(f'balloons/{i}.png').convert_alpha()
    b = pg.transform.scale(b, (63,131))
    raw_balloons.append(b)

gun = pg.image.load('game-gun.png').convert_alpha()
gun = pg.transform.scale(gun, (150,150))

screen = pg.display.set_mode((688 ,387))
pg.display.set_caption("Remember")

clock = pg.time.Clock()

# 游戏状态变量
current_quota = 7  # 当前每个背景的气球显示配额
hit_count = 0      # 累计击中次数,每击中2次配额减1
bg_bool = False    # 背景切换标记
balloon_list = []  # 当前页面的气球x坐标列表
x = 0
y = 250
velocity = 5

def create_balloons(count):
    """按指定数量生成不重叠的气球x坐标"""
    balloons = []
    for i in range(count):
        while True:
            candidate = r.randint(0, 500)
            if all(abs(candidate-x) >= diameter for x in balloons):
                break
        balloons.append(candidate)
    return balloons

def draw_balloons(y):
    """按当前配额绘制气球"""
    for i in range(current_quota):
        screen.blit(raw_balloons[i], (balloon_list[i], y-50))

def check_collisions(x, y):
    global bg_bool, hit_count, current_quota, balloon_list
    for i in range(current_quota):
        gun_rect = gun.get_rect(topleft = (x,y))
        gun_mask = pg.mask.from_surface(gun)

        balloon_rect = raw_balloons[i].get_rect(topleft = (balloon_list[i], y-100))
        balloon_mask = pg.mask.from_surface(raw_balloons[i])

        offset = (balloon_rect.x - gun_rect.x), (balloon_rect.y - gun_rect.y)
        if gun_mask.overlap(balloon_mask, offset):
            # 击中后切换背景
            bg_bool = not bg_bool
            hit_count += 1
            # 每击中2次(两个背景各1次),配额减1
            if hit_count % 2 == 0:
                current_quota = max(0, current_quota - 1)
            # 切换背景后重新生成对应配额的气球
            balloon_list = create_balloons(current_quota)
            return

# 初始化首次气球
balloon_list = create_balloons(current_quota)

running = True
while running:
    clock.tick(60)

    # 绘制背景
    screen.blit(new_bg if bg_bool else bg, (0,0))

    for event in pg.event.get():
        if event.type == pg.QUIT:
            pg.quit()
            sys.exit()
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_ESCAPE:
                running = False
            if event.key == pg.K_SPACE:
                check_collisions(x, y)

    # 绘制气球
    draw_balloons(y)

    # 枪的移动逻辑,增加边界限制
    keys = pg.key.get_pressed()
    x += (keys[pg.K_RIGHT] - keys[pg.K_LEFT]) * velocity
    x = max(0, min(x, 688 - 150))

    screen.blit(gun, (x, y))
    pg.display.update()

核心修改说明

  • 拆分了原始气球素材和运行时变量,不再修改原始资源保证切换背景时可以正常显示气球
  • 新增current_quota变量控制每个背景的气球显示数量,新增hit_count变量统计击中次数,每两个背景各击中一次后配额减1,完全符合你要求的7,7 → 6,6 → ... →1,1的数量变化逻辑
  • 每次切换背景时自动重新生成对应数量的不重叠气球位置
  • 优化了枪的移动逻辑,增加边界限制避免枪移出屏幕

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:24:03