文章目录
概要
这个简单的弹球游戏包括以下元素:
- 一个会移动的挡板(使用键盘左右键控制)。
- 一个弹球,它会在碰到屏幕边界时反弹。
- 游戏主循环,用于处理事件、更新游戏状态和绘制图形。
整体架构流程
代码解析
1.创建游戏画布
导入工具包tkinter、random、time
from tkinter import
import random
import time
2.创建球类
这段代码定义了一个Ball
类,它包含以下属性和方法:
__init__
方法:这是类的构造函数,用于初始化球的属性。self.canvas
:存储传入的Tkinter画布对象。self.paddle
:存储传入的挡板对象。self.id
:存储球在画布上的唯一标识符。self.x
和self.y
:存储球的水平和垂直速度。self.canvas_height
和self.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秒,用于控制游戏循环的速度
小结
通过以上步骤,你可以创建一个基本的弹球小游戏。快点来试一试吧!