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 相关文章推荐
centos6.7安装python2.7.11的具体方法
Jan 16 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
Python requests获取网页常用方法解析
Feb 20 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
python 动态绘制爱心的示例
Sep 27 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
详解Python中的进程和线程
Jun 23 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
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
浅析php单例模式
2014/11/25 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
pyhton列表转换为数组的实例
2018/04/04 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
pygame实现五子棋游戏
2019/10/29 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
学习决心书范文
2014/03/11 职场文书
植树节活动总结
2014/04/30 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技