用python编写一个弹球游戏

用python编写一个简单的弹球游戏

这是学习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('<KeyPress-Left>', self.turn_left)#把按键和球拍类左右键分别进行绑定
        self.canvas.bind_all('<KeyPress-Right>', 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自己休息的时间,可以理解为一直画图的时候,间隔时间

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章