经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
python3.6使用tkinter实现弹跳小球游戏
来源:jb51  时间:2019/5/10 8:40:13  对本文有异议

本文实例为大家分享了python3.6实现弹跳小球游戏的具体代码,供大家参考,具体内容如下

  1. import random
  2. import time
  3. from tkinter import *
  4. #下面定义一个球的类,有canvas和color两个对象
  5. class Ball: #定义一个Ball类的函数
  6. def __init__(self,canvas,paddle,color):#这是Ball类的属性函数,Ball类下的函数都有这些性质
  7. self.canvas=canvas
  8. self.paddle=paddle
  9. self.id=canvas.create_oval(10,10,25,25,fill=color)#返回所绘小球的调用值放入对象self.id
  10. self.canvas.move(self.id,245,100) #移动小球到(245,100)坐标处,
  11. starts=[-3,-2,-1,1,2,3]
  12. random.shuffle(starts)
  13. self.x=starts[0] #使得小球左右方向运动随机
  14. self.y=-3 #默认开始的小球向上方运动
  15. self.canvas_height=self.canvas.winfo_height()#画布高度函数winfo_height()返回值放入canvas_height对象中
  16. self.canvas_width=self.canvas.winfo_width() #winfo_width()返回画布宽度放入canvas_width对象中
  17. self.hit_bottom=False #设定hit_bottom初始值为false
  18. def hit_paddle(self,pos): #声明函数,以供调用
  19. paddle_pos=self.canvas.coords(self.paddle.id) #将球拍的(x1,y1)(x2,y2)的坐标放到paddle_pos中
  20. if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]: #
  21. if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]: #比较小球y轴是否在球拍y轴内
  22. return True #表示小球碰到了球拍
  23. return False #表示小球没有碰到球拍
  24. def draw(self): #声明draw函数,
  25. self.canvas.move(self.id,self.x,self.y) #移动小球,移动速度为(self.x,self.y),在init中的属性可以直接用
  26. pos=self.canvas.coords(self.id)#把小球的左上角和右下角的坐标以列表形式(可能元组)放入pos对象中
  27. if pos[1]<=0: #如果小球碰到画布上方
  28. self.y=3 #则改变移动方向向下方
  29. if pos[3]>=self.canvas_height: #如果小球碰到画布底端 则返回hit_bottom为True
  30. self.hit_bottom=True
  31. if self.hit_paddle(pos)==True: #小球碰到了球拍,则改变Y轴方向向上运动
  32. self.y=-3
  33. if pos[0]<=0: #如果小球碰到了画布左边,则把X轴速度改成每次向右3个像素
  34. self.x=3
  35. if pos[2]>=self.canvas_width: #如果小球碰到了画布右边,则把速度改成每次向左3个像素
  36. self.x=-3
  37. class Paddle: #定义一个paddle类
  38. def __init__(self,canvas,color): #paddle类的属性函数,默认有两个变量画布和颜色
  39. self.canvas=canvas #将canvas对象赋给self.canvas
  40. self.id=canvas.create_rectangle(0,0,100,10,fill=color) #创建球拍,将球拍的调用编号存入self.id
  41. self.canvas.move(self.id,200,300) #将球拍移动到(200,300)处
  42. self.x=0 #
  43. self.canvas_width=self.canvas.winfo_width() #将画布的宽度放入canvas_width对象
  44. self.canvas.bind_all('<KeyPress-Left>',self.turn_left) #用bind_all()函数绑定键盘左键与tun_left函数
  45. self.canvas.bind_all('<KeyPress-Right>',self.turn_right) #绑定键盘右键与turn_right函数
  46. def draw(self): #声明一个draw函数
  47. self.canvas.move(self.id,self.x,0) #左右移动球拍的速度为self.x,默认不动
  48. pos=self.canvas.coords(self.id) #将球拍的左上角和右下角的坐标存入pos对象中
  49. if pos[0]<=0: #如果球拍x轴小于0,则不再向右移动
  50. self.x=0
  51. elif pos[2]>=self.canvas_width: #如果球拍要超过画布右侧了,则球拍的移动速度变为0
  52. self.x=0
  53. def turn_left(self,evt):#这里的evt是调用方传过来的参数,改变球拍的移动速度向左,
  54. self.x=-5
  55. def turn_right(self,evt): #改变球拍的移动速度向右每次5个像素
  56. self.x=5
  57. #创建框架并且命名和固定,然后创建该框架的画布
  58. tk=Tk() #创建框架对象tk
  59. tk.title('Game') #框架对象tk显示的名字为'game'
  60. tk.resizable(0,0) #固定框架
  61. tk.wm_attributes('-topmost',1) #显示在最外层
  62. canvas=Canvas(tk,width=500,height=400,bd=0,highlightthickness=0) #创建画布canvas,属于tk框架对象,
  63. canvas.pack() #显示画布的变化
  64. tk.update() #显示框架的变化
  65. #把类赋值给对象ball,如果调用了ball就可以实现该类的作用
  66. paddle=Paddle(canvas,"blue") #调用拍的类给对象paddle用
  67. ball=Ball(canvas,paddle,'green') #调用球的类给对象ball用
  68. while True: #要注意while语句以防止死循环,先设置为真
  69. if ball.hit_bottom==False: #没有碰到底部的话执行下面的语句
  70. ball.draw() #调用ball对象的函数draw()
  71. paddle.draw()#调用paddle对象的函数draw()
  72. tk.update_idletasks()
  73. tk.update() #更新框架
  74. time.sleep(0.01) #睡眠0.01秒
  75. elif ball.hit_bottom==True: #要是小球接触了底部
  76. canvas.create_text(200,100,text='Aha,you lose it,\nHow about try again?',font=('Times',22)) #在(200,100)坐标处创建文本‘...',字号22号
  77. tk.update() #更新内容

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号