(喜欢文章的朋友,动一动小手点个关注呀~)
掌握了Pygame基础用法,我们可以玩点更酷的!这些花哨操作不用复杂代码,却能让你的小游戏瞬间“升级”。开始,拿捏👇
不是简单的移动,而是实现“帧动画”——比如角色走路、跳跃,本质是“切换图片帧”,模拟动画效果。
# 思路:加载一组连续的动画帧,循环切换显示# 1. 加载动画帧(假设我们有3张猫的图片:cat-1.png、cat-2.png、cat-3.png)cat_frames = [pygame.image.load("cat-1.png"),pygame.image.load("cat-2.png"),pygame.image.load("cat-3.png")]frame_index = 0 # 帧索引,控制切换clock = pygame.time.Clock() # 控制帧率while running:clock.tick(10) # 每秒切换10帧,避免动画太快# 绘制当前帧screen.blit(cat_frames[frame_index], (100, 100))# 切换帧索引,循环播放frame_index += 1if frame_index >= len(cat_frames):frame_index = 0for event in pygame.event.get():# 点击窗口关闭按钮,退出游戏if event.type == pygame.QUIT:running = False # 结束主循环pygame.quit() # 退出Pygameexit()# 其他事件处理、窗口更新代码...pygame.display.update()

不管是贪吃蛇吃食物、飞机打敌人,还是角色碰到障碍物,都需要“碰撞检测”——判断两个物体是否重叠。
# 思路:给每个物体创建“矩形碰撞框”,判断两个矩形是否重叠# 1. 定义两个物体的矩形(x,y,宽,高)rect1 = pygame.Rect(100, 100, 50, 50) # 红色矩形rect2 = pygame.Rect(150, 150, 50, 50) # 绿色矩形while running:# 绘制两个矩形pygame.draw.rect(screen, (255,0,0), rect1)pygame.draw.rect(screen, (0,255,0), rect2)# 碰撞检测:如果两个矩形重叠,返回Trueif rect1.colliderect(rect2):print("碰撞啦!")# 移动其中一个矩形(比如按方向键移动rect1)keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:rect1.x -= 2if keys[pygame.K_RIGHT]:rect1.x += 2if keys[pygame.K_UP]:rect1.y -= 2if keys[pygame.K_DOWN]:rect1.y += 2for event in pygame.event.get():# 点击窗口关闭按钮,退出游戏if event.type == pygame.QUIT:running = False # 结束主循环pygame.quit() # 退出Pygameexit()pygame.display.update()

简单的特效就能提升游戏质感,比如角色受伤时屏幕闪烁、游戏结束时屏幕渐变变黑,不用复杂的算法,Pygame就能实现。
# 示例1:屏幕闪烁(角色受伤时)if is_hurt: # 假设is_hurt是判断角色是否受伤的变量# 绘制半透明黑色矩形,覆盖整个屏幕,实现闪烁效果flash_surface = pygame.Surface((400, 300))flash_surface.set_alpha(100) # 透明度(0-255,越小越透明)flash_surface.fill((0, 0, 0))screen.blit(flash_surface, (0, 0))# 示例2:颜色渐变(背景渐变)# 从蓝色渐变到白色,逐行绘制for y in range(300):# 计算每一行的颜色(R,G,B),y越大,蓝色越浅,白色越深color = (y//2, y//2, 255 - y//2)pygame.draw.line(screen, color, (0, y), (400, y)) # 绘制每一行
一个完整的游戏,应该有“开始界面→游戏界面→结束界面”,用Pygame可以轻松实现场景切换,让游戏更完整。
# 定义场景状态(0=开始界面,1=游戏界面,2=结束界面)scene = 0while running:if scene == 0: # 开始界面screen.fill((255, 255, 255)) # 白色背景# 绘制开始按钮、游戏标题font = pygame.font.SysFont("微软雅黑", 36)title = font.render("贪吃蛇游戏", True, (255,0,0))start_btn = pygame.Rect(150, 200, 100, 50)pygame.draw.rect(screen, (0,255,0), start_btn)start_text = font.render("开始游戏", True, (0,0,0))screen.blit(title, (100, 100))screen.blit(start_text, (160, 210))# 点击开始按钮,切换到游戏界面for event in pygame.event.get():if event.type == pygame.MOUSEBUTTONDOWN:if start_btn.collidepoint(event.pos):scene = 1elif scene == 1: # 游戏界面# 游戏逻辑(贪吃蛇移动、吃食物、碰撞检测等)screen.fill((0,0,0))# ... 游戏核心代码 ...elif scene == 2: # 结束界面screen.fill((0,0,0))font = pygame.font.SysFont("微软雅黑", 36)game_over = font.render("游戏结束!", True, (255,0,0))restart_btn = pygame.Rect(150, 200, 100, 50)pygame.draw.rect(screen, (0,255,0), restart_btn)restart_text = font.render("重新开始", True, (0,0,0))screen.blit(game_over, (120, 100))screen.blit(restart_text, (155, 210))# 点击重新开始,切换回游戏界面for event in pygame.event.get():if event.type == pygame.MOUSEBUTTONDOWN:if restart_btn.collidepoint(event.pos):scene = 1pygame.display.update()
看完上面的内容,我们来实战一下——用Pygame写一个简单的打方块游戏,整合基础用法和进阶操作,新手也能跟着写!
核心逻辑:用键盘左右移动挡板,接住下落的方块,接住一个得1分,没接住则游戏结束。
import pygameimport random# 初始化Pygamepygame.init()screen = pygame.display.set_mode((400, 500))pygame.display.set_caption("打方块小游戏")clock = pygame.time.Clock()# 定义颜色WHITE = (255,255,255)BLUE = (0,0,255)RED = (255,0,0)# 挡板设置paddle = pygame.Rect(150, 450, 100, 10)paddle_speed = 8# 方块设置block = pygame.Rect(random.randint(0, 350), 0, 50, 50)block_speed = 5# 分数score = 0font = pygame.font.SysFont("Times New Roman", 24)running = Truegame_over = Falsewhile running:screen.fill(WHITE) # 白色背景if not game_over:# 1. 事件处理(移动挡板)keys = pygame.key.get_pressed()if keys[pygame.K_LEFT] and paddle.left > 0:paddle.x -= paddle_speedif keys[pygame.K_RIGHT] and paddle.right < 400:paddle.x += paddle_speed# 2. 方块下落block.y += block_speed# 方块落地,游戏结束if block.bottom > 500:game_over = True# 3. 碰撞检测(挡板接住方块)if paddle.colliderect(block):block.y = 0 # 方块回到顶部block.x = random.randint(0, 350) # 随机位置score += 1 # 得分+1block_speed += 1 # 速度加快,增加难度# 绘制挡板和方块pygame.draw.rect(screen, BLUE, paddle)pygame.draw.rect(screen, RED, block)# 绘制分数score_text = font.render(f"Scores: {score}", True, BLUE)screen.blit(score_text, (10, 10))else:# 游戏结束界面game_over_text = font.render(f"Game Over! Final score: {score}", True, RED)restart_text = font.render("Press SPACE to start again~", True, BLUE)screen.blit(game_over_text, (50, 200))screen.blit(restart_text, (70, 250))# 按空格键重新开始keys = pygame.key.get_pressed()if keys[pygame.K_SPACE]:game_over = Falsescore = 0block = pygame.Rect(random.randint(0, 350), 0, 50, 50)block_speed = 5# 关闭窗口for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsepygame.display.update()clock.tick(60)pygame.quit()

❌ 坑1:图片/音效路径错误 → 建议将图片、音效文件和代码放在同一文件夹,避免使用中文路径;
❌ 坑2:窗口卡住不动 → 忘记写pygame.display.update(),或者主循环中没有处理事件;
❌ 坑3:动画太快/太慢 → 用clock.tick(帧率)控制,一般60帧率比较合适;
❌ 坑4:中文显示乱码 → 字体设置为“微软雅黑”“宋体”等支持中文的字体,避免默认字体;
✅ 小技巧:遇到问题时,打印调试信息(比如print(rect1.pos)),快速定位错误。