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包的五个简单准则简介
Jun 15 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python基于高斯消元法计算线性方程组示例
Jan 17 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
Python中fnmatch模块的使用详情
Nov 30 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
pytorch 常用线性函数详解
Jan 15 Python
python selenium操作cookie的实现
Mar 18 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
python实现图像高斯金字塔的示例代码
Dec 11 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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
php微信高级接口群发 多客服
2016/06/23 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
Numpy之random函数使用学习
2019/01/29 Python
python3.x实现base64加密和解密
2019/03/28 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
如何用python免费看美剧
2020/08/11 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
资深生产主管自我评价
2013/09/22 职场文书
外贸英语毕业生自荐信
2013/11/14 职场文书
毕业生简单求职信
2013/11/19 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript