目录

Python游戏开发反弹球内附完整代码

Python游戏开发:反弹球(内附完整代码)

https://i-blog.csdnimg.cn/direct/254e2a729b8e49ffb58f0b685faae37e.gif#pic_center

反弹球是一个简单的物理模拟游戏,玩家需要通过点击屏幕来控制一个小球反弹,以避开不断移动的目标。游戏的背景设定在一个抽象的空间中,小球和目标都在一个二维平面上移动,玩家的目标是尽可能长时间地保持小球在屏幕内。

一、游戏实现

这个游戏使用Python语言编写,利用了turtle图形库来创建图形界面,以及freegames库中的vector类来处理向量运算。游戏的实现主要分为以下几个步骤:

**初始化游戏变量和界面。

定义游戏逻辑和物理规则。

绘制游戏界面和元素。

响应用户输入和更新游戏状态。

循环执行游戏逻辑。**

二、实现步骤

1.导入模块与初始化

首先,我们需要导入必要的Python模块,并初始化游戏的基本设置。

from random import randrange
from turtle import *
from freegames import vector

# 初始化小球的位置和速度
ball = vector(-200, -200)
speed = vector(0, 0)
# 初始化目标列表
targets = []
  • from random import randrange 导入随机数生成函数。
  • from turtle import * 导入Turtle图形库,用于绘制游戏界面。
  • from freegames import vector 导入向量类,用于处理小球和目标的位置和速度。

2.游戏界面设置

接下来,设置游戏界面的大小和隐藏Turtle图形。

setup(420, 420, 370, 0)
hideturtle()
up()
tracer(False)
  • setup(420, 420, 370, 0) 设置画布大小和初始位置。

  • hideturtle() 隐藏Turtle图形,因为游戏不需要显示绘制工具。

  • up() 抬起画笔,移动时不绘制线条。

  • tracer(False) 关闭动画更新,以提高绘制效率。

    https://i-blog.csdnimg.cn/direct/c112e98159504cd9b059d1a20efcfe7f.png

3.屏幕点击事件处理

定义一个函数来响应屏幕点击事件,更新小球的位置和速度。

def tap(x, y):
    """响应屏幕点击,重置小球位置和速度。"""
    if not inside(ball):
        ball.x = -199
        ball.y = -199
        speed.x = (x + 200) / 25
        speed.y = (y + 200) / 25
  • tap 函数通过参数 xy 接收点击位置。
  • inside(ball) 检查小球是否在屏幕内。
  • 如果小球不在屏幕内,重置小球位置,并根据点击位置计算速度。

4.判断小球是否在屏幕内

定义一个函数来判断给定的坐标是否在屏幕内。

def inside(xy):
    """判断给定坐标是否在屏幕内。"""
    return -200 < xy.x < 200 and -200 < xy.y < 200
  • inside 函数通过参数 xy 接收坐标。
  • 返回值表示坐标是否在屏幕内。

5.绘制游戏界面

定义一个函数来绘制小球和目标。

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()
  • clear() 清除屏幕。

  • goto(target.x, target.y) 移动画笔到目标位置。

  • dot(20, 'blue') 绘制蓝色目标点。

  • goto(ball.x, ball.y) 移动画笔到小球位置。

  • dot(6, 'red') 绘制红色小球。

  • update() 更新屏幕显示。

    https://i-blog.csdnimg.cn/direct/0b9e0c61affa416cb70c9d673aa583fa.png

6.移动小球和目标

定义一个函数来移动小球和目标,并更新游戏状态。

def move():
    """移动小球和目标,更新游戏状态。"""
    # 随机生成新目标
    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)

    # 检查并更新目标列表
    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

    # 定时调用move函数,更新游戏状态
    ontimer(move, 50)
  • randrange(40) 随机生成新目标的条件。
  • target.x -= 0.5 目标向左移动。
  • speed.y -= 0.35 小球向下加速,模拟重力。
  • ball.move(speed) 更新小球位置。
  • abs(target - ball) > 13 判断目标是否被击中。
  • ontimer(move, 50) 每50毫秒调用一次 move 函数,实现游戏循环。

7.游戏主循环

最后,设置屏幕点击事件的回调函数,并启动游戏循环。

onscreenclick(tap)
move()
done()
  • onscreenclick(tap) 设置屏幕点击事件的回调函数。
  • move() 启动游戏循环。
  • done() 结束游戏,保持最后的画面。

通过以上代码解析,我们可以看到反弹球游戏的实现涉及到了随机数生成、事件处理、物理模拟和图形绘制等多个方面。

三、效果展示

https://i-blog.csdnimg.cn/direct/254e2a729b8e49ffb58f0b685faae37e.gif#pic_center

四、完整代码及注释

from random import randrange  # 导入随机数生成函数
from turtle import *  # 导入Turtle图形库,用于绘制游戏界面
from freegames import vector  # 导入向量类,用于处理小球和目标的位置和速度

# 初始化小球的位置和速度
ball = vector(-200, -200)  # 小球的初始位置
speed = vector(0, 0)  # 小球的初始速度

# 初始化目标列表,用于存储目标的位置
targets = []

# 设置游戏界面的大小和初始位置
setup(420, 420, 370, 0)  # 画布大小和初始位置
hideturtle()  # 隐藏Turtle图形
up()  # 抬起画笔,移动时不绘制线条
tracer(False)  # 关闭动画更新,以提高绘制效率

# 定义屏幕点击事件处理函数
def tap(x, y):
    """响应屏幕点击事件,重置小球位置和速度。"""
    if not inside(ball):  # 如果小球不在屏幕内
        ball.x = -199  # 重置小球的x坐标
        ball.y = -199  # 重置小球的y坐标
        speed.x = (x + 200) / 25  # 根据点击位置计算小球的x方向速度
        speed.y = (y + 200) / 25  # 根据点击位置计算小球的y方向速度

# 定义判断小球是否在屏幕内的函数
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')  # 绘制蓝色目标点,半径为20
    if inside(ball):  # 如果小球在屏幕内
        goto(ball.x, ball.y)  # 移动画笔到小球位置
        dot(6, 'red')  # 绘制红色小球,半径为6
    update()  # 更新屏幕显示

# 定义移动小球和目标的函数
def move():
    """移动小球和目标,更新游戏状态。"""
    # 随机生成新目标
    if randrange(40) == 0:  # 每40帧有1帧的概率生成新目标
        y = randrange(-150, 150)  # 目标的y坐标随机生成
        target = vector(200, y)  # 新目标的x坐标固定为200
        targets.append(target)  # 将新目标添加到目标列表

    # 移动现有目标
    for target in targets:  # 遍历目标列表
        target.x -= 0.5  # 目标向左移动

    # 更新小球位置和速度
    if inside(ball):  # 如果小球在屏幕内
        speed.y -= 0.35  # 小球向下加速,模拟重力
        ball.move(speed)  # 更新小球位置

    # 检查并更新目标列表
    dupe = targets.copy()  # 复制当前目标列表
    targets.clear()  # 清空当前目标列表
    for target in dupe:  # 遍历复制的目标列表
        if abs(target - ball) > 13:  # 如果目标与小球的距离大于13
            targets.append(target)  # 将目标添加回目标列表

    # 绘制更新后的游戏界面
    draw()

    # 检查是否有目标移出屏幕
    for target in targets:  # 遍历目标列表
        if not inside(target):  # 如果目标不在屏幕内
            return  # 停止移动函数

    # 定时调用move函数,更新游戏状态
    ontimer(move, 50)  # 每50毫秒调用一次move函数

# 设置屏幕点击事件的回调函数,并启动游戏循环
onscreenclick(tap)  # 设置屏幕点击事件的回调函数
move()  # 启动游戏循环
done()  # 结束游戏,保持最后的画面