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 13 Python
python正则实现计算器功能
Dec 14 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
Python中请不要再用re.compile了
Jun 30 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
为什么相对PHP黑python的更少
Jun 21 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
Python中return函数返回值实例用法
Nov 19 Python
详解Python中的进程和线程
Jun 23 Python
使用scrapy实现增量式爬取方式
Jun 21 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/01 无线电
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
克隆javascript对象的三个方法小结
2011/01/12 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
python获取list下标及其值的简单方法
2016/09/12 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
python接口自动化框架实战
2020/12/23 Python
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
《雾凇》教学反思
2014/02/17 职场文书
经典禁毒标语
2014/06/16 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
辛亥革命观后感
2015/06/02 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python