python3.6使用tkinter实现弹跳小球游戏


Posted in Python onMay 09, 2019

本文实例为大家分享了python3.6实现弹跳小球游戏的具体代码,供大家参考,具体内容如下

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('<KeyPress-Left>',self.turn_left) #用bind_all()函数绑定键盘左键与tun_left函数
 self.canvas.bind_all('<KeyPress-Right>',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 相关文章推荐
python读写二进制文件的方法
May 09 Python
python中的全局变量用法分析
Jun 09 Python
python 内置函数filter
Jun 01 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
python Flask实现restful api service
Dec 04 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
Python实现京东抢秒杀功能
Jan 25 Python
如何用python插入独创性声明
Mar 31 Python
python可视化大屏库big_screen示例详解
Nov 23 Python
Python中re模块的元字符使用小结
Apr 07 Python
使用GitHub和Python实现持续部署的方法
May 09 #Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 #Python
Python Excel处理库openpyxl使用详解
May 09 #Python
python3实现小球转动抽奖小游戏
Apr 15 #Python
Django保护敏感信息的方法示例
May 09 #Python
Python基于scipy实现信号滤波功能
May 08 #Python
python实现抽奖小程序
Apr 15 #Python
You might like
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
python实现自动登录后台管理系统
2018/10/18 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
Python给图像添加噪声具体操作
2019/03/03 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
银行批评与自我批评
2014/02/10 职场文书
材料加工工程求职信
2014/02/19 职场文书
关于安全演讲稿
2014/05/09 职场文书
大学生学年个人总结
2015/02/15 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
Golang 结构体数据集合
2022/04/22 Golang