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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
python3图片转换二进制存入mysql
Dec 06 Python
python内存管理分析
Apr 08 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
浅谈Python数据类型之间的转换
Jun 08 Python
Python内置函数delattr的具体用法
Nov 23 Python
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
Python函数调用追踪实现代码
Nov 27 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
react系列从零开始_简单谈谈react
2017/07/06 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
Vue前后端不同端口的实现方法
2018/09/19 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python 基础教程之Map使用方法
2017/01/17 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
python常用排序算法的实现代码
2019/11/08 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
Python 可视化神器Plotly详解
2020/12/26 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
考核评语大全
2014/04/29 职场文书
金融与证券专业求职信
2014/06/22 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
综合管理员岗位职责
2015/02/11 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python