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中使用__slots__方法的详细教程
Apr 28 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
TensorFlow实现卷积神经网络
May 24 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
Python安装whl文件过程图解
Feb 18 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
python lambda 表达式形式分析
Apr 03 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
PHP添加MySQL数据记录代码
2008/06/07 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
自我鉴定三原则
2014/01/13 职场文书
委托书如何写
2014/08/30 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
教师读书活动心得体会
2016/01/14 职场文书