python实现弹跳小球


Posted in Python onMay 13, 2019

前言

学习Python的过程中,比较喜欢通过实际的小项目进行巩固学习,决定写一个弹跳小球的程序。这个实战例程是在公众号上看到的,他的编写过程比较完整,步骤清晰,贴的代码并不完整,但是我还是决定尝试一下,在尝试的过程中由于自己的基础知识并没有学到类这里,所以是在摸索的阶段,一边学习基础知识,一边编写这个例程,最终还是把它给完成了,虽然后面在网上看到了代码,幸好没有提前看到,这一天中我还是学习到了很多。

创建窗口

from tkinter import Tk
 import tkinter
 import random
 import time
 def main():
 
 #创建Tk对象
 tk = tkinter.Tk()
 #窗口取名“Ball”
 tk.title ("Ball")
 #.通知窗口管理器调整布局大小,0,0表示不能被拉升
 tk.resizable (0,0)
 #创建一个长为400*500的界面,背景色为默认
 tk.wm_attributes("-topmost",1)
 canvas = tkinter.Canvas(tk, width=500, height=400, bd=0)
 #通知窗口管理器注册组件
 canvas.pack()
 #刷新一下界面
 tk.update()

点击运行就会出现一个Ball的空白窗口

python实现弹跳小球

创建Ball的类

在这里的话,暂时不一点一点的贴编写过程的代码了,直接把代码贴出来吧

class Ball():
 #注意:特殊方法“init”前后有两个下划线,第一个参数永远是self
 #由于类可以起到模板的作用,因此,可以在创建实例的时候,
 #把一些我们认为必须绑定的属性强制填写进去。通过定义一个
 #特殊的init方法,在创建实例的时候,就把canvas,color等属性绑上去
 def __init__(self,canvas,paddle,color):  
  self.canvas = canvas
  #少了这句话,一直报错'Ball' object has no attribute 'paddle'
  self.paddle = paddle
  self.id = canvas.create_oval(10,10,25,25,fill=color)
  self.canvas.move(self.id,245,100)

  starts=[-3,-2,-1,-1,1,1,2,3]
  random.shuffle(starts)
  self.x = starts[0]#从list里面随机取一个
  self.y = -2#-2表示y轴运动的速度
  self.canvas_height = self.canvas.winfo_height()
  self.canvas_width = self.canvas.winfo_width()
  self.hit_bottom = False #设定hit_bottom初始值为false
  
  
 def hit_paddle(self,pos):
  paddle_pos = self.canvas.coords(self.paddle.id)
  if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
   if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
    return True
  return False

 def draw(self):
  #   self.canvas.move(self.id,0,-1) #表示向上运动
  self.canvas.move(self.id,self.x,self.y)#,self.r,self.l
  pos = self.canvas.coords(self.id)
  if pos[0]<=0:
   self.x = 2
  if pos[1]<=0:
   self.y = 2
  #如果小球碰到了画布右边,则把速度改成每次向左2个像素
  if pos[2]>=self.canvas_width:
   self.x = -2
  #如果小球碰到画布底端 则返回hit_bottom为True
  if pos[3]>=self.canvas_height: 
   self.hit_bottom = True
   
  #判断球是否撞到了木板
  if self.hit_paddle(pos) == True:
   self.y = -3

木板

#如何增加按一下键盘木板动一下的功能?
class Paddle:
 def turn_left(self, evt):
  self.x = -2
 def turn_right(self, evt):
  self.x = 2
  
 def __init__(self,canvas,color):
  self.canvas = canvas
  self.id = canvas.create_rectangle(0,0,150,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:
   self.x = 0
  if pos[2] >= self.canvas_width:
    self.x = 0
   


paddle = Paddle(canvas,"blue")
ball = Ball(canvas,paddle,"red")
while 1:
 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() #更新内容
 
tk.mainloop()
main()

最终完成就是这样的了,用键盘的左右控制蓝色的木板接球就可以了

python实现弹跳小球

要是不小心没接到,游戏就game over 啦!

python实现弹跳小球

最后说一下,感觉很多功能不完善,比如没有点击再来一次的按钮什么的,后期会一步步完善,增加游戏开始、分数、关卡、难度等等,到时候写一篇完成的编写过程记录!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
python实现报表自动化详解
Nov 16 Python
pytorch: tensor类型的构建与相互转换实例
Jul 26 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
利用python和百度地图API实现数据地图标注的方法
May 13 Python
python实现数据分析与建模
Jul 11 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
python实现加密的方式总结
Jan 19 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 #Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 #Python
Python实现插入排序和选择排序的方法
May 12 #Python
Python中将两个或多个list合成一个list的方法小结
May 12 #Python
python实现海螺图片的方法示例
May 12 #Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 #Python
python的turtle库使用详解
May 10 #Python
You might like
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
hessian 在PHP中的使用介绍
2010/12/13 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
angularjs模态框的使用代码实例
2019/12/20 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
ansible作为python模块库使用的方法实例
2017/01/17 Python
python 链接和操作 memcache方法
2017/03/04 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
网络信息安全承诺书
2014/03/26 职场文书
村容村貌整治方案
2014/05/21 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
新党章的学习心得体会
2014/11/07 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
永不妥协观后感
2015/06/10 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL