当前位置:首页>python>【Python小游戏实战】连载2:逃跑--躲避方块!添加碰撞检测与完整游戏逻辑

【Python小游戏实战】连载2:逃跑--躲避方块!添加碰撞检测与完整游戏逻辑

  • 2026-10-07 13:03:22
【Python小游戏实战】连载2:逃跑--躲避方块!添加碰撞检测与完整游戏逻辑

一笑师兄:
用实战、趣味、精炼的大白话讲Python
做Python初学者的引路之光 【Python小游戏实战】连载2:逃跑--躲避方块!添加碰撞检测与完整游戏逻辑

在上一期教程中,我们完成了"逃跑"游戏的基础框架,实现了窗口创建、玩家控制和敌人方块的初始化。

【Python小游戏实战】连载1:逃跑--躲避方块!附源代码和视频讲解

今天我们继续完善这个游戏,添加敌人移动逻辑、碰撞检测、计时系统和游戏结束判定,打造一个完整可玩的小游戏!

一、游戏逻辑完善

首先,我们需要定义游戏的主循环函数,这是游戏运行的核心:

defgame_loop():
    width = window_width()
    height = window_height()

for i in list_enmey:
        e, s1, s2, vx, vy = i
        x,y = e.position()  #获取当前角色所在的位置
        x += vx
        y += vy

# 屏幕边界检测
        left = -width/2+10*s2
        right = width/2-10*s2
        top = height/2-10*s1
        bottom = -height/2+10*s1

# 碰到边界反弹
if x = right:
            vx = -vx
            x = right
if y >= top:
            vy = -vy
            y = top
if y = right:
            vx = -vx
            x = right
if y >= top:
            vy = -vy
            y = top
if y <= bottom:
            vy = -vy
            y = bottom

        e.goto(x,y)
        i[-1] = vy
        i[-2] = vx

代码解析:

  • 首先获取窗口大小,这使游戏可以适应不同尺寸的屏幕
  • 遍历所有敌人方块,更新它们的位置
  • 实现了智能边界检测,计算出每个敌人方块能移动的边界
  • 当敌人碰到边界时,会改变移动方向(vx, vy取反),实现反弹效果
  • 更新敌人位置后,保存新的速度值,为下一帧做准备

二、添加计时系统

游戏需要记录玩家坚持了多长时间,我们添加一个计时功能:

# 更新游戏时间
pen_t.clear()
t2 = time.time()
t = round((t2-t1),1)
pen_t.write(f"{t}", align = "center", font=("宋体",20))

实现细节:

  • 使用time.time()记录游戏开始时间和当前时间
  • 计算时间差并四舍五入到小数点后一位
  • 使用turtle的write()方法在屏幕顶部显示当前游戏时间
  • 每次循环清除旧的时间显示,更新为新值

三、实现碰撞检测

这是游戏的核心功能,我们需要检测玩家是否与敌人发生碰撞:

# 检测玩家与敌人的碰撞
x1,y1 = player.position()
x,y = e.position()
# AABB 碰撞检测
if abs(x1-x)<(15+s2*10) and abs(y1-y)<(15+s1*10):
    messagebox.showerror("警告",f"你坚持了{t}秒,游戏结束!")
return

碰撞检测原理:

  • 由于我们使用的是方块图形,采用轴对齐包围盒(AABB)碰撞检测算法
  • 通过比较两个方块中心点的x、y坐标差值与它们尺寸之和的一半(代码中的10是每个小方格宽度的一半)
  • 当x方向和y方向的差距都小于各自方向尺寸之和时,判定为碰撞
  • 碰撞发生时,使用messagebox弹出游戏结束提示,显示玩家坚持的时间

五、关键技巧与注意事项

1. 游戏循环优化:

  • 使用w.tracer(0)关闭自动刷新,手动调用w.update()更新画面,大幅提升性能
  • 通过w.ontimer(game_loop, 20)设置游戏帧率,20毫秒约等于50FPS
  • 不能使用while True结合sleep,屏幕可卡顿,没有可玩性

2. 防拖拽事件嵌套:

  • 在md函数中,先解绑再重新绑定拖拽事件,防止事件嵌套导致的异常

3. 智能碰撞检测:

  • 考虑了方块的实际大小,不仅仅是中心点距离
  • 碰撞阈值根据方块尺寸动态计算,确保各种大小的方块都能正确检测碰撞

4. 边界反弹算法:

  • 根据方块大小动态计算边界,避免方块部分移出屏幕
  • 碰撞边界后不仅反弹,还会将位置修正到边界处,防止"卡墙"

六、游戏改进建议

1. 难度递增:随着游戏时间增加,敌人移动速度逐渐加快

# 在game_loop函数中添加
   speed_factor = 1 + t / 10# 每10秒速度增加10%
   vx = vx * speed_factor
   vy = vy * speed_factor

2. 得分系统:增加每秒得分,并在游戏结束时显示

# 在碰撞检测后添加
   score = int(t * 10)  # 每秒10分
   pen_score.clear()
   pen_score.write(f"得分: {score}", align="right", font=("宋体",16))

3. 音效支持:添加碰撞音效和背景音乐

import winsound  # Windows系统
# 或
import pygame   # 跨平台

# 碰撞时播放音效
   winsound.PlaySound("collision.wav", winsound.SND_ASYNC)

4. 暂停功能:添加空格键暂停/继续游戏

      is_paused = False
deftoggle_pause():
global is_paused
       is_paused = not is_paused

   w.onkeypress(toggle_pause, "space")
   w.listen()

# 在game_loop开头添加
if is_paused:
       w.ontimer(game_loop, 20)
return

也可以增加按回车重新开始游戏的设置,比如设置一个is_restart变量
我觉得这个比暂停更加实用一些。

七、结语

游戏开发是一个循序渐进的过程,每一步的积累都很重要,这个游戏我们用到了游戏开发的很多核心功能:

  • 敌人方块的智能移动与边界反弹
  • 精确的碰撞检测系统
  • 游戏计时与结束判定
  • 优化的游戏性能与用户体验

这个项目是一个综合类的趣味练习,不仅用到了Python游戏开发的基础知识,还掌握了游戏循环、碰撞检测、事件处理等游戏开发核心概念。 希望这个教程能激发你对编程的兴趣,期待看到你制作出更加精彩的游戏作品!

视频讲解版,手把手讲解每一步的操作,包括所有程序源代码素材,

详情可扫描二维码,或者文章左下角“阅读原文”:

关于
新手如何系统学习Python?
python实战项目清单等

请先关注 公众号 ,再查看菜单 .

如果此文对你有帮助,请 点个赞 !

我的小目标 --- 帮助到 10000个朋友轻松入门Python,
你的点赞,是我知道你在的最好方式 ❤️
想学什么?卡在哪?欢迎留言告诉我!

最新文章

随机文章