在 Python 的编程世界里,海龟绘图(Turtle Graphics)是一个广受欢迎的教学工具,它以直观的方式帮助初学者理解编程逻辑和图形绘制。今天,我们将使用海龟绘图和 FreeGames 库开发一个简单而有趣的射击游戏——炮弹打靶,探索如何在游戏中实现物理模拟和用户交互。
🎯 想象一下:点击屏幕发射炮弹,击中移动的蓝色靶心...
这款射击游戏的基本玩法是:玩家通过点击屏幕发射红色炮弹,目标是击中从右侧向左移动的蓝色靶心。游戏模拟了真实世界的重力效果,使得炮弹的轨迹呈现抛物线形状。随着游戏进行,靶心会不断生成并移动,增加游戏的挑战性。
下面是完整的游戏实现代码:
from random import randrange
from turtle import *
from freegames import vector
# 游戏状态变量
ball = vector(-200, -200) # 炮弹初始位置
speed = vector(0, 0) # 炮弹速度向量
targets = [] # 存储所有活动目标
def tap(x, y):
"""响应屏幕点击,发射炮弹"""
if not inside(ball): # 确保只有当炮弹不在屏幕内时才能发射新炮弹
ball.x = -199
ball.y = -199
# 根据点击位置计算炮弹的初始速度
speed.x = (x + 200) / 25
speed.y = (y + 200) / 25
def inside(xy):
"""判断坐标是否在游戏屏幕范围内"""
return -200 < xy.x < 200 and -200 < xy.y < 200
def draw():
"""绘制游戏元素:炮弹和目标"""
clear() # 清除当前屏幕上的所有图形
# 绘制所有目标(蓝色圆点)
for target in targets:
goto(target.x, target.y)
dot(20, 'blue')
# 如果炮弹在屏幕内,则绘制炮弹(红色圆点)
if inside(ball):
goto(ball.x, ball.y)
dot(6, 'red')
update() # 更新屏幕显示
def move():
"""游戏主循环:更新游戏状态,移动炮弹和目标,检测碰撞"""
# 随机生成新目标(概率为1/40)
if randrange(40) == 0:
y = randrange(-150, 150) # 随机生成目标的垂直位置
target = vector(200, y) # 在屏幕右侧生成新目标
targets.append(target)
# 移动所有目标(向左移动)
for target in targets:
target.x -= 0.5
# 更新炮弹位置和速度(受重力影响)
if inside(ball):
speed.y -= 0.35 # 重力加速度,使炮弹轨迹呈抛物线
ball.move(speed) # 根据当前速度移动炮弹
# 检测碰撞:如果炮弹与目标距离小于13像素,则认为击中目标
dupe = targets.copy()
targets.clear()
for target in dupe:
if abs(target - ball) > 13: # 未击中的目标继续保留
targets.append(target)
draw() # 重绘游戏元素
# 检查是否有目标移出屏幕,如果有则游戏结束
for target in targets:
if not inside(target):
return
# 每50毫秒调用一次move函数,实现游戏循环
ontimer(move, 50)
# 游戏初始化设置
setup(420, 420, 370, 0) # 设置游戏窗口大小和位置
hideturtle() # 隐藏海龟图标
up() # 抬起画笔,移动时不绘制轨迹
tracer(False) # 关闭自动刷新,提高绘制效率
onscreenclick(tap) # 设置屏幕点击事件处理函数
move() # 启动游戏循环
done() # 保持窗口打开,直到用户关闭
这个射击游戏的实现融合了几个关键编程概念:
vector类表示位置和速度,简化了物理计算tap()函数处理鼠标点击事件onscreenclick()方法将点击事件绑定到处理函数move()函数作为游戏的主循环,负责更新游戏状态ontimer()实现定时调用,创造平滑的动画效果tracer(False)和update()控制屏幕刷新,提高性能原代码提供了游戏的基本框架,我们可以通过以下几个方向进行扩展:
🚀 现在,你已经了解了游戏的核心原理,尝试运行代码并体验射击乐趣吧!
通过实现这些扩展,游戏将变得更加富有挑战性。这个项目不仅展示了如何使用海龟绘图创建简单游戏,还涉及了物理模拟、事件处理和游戏循环等核心概念,是学习 Python 游戏开发的理想实践案例。
你可以直接运行这段代码体验游戏,也可以尝试实现上述改进建议,进一步完善这款射击游戏!