用python编写一个弹球游戏

2023-11-03

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

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

用python编写一个弹球游戏 的相关文章

随机推荐

  • 100决杀

    1 所有的困苦都是有用意的 这是老天爷在磨练你 为了把重任交给你 2 毛遂自荐 好处多多 让别人看到你 知道你的存在 知道你的能力 3 千万别入错行 人情有牵绊 恩怨的纠葛 转行可不是那幺容易的呀 4 别轻易转行 转行的风险很林 若无大决心
  • MATLAB代码:微电网两阶段鲁棒优化经济调度程序 关键词:微网优化调度 两阶段鲁棒 CCG算法 经济调度

    MATLAB代码 微电网两阶段鲁棒优化经济调度程序 关键词 微网优化调度 两阶段鲁棒 CCG算法 经济调度 仿真平台 MATLAB YALMIP CPLEX 主要内容 构建了微网两阶段鲁棒调度模型 建立了min max min 结构的两阶段
  • STM32学习笔记:串口一键下载电路(CH340)的理解

    如图 为原子的串口下载电路 在CH340的数据手册上有引脚的介绍以及作用 这两个引脚 DTR 和RTS 都是 输出类型 MCUISP 一键下载工具 会控制CH340这两个引脚的高低电平状态 通过控制DTR 和RST 这两个引脚的高低电平状态
  • 897. 最长公共子序列 线性dp

    给定两个长度分别为 N 和 M 的字符串 A 和 B 求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少 输入格式 第一行包含两个整数 N 和 M 第二行包含一个长度为 N 的字符串 表示字符串 A 第三行包含一个长度为 M 的字
  • 计算机键盘换挡键,电脑键盘上的换挡键是哪个

    Esc 退出键 英文Escape 的缩写 中文意思是逃脱 出口等 在电脑的应用中主要的作用是退出某个程序 例如 我们在玩游戏的时候想退出来 就按一下这个键 Tab 表格键 可能大家比较少用这一个键 它是Table的缩写 中文意思是表格 在电
  • windows nignx 常用操作命令(启动、停止、重启服务)

    文章目录 1 查看nginx 版本号 2 根据名称查询 window 下的nginx 的启动进程 3 再根据端口号查询进程 4 启动nginx 命令 5 停止nginx 6 快速停止或关闭Nginx 7 正常停止或关闭Nginx 8 配置文
  • Open3D Ransac拟合分割多个球体

    目录 一 算法原理 二 代码实现 三 结果展示 四 测试数据 一 算法原理 算法的核心原理还是RANSAC拟合球面 具体理论可参考 Open3D RANSAC三维点云球面拟合 只是对代码稍加修改使其适用于分割点云数据中的多个球体 二 代码实
  • 回归平方和 ESS,残差平方和 RSS,总体平方和 TSS

    https zhidao baidu com question 565190261749684764 html 回归平方和 ESS 残差平方和 RSS 总体平方和 TSS 总变差 TSS 被解释变量Y的观测值与其平均值的离差平方和 总平方和
  • 5.12 数据结构——哈夫曼编码

    在远程通讯中 要将待传字符转换成二进制的字符串 假设要传输的字符为 ABACCDA 若编码为 A 00 B 01 C 10 D 11 那么要传输的字符的编码为 00010010101100 若将编码设计为长度不等的二进制编码 即让待传字符串
  • 基于深度学习的人脸表情识别(一)

    第一篇博客就不用Markdown 什么鬼 来写了 今天主要是被老板一通说 然后说两月看10篇paper 算了 还是丫丫自己先多码码论文吧 再加之这几天有开博的想法 就索性一起开了 顺道总结下最近看的一篇中文的 Facial Expressi
  • 【CPU】常见术语解释

    interrupt service routine ISR 中断服务程序 中断 指当CPU正在处理某件事情时 外部发生的某一事件 如一个电平的变化 一个脉冲沿的发生或 定时器计数溢出等 请求CPU迅速去处理 于是CPU暂时中止当前的工作 转
  • 【机器学习基础】Python机器学习入门指南(全)

    前言 机器学习 作为人工智能领域的核心组成 是计算机程序学习数据经验以优化自身算法 并产生相应的 智能化的 建议与决策的过程 一个经典的机器学习的定义是 A computer program is said to learn from ex
  • 计算机转换汉子英语,中英文切换(电脑怎么切换拼音打字)

    在打字时需要输入英文怎么切换 用搜狗等各类拼音法的话 不用切换就可自由地 中英 非常简单 没有人不知道吧 方法是 汉字状态时 按回车键就是英文字母 此时按空格键是汉字 谁能告诉我小键盘旁边 也就是全角和半角的旁边的中文和英文符号 切换的 c
  • vue-element-admin/template登录Request failed with status code 405

    问题 vue element admin vue admin template 登录不上 报错Request failed with status code 405 解决 main js的开发配置production修改为开发模式 deve
  • opencv 识别长方形_使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码 供大家参考 具体内容如下 前言 1 OpenCV没有内置的矩形检测的函数 如果想检测矩形 要自己去实现 2 我这里使用的OpenCV版本是3 30 矩形检测 1 得到原始图像之后 代
  • shell基础语法

    1 变量 语法 变量名 变量值 PS 两边不能有空格 1 使用变量 变量名 ex Name wendy 声明变量 echo Name 或 echo Name 输出变量 ps 花括号可选 2 只读变量 readonly 变量 3 删除变量 u
  • maven明明本地仓库有依赖包,还会远程下载的问题

    我今天在无网的环境下 打算进行maven编译打包 可是明明有本地仓库 也配置了本地仓库 但是还是会从远程下载 然后再各大网友的帮助下 百度 谷歌 查询到主要的原因是在本地仓库的每个依赖包都存在 remote repositories文件 直
  • layui多文件上传与下载示例

    第一次写文件上传 不知道怎么下手 幸好有万能layui 方便了很多 HTML div class layui body header span class layui body header title 产品文件上传 span div di
  • 对话用友网络副总裁、用友大易创始合伙人石磊:新的人力资源红利时代已经到来

    数科星球原创 作者丨苑晶 编辑丨十里香 在这个日新月异的科技时代 无论是企业还是个人 拥抱先进的技术工具以及前沿的思维成为建立差异化优势 取得长期价值的不二法门 在真实的场景中 企业内部的管理状况更为复杂 2023年 在全行业跑步奔向增长之
  • 用python编写一个弹球游戏

    用python编写一个简单的弹球游戏 这是学习python时用来练习的一个项目 作为笔记 最终是实现一个简单的弹球游戏 效果图如下 源代码 无限命版的弹球游戏python代码 from tkinter import 来源于python的标准