这是学习python时用来练习的一个项目,作为笔记。
最终是实现一个简单的弹球游戏,效果图如下:
#无限命版的弹球游戏python代码
from tkinter import * # 来源于python的标准库,GUI
import random
import time
# 创建Ball类,对小球进行定义
class Ball:
def __init__(self, canvas, paddle, color): # 初始化函数
self.canvas = canvas # 把对象变量canvas赋值给对象变量canvas
self.paddle = paddle #把对象变量赋值给paddle
self.id = canvas.create_oval(10, 10, 25, 25, fill=color) # 函数creat_oval返回的是创建目标的ID
self.canvas.move(self.id, 245, 100) # 移动小球到画布中心
starts = [-3, -2, -1, 1, 2, 3] # 定义一个列表存初始速度
random.shuffle(starts) # 把列表里面的数随机排列
self.x = starts[0] # 取列表中的第一个数
self.y = -3 # 把小球向上的速度变为3,初始的合速度变大
self.canvas_height = self.canvas.winfo_height() # 获取当前画布高度并赋值给对象变量canvas_height
self.canvas_width = self.canvas.winfo_width()
self.hit_bottom = False
def hit_paddle(self, pos): #定义弹球击打操作,当两个图像有相交时返回true,否则false
paddle_pos = self.canvas.coords(self.paddle.id)
if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
if paddle_pos[1] <= pos[3] <= paddle_pos[3]:
return True
return False
#在画布上按照定义的要求画出小球
def draw(self):
self.canvas.move(self.id, self.x, self.y) # 使小球移动,画布上move函数的调用,传入的参数是x,y
pos = self.canvas.coords(self.id) # 创建变量并将画布函数coords赋值给pos,通过圆的ID返回一个列表,4个数分别是左上角和右下角的坐标
if pos[1] <= 0:#列表pos中0和1的位置是圆的左上方的坐标,2和3的位置是右下方的坐标
self.y = 4 # 更改数字可以实现小球的不同方向的变速
if pos[3] >= self.canvas_height:
# self.hit_bottom = True #如果想实现小球到画布底端就gameover可以加上这行,同时注释掉下一行
self.y = -4
if self.hit_paddle(pos) == True:#实现球与球拍接触时反弹
self.y = -4
if pos[0] <= 0:
self.x = 4
if pos[2] >= self.canvas_width:
self.x = -4
# 创建球拍类
class Paddle:
def __init__(self, canvas, color):
self.canvas = canvas #和球类类似,先传入画布对象变量
self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
self.canvas.move(self.id, 200, 300)#游戏开始时设置球拍在初始位置
self.x = 0
self.canvas_width = self.canvas.winfo_width()#设置球拍左右的移动范围
self.canvas.bind_all('' , self.turn_left)#把按键和球拍类左右键分别进行绑定
self.canvas.bind_all('' , self.turn_right)
def draw(self): #在画布上画出球拍
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
if pos[0] <= 0:#这两个if语句用来设置球拍边界
self.x = 0
elif pos[2] >= self.canvas_width:
self.x = 0
#定义左右键函数
def turn_left(self, evt):
self.x = -5#改变数值可以实现球拍灵活度的改变
def turn_right(self, evt):
self.x = 5
# 创建游戏画布
tk = Tk() # 创建tk对象
tk.title("变速版弹球游戏") # 使用tk对象中的title函数给窗口加标题
tk.resizable(0, 0) # 使窗口大小在水平和垂直方向上都不可以改变
tk.wm_attributes("-topmost", 1) # 把包含我们画布的窗口放到所有其他窗口之前
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) # bd=0是确保在画布之外没有边框
canvas.pack() # 让画布按照前一行给出的宽度和高度参数来调整其自身大小
tk.update() # 让tkinter为游戏中的动画做好初始化
paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle, 'red') # 创建一个Ball类的对象
while 1: # 动画循环,让tkinter一直画图
if ball.hit_bottom == False:#如果球没有被接到,gameover
ball.draw()
paddle.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01) # 循环一次,python自己休息的时间,可以理解为一直画图的时候,间隔时间