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

如何解决pygame绘制随机圆重叠问题?不使用图片怎么绘制气球形状?

气球重叠问题修复方案

你当前的代码存在两个核心问题导致重叠+运行异常:

  1. 生成x坐标时没有和已生成的坐标做距离校验:两个半径30的圆形,圆心水平距离小于60就会重叠
  2. 把气球生成逻辑写在了每帧执行的draw函数里,每次循环都会往balloon_list里追加7个新元素,不仅会导致重复绘制,列表也会无限膨胀

修改思路:

  • 把气球坐标、颜色的生成逻辑单独提取,在游戏启动时一次性完成
  • 每次生成新的x坐标时,循环校验和已有x的距离,直到生成符合不重叠要求的坐标为止

修改后的参考代码:

import pygame as pg
import random as r
import sys

pg.init()

def generate_balloons(count=7, min_gap=60, x_max=500):
    balloon_list = []
    colors = []
    for _ in range(count):
        # 循环生成直到找到不重叠的x坐标
        while True:
            balloon_x = r.randint(0, x_max)
            # 校验和已有的所有x的距离
            if all(abs(balloon_x - exist_x) >= min_gap for exist_x in balloon_list):
                break
        balloon_color = (r.choice([0,255]), r.randint(0,255), r.choice([0,255]))
        balloon_list.append(balloon_x)
        colors.append(balloon_color)
    return balloon_list, colors

def draw_balloons(balloon_list, colors, y):
    for i in range(len(balloon_list)):
        pg.draw.circle(screen, colors[i], (balloon_list[i], y), radius=30)

# Vars #
y = 250
velocity = 5
clock = pg.time.Clock()

screen = pg.display.set_mode((688 ,387))
screen.fill('#ffffff')
pg.display.set_caption("Remember")

# 一次性生成气球坐标和颜色
balloon_list, colors = generate_balloons()

running = True

while running:
    clock.tick(60)
    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:
                pg.quit()
                sys.exit()

    screen.fill('#ffffff') # 每帧重绘背景,避免绘制残留
    draw_balloons(balloon_list, colors, y)
    pg.display.update()

无外部资源实现气球造型方案

直接用pygame内置的绘制函数组合就能实现接近真实的气球效果,组合逻辑如下:

  1. 用pygame.draw.ellipse()绘制竖椭圆作为气球主体,比正圆更符合气球的形态
  2. 用pygame.draw.polygon()在椭圆底部绘制小三角形作为气球封口
  3. 用pygame.draw.line()从封口向下绘制细线作为气球绳
  4. 可选:在气球左上角加一个小的白色圆形作为高光,增加立体感

把上面的draw_balloons函数替换成下面的代码即可:

def draw_balloons(balloon_list, colors, y):
    for i in range(len(balloon_list)):
        x = balloon_list[i]
        color = colors[i]
        # 1. 气球主体:竖椭圆,宽50,高65
        pg.draw.ellipse(screen, color, (x-25, y-40, 50, 65))
        # 2. 底部封口小三角
        pg.draw.polygon(screen, color, [(x, y+25), (x-8, y+15), (x+8, y+15)])
        # 3. 气球绳,长度80
        pg.draw.line(screen, (0,0,0), (x, y+25), (x, y+105), 2)
        # 4. 高光小白点
        pg.draw.circle(screen, (255,255,255), (x-12, y-25), 5)

你可以根据自己的需求调整各部分的尺寸、颜色参数。


内容的提问来源于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.04 04:09:05