运用Python做弹球小游戏

概要

这个简单的弹球游戏包括以下元素:

  • 一个会移动的挡板(使用键盘左右键控制)。
  • 一个弹球,它会在碰到屏幕边界时反弹。
  • 游戏主循环,用于处理事件、更新游戏状态和绘制图形。

整体架构流程

代码解析

1.创建游戏画布

导入工具包tkinterrandomtime

from tkinter import
import random
import time
2.创建球类

这段代码定义了一个Ball类,它包含以下属性和方法:

  • __init__方法:这是类的构造函数,用于初始化球的属性。
  • self.canvas:存储传入的Tkinter画布对象。
  • self.paddle:存储传入的挡板对象。
  • self.id:存储球在画布上的唯一标识符。
  • self.xself.y:存储球的水平和垂直速度。
  • self.canvas_heightself.canvas_width:存储画布的高度和宽度。
  • self.hit_bottom:一个布尔值,用于标记球是否已经触底。
class Ball:
    def __init__(self, canvas, paddle, color):
        self.canvas = canvas
        self.paddle = paddle
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        
        starts = [-3, -2, -1, 1, 2, 3]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -3
        
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()
        self.hit_bottom = False
3.加上球拍(创建一个球拍)

1.调用了create_rectangle,而且把长方形移到坐标200,300

4.让球拍移动(用事件绑定来把左右方向键定到paddle类的新函数)

2.把 Paddle 类中的画数tum_left 绑定到左方向键。 然后我们把函数 tum right 绑定到右方向键。

class Paddle:
    def __init__(self, canvas, color):
        self.canvas = canvas
        # 创建挡板,初始位置在(0, 0),大小为100x10,填充颜色为指定颜色
        self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
        # 将挡板移动到画布上的(200, 300)位置
        self.canvas.move(self.id, 200, 300)
        # 初始化挡板的水平移动速度为0
        self.x = 0
        # 获取画布的宽度并存储
        self.canvas_width = self.canvas.winfo_width()
        # 绑定键盘按键,当按下左箭头键时调用turn_left方法,按下右箭头键时调用turn_right方法
        self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)

    def turn_left(self, event):
        # 挡板向左移动的逻辑
        self.x = -3  # 设置挡板向左移动的速度

    def turn_right(self, event):
        # 挡板向右移动的逻辑
        self.x = 3  # 设置挡板向右移动的速度
5.球体碰撞墙壁弹回 

if语句用于检测球是否触及窗口的边界,并相应地反转球的速度方向:

  • if pos[1] <= 0:检查球的上边缘是否触及或超过窗口的顶部。
  • if pos[3] >= self.canvas_height:检查球的下边缘是否触及或超过窗口的底部。
  • if pos[0] <= 0:检查球的左边缘是否触及或超过窗口的左侧。
  • if pos[2] >= self.canvas_width:检查球的右边缘是否触及或超过窗口的右侧。
def draw(self):
    # 移动球,根据self.x和self.y的速度
    self.canvas.move(self.id, self.x, self.y)

    # 获取球的当前位置
    pos = self.canvas.coords(self.id)

    # 如果球的上边缘超过了窗口的顶部,反转球的垂直速度
    if pos[1] <= 0:
        self.y = 3

    # 如果球的下边缘触及或超过窗口的底部,设置self.hit_bottom为True
    if pos[3] >= self.canvas_height:
        self.hit_bottom = True

    # 如果球碰到挡板,反转球的垂直速度
    if self.hit_paddle(pos) == True:
        self.y = -3

    # 如果球的左边缘超过了窗口的左侧,反转球的水平速度
    if pos[0] <= 0:
        self.x = 3

    # 如果球的右边缘触及或超过窗口的右侧,反转球的水平速度
    if pos[2] >= self.canvas_width:
        self.x = -3
6.增加输赢因数

        进入一个无限循环,这是游戏持续运行的关键。

        假设小球还没有碰到底部,代码会让小球和球拍一直移动,正如在if语句中看到的一样。只有在小球没有触及底端时才会移动小球和球拍。当小球和球拍停止运动时游戏就结束.


while True:  # 无限循环,是游戏主循环的标志
    if ball.hit_bottom == False:  # 检查球是否触底
        ball.draw()  # 调用ball的draw方法来更新球的位置
        paddle.draw()  # 调用paddle的draw方法来更新挡板的位置
    
    tk.update_idletasks()  # 更新Tkinter的闲置任务,如事件处理
    tk.update()  # 更新Tkinter的UI界面
    
    time.sleep(0.01)  # 暂停0.01秒,用于控制游戏循环的速度

 小结

通过以上步骤,你可以创建一个基本的弹球小游戏。快点来试一试吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你我哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值