一笑师兄:
用实战、趣味、精炼的大白话讲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
游戏需要记录玩家坚持了多长时间,我们添加一个计时功能:
# 更新游戏时间
pen_t.clear()
t2 = time.time()
t = round((t2-t1),1)
pen_t.write(f"{t}", align = "center", font=("宋体",20))
这是游戏的核心功能,我们需要检测玩家是否与敌人发生碰撞:
# 检测玩家与敌人的碰撞
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
# 在game_loop函数中添加
speed_factor = 1 + t / 10# 每10秒速度增加10%
vx = vx * speed_factor
vy = vy * speed_factor
# 在碰撞检测后添加
score = int(t * 10) # 每秒10分
pen_score.clear()
pen_score.write(f"得分: {score}", align="right", font=("宋体",16))
import winsound # Windows系统
# 或
import pygame # 跨平台
# 碰撞时播放音效
winsound.PlaySound("collision.wav", winsound.SND_ASYNC)
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,
你的点赞,是我知道你在的最好方式 ❤️
想学什么?卡在哪?欢迎留言告诉我!