Python 实现弹球游戏

2023-11-06

源代码

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自己休息的时间,可以理解为一直画图的时候,间隔时间

Python3.7运行效果
playing
转载于 2realworld 的博客,原文链接: Python弹球游戏
感谢原文博主!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 实现弹球游戏 的相关文章

随机推荐

  • Scanner对象

    Scanner对象 之前我们学的基本语法中我们没有实现程序和人的交互 但是Java给我们提供了这样一个工具类 我们可以获取用户的输入 java util Scanner是Java5的新特征 我们可以通过Scanner类来获取用户的输入 基本
  • 【电路设计】AD快速敷铜技巧

    推荐一款 求职面试 刷题学习 的神器 点击跳转 快来看看吧 参考帖子 http bbs eeworld com cn forum php mod viewthread tid 465056 建立一个工程 添加原理图和PCB文档 原理图上简单
  • 【C++】类和对象-封装

    目录 属 性 和 行 为 作 为 整 体 封装的意义 封装意义1 设 计 学 生 类 通过实例化对象对属性进行赋值 再使用类的行为 通过行为对属性进行赋值操作 访 问 权 限 struct 和 class 区别 成 员 属 性 私 有 化
  • 这些道理不懂,你注定就是穷打工的命

    看完之后 心里有点小鸡冻 呵呵 言辞有点激烈 顶住 来自世界经理人 同样是打工 为什么你一个月只有2 3K 而唐骏的身价却可以高达10亿 或许你会反驳我 说人人都成为唐骏的概率有多大 的确 人人都成为唐骏的确不现实 但是 经过努力 月薪达到
  • RNN/LSTM循环神经网络讲解

    转自 https zhuanlan zhihu com p 123211148 一 什么是循环神经网络 循环神经网络 Rerrent Neural Network RNN 历史啊 谁发明的都不重要 说了你也记不住 你只要记住RNN是神经网络
  • 给出一百分制成绩,要求输出成绩等级

    给出一百分制成绩 要求输出成绩等级 A B C D E 90分以上为 A 80 90分为 B 70 79分为 C 60 69分为 D 60分以下为 E 使用if语句 我自己的做法 include
  • JavaScript math对象

    今天我们来学习JavaScript的math对象 下面跟我来学习一下吧 Math对象和其他对象不同 它不是一个构造函数 它属于一个工具类不用创建对象 它里面封装了数 学运算相关的属性和方法 例如 Math PI 表示圆周率 约等于3 141
  • 匹配11位手机号码的正则表达式

    最近在做一个即时通讯的项目 首先是注册登录界面 项目需求是通过用户输入的手机号码获取一个4位数的验证码来完成注册 那么 问题来了 如何判断用户输入的手机号码是合法的正确的11位手机号码呢 这些简单的问题就在前端判断好了再post给后台 没必
  • 初级测开面试题分享(有文档)

    今天分享一下测试群友发出的面试 小伙伴可以看看自己能答出来几题 当然答案已经整理好了 直接点击文末小卡片就能领取了 同时 我也为大家准备了一份软件测试视频教程 含面试 接口 自动化 性能测试等 就在下方 需要的可以直接去观看 软件测试视频教
  • linux 删除文件

    http blog csdn net taiyang1987912 article details 41488395 http www 360doc com content 16 0325 23 532901 545276975 shtml
  • 3.5 Makefile的重建

    一 Makefile重建是什么 Makefiles是一种用于构建和维护软件项目的工具 它们是文本文件 包含了一系列规则和指令 告诉计算机如何编译 链接和生成可执行文件 当我们使用make命令时 它会检测当前目录下的makefile文件 并根
  • 【Hello Algorithm】二叉树相关算法

    本篇博客介绍 介绍二叉树的相关算法 二叉树相关算法 二叉树结构 遍历二叉树 递归序 二叉树的交集 非递归方式实现二叉树遍历 二叉树的层序遍历 二叉树难题 二叉树的序列化和反序列化 lc431 求二叉树最宽的层 二叉树的后继节点 谷歌面试题
  • 下载 安装npm nodejs yarn详细步骤

    一 安装nodejs 1 下载NodeJs 点击以下链接进入NodeJs官网 https nodejs org zh cn 其他下载 先前已发布版本 找到自己需要的版本 温馨提示 如果之前电脑有安装过Node js的话建议先把之前的文件删干
  • 【大话QT之四】ctkPlugin插件系统实现项目插件式开发

    插件式开发体会 自开始写 大话QT 系列就开始接触渲染客户端的开发 说是开发不如更多的说是维护以及重构 在接手这块的东西之前自己还有点犹豫 因为之前我一直认为客户端嘛 没什么技术含量 总是想做比较有挑战性的 为了这周总还专门找我谈了谈 算是
  • Hive分区分桶的概念与区别

    一 Hive 数据分区 1 Hive 数据分区的概念 在Hive Select查询中一般会扫描整个表内容 会消耗很多时间做没必要的工作 有时候只需要扫描表中关心的一部分数据 因此建表时引入了partition概念 Hive的分区是为了辅助查
  • elasticsearch-修改IK分词器源码来基于mysql热更新词库

    热更新 每次都是在es的扩展词典中 手动添加新词语 很坑 1 每次添加完 都要重启es才能生效 非常麻烦 2 es是分布式的 可能有数百个节点 你不能每次都一个一个节点上面去修改 es不停机 直接我们在外部某个地方添加新的词语 es中立即热
  • C和C++安全编码笔记:并发

    并发是一种系统属性 它是指系统中几个计算同时执行 并可能彼此交互 一个并发程序通常使用顺序线程和 或 进程的一些组合来执行计算 其中每个线程和进程执行可以在逻辑上并行执行的计算 这些进程和 或 线程可以在单处理器系统上使用分时抢占式的方式
  • 解决"taglib definition not consistent with specification version"

    1 问题描述 从tomcat 6 迁移到tomcat 7 时 运行web项目时出现 taglib definition not consistent with specification version 从上面可以看出 这是taglib的定
  • 相似性度量的方法分类

    相似性度量的方法分类 一 变换域 DTW ERP都是不设置阈值 直接计算其欧氏距离 EDR LCSS都是设置一个绝对阈值 满足阈值变成0或者1 CATS 设置一个阈值 不满足阈值取0 满足阈值缩放到 0 1 区间中 Frechet 不设置阈
  • Python 实现弹球游戏

    源代码 from tkinter import 来源于python的标准库 GUI import random import time 创建Ball类 对小球进行定义 class Ball def init self canvas padd