import random

import time

from tkinter import *

#下面定义一个球的类,有canvas和color两个对象

class Ball: #定义一个Ball类的函数

def __init__(self,canvas,paddle,color):#这是Ball类的属性函数,Ball类下的函数都有这些性质

self.canvas=canvas

self.paddle=paddle

self.id=canvas.create_oval(10,10,25,25,fill=color)#返回所绘小球的调用值放入对象self.id

self.canvas.move(self.id,245,100) #移动小球到(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()#画布高度函数winfo_height()返回值放入canvas_height对象中

self.canvas_width=self.canvas.winfo_width() #winfo_width()返回画布宽度放入canvas_width对象中

self.hit_bottom=False #设定hit_bottom初始值为false

def hit_paddle(self,pos): #声明函数,以供调用

paddle_pos=self.canvas.coords(self.paddle.id) #将球拍的(x1,y1)(x2,y2)的坐标放到paddle_pos中

if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]: #

if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]: #比较小球y轴是否在球拍y轴内

return True #表示小球碰到了球拍

return False #表示小球没有碰到球拍

def draw(self): #声明draw函数,

self.canvas.move(self.id,self.x,self.y) #移动小球,移动速度为(self.x,self.y),在init中的属性可以直接用

pos=self.canvas.coords(self.id)#把小球的左上角和右下角的坐标以列表形式(可能元组)放入pos对象中

if pos[1]<=0: #如果小球碰到画布上方

self.y=3 #则改变移动方向向下方

if pos[3]>=self.canvas_height: #如果小球碰到画布底端 则返回hit_bottom为True

self.hit_bottom=True

if self.hit_paddle(pos)==True: #小球碰到了球拍,则改变Y轴方向向上运动

self.y=-3

if pos[0]<=0: #如果小球碰到了画布左边,则把X轴速度改成每次向右3个像素

self.x=3

if pos[2]>=self.canvas_width: #如果小球碰到了画布右边,则把速度改成每次向左3个像素

self.x=-3

class Paddle: #定义一个paddle类

def __init__(self,canvas,color): #paddle类的属性函数,默认有两个变量画布和颜色

self.canvas=canvas #将canvas对象赋给self.canvas

self.id=canvas.create_rectangle(0,0,100,10,fill=color) #创建球拍,将球拍的调用编号存入self.id

self.canvas.move(self.id,200,300) #将球拍移动到(200,300)处

self.x=0 #

self.canvas_width=self.canvas.winfo_width() #将画布的宽度放入canvas_width对象

self.canvas.bind_all('',self.turn_left) #用bind_all()函数绑定键盘左键与tun_left函数

self.canvas.bind_all('',self.turn_right) #绑定键盘右键与turn_right函数

def draw(self): #声明一个draw函数

self.canvas.move(self.id,self.x,0) #左右移动球拍的速度为self.x,默认不动

pos=self.canvas.coords(self.id) #将球拍的左上角和右下角的坐标存入pos对象中

if pos[0]<=0: #如果球拍x轴小于0,则不再向右移动

self.x=0

elif pos[2]>=self.canvas_width: #如果球拍要超过画布右侧了,则球拍的移动速度变为0

self.x=0

def turn_left(self,evt):#这里的evt是调用方传过来的参数,改变球拍的移动速度向左,

self.x=-5

def turn_right(self,evt): #改变球拍的移动速度向右每次5个像素

self.x=5

#创建框架并且命名和固定,然后创建该框架的画布

tk=Tk() #创建框架对象tk

tk.title('Game') #框架对象tk显示的名字为'game'

tk.resizable(0,0) #固定框架

tk.wm_attributes('-topmost',1) #显示在最外层

canvas=Canvas(tk,width=500,height=400,bd=0,highlightthickness=0) #创建画布canvas,属于tk框架对象,

canvas.pack() #显示画布的变化

tk.update() #显示框架的变化

#把类赋值给对象ball,如果调用了ball就可以实现该类的作用

paddle=Paddle(canvas,"blue") #调用拍的类给对象paddle用

ball=Ball(canvas,paddle,'green') #调用球的类给对象ball用

while True: #要注意while语句以防止死循环,先设置为真

if ball.hit_bottom==False: #没有碰到底部的话执行下面的语句

ball.draw() #调用ball对象的函数draw()

paddle.draw()#调用paddle对象的函数draw()

tk.update_idletasks()

tk.update() #更新框架

time.sleep(0.01) #睡眠0.01秒

elif ball.hit_bottom==True: #要是小球接触了底部

canvas.create_text(200,100,text='Aha,you lose it,\nHow about try again?',font=('Times',22)) #在(200,100)坐标处创建文本‘...',字号22号

tk.update() #更新内容

python小球弹弹弹_python3.6使用tkinter实现弹跳小球游戏相关推荐

  1. python小球弹跳_python3.6使用tkinter实现弹跳小球游戏

    import random import time from tkinter import * #下面定义一个球的类,有canvas和color两个对象 class Ball: #定义一个Ball类的 ...

  2. python小球在窗口弹来弹去_《Python游戏趣味编程》 第2章 弹跳的小球

    知乎视频​www.zhihu.com 图书简介可以看这里:童晶:<Python游戏趣味编程>新书上架了​zhuanlan.zhihu.com Python之所以功能强大,一个原因就是有大量 ...

  3. python小球弹弹弹_python实现弹跳小球

    前言 学习Python的过程中,比较喜欢通过实际的小项目进行巩固学习,决定写一个弹跳小球的程序.这个实战例程是在公众号上看到的,他的编写过程比较完整,步骤清晰,贴的代码并不完整,但是我还是决定尝试一下 ...

  4. 【Python五篇慢慢弹】数据结构看python

    数据结构看python 作者:白宁超 2016年10月9日14:04:47 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc ...

  5. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  6. selenium+python,解决selenium弹出新页面,无法定位元素的问题(报错:Unable to locate element:元素)

    selenium+python,解决selenium弹出新页面,无法定位元素的问题(报错:Unable to locate element:元素) 参考文章: (1)selenium+python,解 ...

  7. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  8. 02.Python网络爬虫第二弹(http和https协议)

    02.Python网络爬虫第二弹<http和https协议> 一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩 ...

  9. Python队列左侧元素弹出queue.popleft()

    [小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python队列左侧元素弹出 queue.popleft() [太阳]选择题 以下Pytho ...

  10. 类的继承python事例_【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸...

    作者:白宁超 2016年10月10日22:36:57 摘要:继一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc入门资料包含了基本要点.本文是对文档常用核心要点进行梳理,简 ...

最新文章

  1. hdu 1599 find the mincost route(找无向图最小环)(floyd求最小环)
  2. HTTP1.1协议请求方面参数
  3. java网络编程,通过TCP,Socket实现多对一的局域网聊天室
  4. c语言if语句条件是字母,C语言的if语句中,用作判断的条件表达式为()
  5. 自考计算机及应用心得体会,自考中文专业的心得体会
  6. git 安装目录与服务的暂停与启动
  7. html注释引用公共头部_HTML注释和引用
  8. 腾讯视频如何设置主设备
  9. 深入比特币原理(三)——交易的输入(input)与输出(output)
  10. dnfdpl服务器维护了,2019DNF心悦DPL赛事活动地址 强化器和时空石没了
  11. 城市不透水面空间分析——以宁波为例
  12. 尚硅谷WebService技术精讲教程
  13. aspen吸收塔气液比优化_Aspen软件在天然气净化过程中的模拟与优化
  14. WTEM-1Q/GPS瞬变电磁仪操作步骤
  15. 暑假集训后的一些感想
  16. 【opencv 450 Image Processing】Image Moments 图像矩
  17. 微信支付 postman_微信收款商业版有什么功能?微信智慧经营2.0原来可以这么玩!...
  18. igfxpers.exe
  19. ACL访问控制列表——思科模拟器学习
  20. java_home的配置

热门文章

  1. 最好的聊天机器人平台,以建立一个聊天机器人
  2. Node的文件操作、文件系统、数据流
  3. Drupal项目实战-公司订餐系统
  4. 在Windows下配置Ubuntu启动引导项
  5. vue图片裁切cropperjs的使用
  6. ASP.NET 班级网站-程序+配置文档
  7. pytorch之数据:pack_padded_sequence()与pad_packed_sequence()
  8. 什么是软件,软件有哪些特性?
  9. RabbitMQ报错 o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol meth
  10. linux视频mp4无法播放器,mplayer播放器无法正常输出视频