# Python 学习记录:用 pygame 做出简易球碰撞游戏
前言:
昨天我开始学习 pygame,从绘制图形、展示图片,到用按键控制角色移动,最后在老师的指导下完成了简易球碰撞游戏。第一次让画面动起来、让小球自己反弹,真的特别有成就感。
一、pygame 的图形绘制
昨天学习了四种常用图形的绘制:矩形用 pygame.draw.rect(),圆形用 pygame.draw.circle(),椭圆形用 pygame.draw.ellipse(),多边形用 pygame.draw.polygon()。老师还演示了图片的展示,用 pygame.image.load() 加载图片,再用 screen.blit() 放到窗口上。
演示代码(游戏里的挡板和小球):
pygame.draw.rect(screen, white, pad_rect) # 白色挡板
pygame.draw.circle(screen, red, (ball_x, ball_y), ball_r) # 红色小球
运行结果:黑色窗口中显示一个白色矩形挡板和一个红色圆形小球。
二、键盘控制:让挡板跟着按键移动
我学会了用 pygame.key.get_pressed() 读取按键状态,并用 K_LEFT、K_RIGHT 控制左右方向,也练习了上下左右按键的用法。
演示代码:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and pad_x > 0:
pad_x -= 5
if keys[pygame.K_RIGHT] and pad_x + pad_w < W:
pad_x += 5
运行结果:按住键盘左右方向键,挡板会左右移动。
这里有一个关键点:移动时还要判断边界,否则挡板会直接跑出窗口外面。
三、球碰撞:整个游戏的核心
小球每帧都按照 dx、dy 改变坐标,碰到左右墙壁或顶部就反转方向;碰到挡板或砖块就反弹;掉出窗口底部则回到初始位置重新开始。
判断碰撞用的是 pygame.Rect 和 colliderect(),比手写坐标比较方便很多。
演示代码:
ball_rect = pygame.Rect(ball_x - ball_r, ball_y - ball_r, ball_r * 2, ball_r * 2)
pad_rect = pygame.Rect(pad_x, pad_y, pad_w, pad_h)
if ball_rect.colliderect(pad_rect):
dy *= -1
if ball_rect.colliderect(brick_rect):
dy *= -1
is_brick_exist = False
运行结果:小球碰到挡板会向上反弹,碰到蓝色砖块后砖块消失,掉出底部后小球从初始位置重新开始。
四、让游戏“活”起来的主循环
游戏能一直运行,靠的是 while running 主循环:clock.tick(60) 控制帧率,每帧都重新填充背景、更新位置、绘制图形,最后用 pygame.display.flip() 刷新画面。
我今天踩过最深的坑就是忘记写 pygame.display.flip(),结果画面一直不刷新。老师提醒后我才明白:绘制和刷新是两回事。
运行结果:一个完整的简易打砖块小游戏,挡板接球、砖块被打掉、球掉落后重新开始。
结尾留言:
昨天的学习让我发现,pygame 比想象中好玩,也比想象中容易“踩坑”。接下来我想给游戏加上更多砖块、计分功能,还有游戏结束的画面,把它做成一个真正能玩的小游戏。
更多推荐

所有评论(0)