Python基于Tkinter模块实现的弹球小游戏


Posted in Python onDecember 27, 2018

本文实例讲述了Python基于Tkinter模块实现的弹球小游戏。分享给大家供大家参考,具体如下:

#!usr/bin/python
#-*- coding:utf-8 -*-
from Tkinter import *
import Tkinter
import random
import time
#创建小球的类
class Ball:
  def __init__(self,canvas,paddle,color): #参数:画布,球拍和颜色
    self.canvas = canvas
    self.paddle = paddle
    self.id = canvas.create_oval(10,10,25,25,fill = color) #参数:左上角坐标(x1,y1),右下角坐标(x2,y2),填充色
    self.canvas.move(self.id,245,100) #把椭圆形移到画布的中心(245,100)
    starts = [-3,-2,-1,1,2,3] #用一个列表随机一个小球的初始横向 X 坐标
    random.shuffle(starts) #利用shuffle函数使starts列表混排一下,这样starts[0]就是列表中的随机值
    self.x = starts[0] #所以X可能是以列表中的任意一个值开始的
    self.y = -2 #初始的竖直方向运动的速度
    self.canvas_height = self.canvas.winfo_height() #调用画布上的winfo_height函数来获取画布当前的高度
    self.canvas_width = self.canvas.winfo_width() #保证小球不会从屏幕的两边消失,把画布的宽度保存到一个新的对象变量canvas_width中
    self.hit_bottom =False
  def hit_paddle(self,pos): #包含小球的当前坐标
    paddle_pos = self.canvas.coords(self.paddle.id) #得到拍子的坐标,并把它们放到变量paddle_pos中
    #pos[2]包含了小球的右侧X坐标,pos[0]包含了小球左侧的X坐标
    if pos[2] >= paddle_pos[0] and pos[0] <=paddle_pos[2]: #如果小球的右侧大于球拍的左侧,并且小球的左侧小于球拍的右侧
    #pos[3]表示小球的底部(此处判断小球的底部是否在球拍的顶部和底部之间,注:坐标从上到下是逐渐变大的,零点在上面)
      if pos[3] >=paddle_pos[1] and pos[3] <= paddle_pos[3]:#可以理解为,第一个if判断和球拍的长那个面是否碰撞,第二个是侧面
        return True
    return False
  def draw(self):
    self.canvas.move(self.id,self.x,self.y)
    pos = self.canvas.coords(self.id) #coords函数通过ID来返回当前画布上任何画好的东西的当前X和Y坐标
    if pos[1] <=0: #coords函数返回一个由四个数字组成的列表来表示坐标(椭圆的左上角坐标和右下角的)
      self.y=2#判断是否撞击到顶面
    if pos[3] >=self.canvas_height:#判断小球是否撞到了屏幕的底部,如果小球一旦碰到了画布的底端,游戏就结束了i
      self.hit_bottom = True
      print"你输了!"
    if self.hit_paddle(pos) == True: #hit_paddle()函数是用来判断小球是否撞击到球拍(如果撞到了就改变方向运动"-"代表反向,2代表速度)
      self.y = -2
    if pos[0] <=0:#最后两个if判断小球是否撞到了画布的左侧和右侧
      self.x = 2
    if pos[2] >= self.canvas_width:
      self.x = -2
#球拍类
class Paddle:
  def __init__(self,canvas,color):
    self.canvas = canvas
    self.id = canvas.create_rectangle(0,0,100,10,fill = color) #创建一个长方形球拍
    self.canvas.move(self.id,200,300)#把球拍的坐标移到(200,300)横向200像素,纵向300像素
    self.x =0
    self.canvas_width = self.canvas.winfo_width() #保存画布宽度的变量
    self.canvas.bind_all('<KeyPress-Left>',self.turn_left)#把turn_left()函数绑定到左方向键上
    self.canvas.bind_all('<KeyPress-Right>',self.turn_right)#把turn_right()函数班规定到右方向键上
  def draw(self):
    self.canvas.move(self.id,self.x,0) #在x的方向上移动球拍
    pos =self.canvas.coords(self.id)#获得球拍的坐标
    if pos[0] <=0:#如果球拍运动到左边缘的时候,就让球拍停止运动,以下的elif道理相同
      self.x = 0
    elif pos[2] >= self.canvas_width:
      self.x =0
  def turn_left(self,evt): #移动球拍向左
    self.x =-2
  def turn_right(self,evt):#向右
    self.x =2
t = Tkinter.Tk()
t.title("3water.com Game") #用t对象中的title函数给窗口加一个标题,t对象是由t=Tk()创建的
t.resizable(0,0)#规定窗口不可调,两个参数0,0,表示在水平和竖直方向上都不可改变
t.wm_attributes("-topmost",1)#调用wm_attributes来告诉tkinter把包含我们画布的窗口放到所有其他窗口之前(-topmost)
canvas = Canvas(t,width=500,height=400,bd=0,highlightthickness=0)
canvas.pack()#按前一行给出的宽度和高度的参数来调整自身大小
t.update()#做好初始化
paddle = Paddle(canvas,'blue')
ball = Ball(canvas,paddle,'red')
while 1:
  if ball.hit_bottom ==False:
    ball.draw()
    paddle.draw()
  else:
    break
  t.update_idletasks()
  t.update()#快速更新画布
  time.sleep(0.01)
t.mainloop()

本机测试结果如下:

Python基于Tkinter模块实现的弹球小游戏

更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
利用python爬取斗鱼app中照片方法实例
Dec 03 Python
Python编程实现二分法和牛顿迭代法求平方根代码
Dec 04 Python
用django-allauth实现第三方登录的示例代码
Jun 24 Python
python 动态调用函数实例解析
Oct 21 Python
python编写微信公众号首图思路详解
Dec 13 Python
使用PyOpenGL绘制三维坐标系实例
Dec 24 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
Django视图、传参和forms验证操作
Jul 15 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
PyTorch中clone()、detach()及相关扩展详解
Dec 09 Python
python cv2图像质量压缩的算法示例
Jun 04 Python
python 读取Linux服务器上的文件方法
Dec 27 #Python
Python 脚本获取ES 存储容量的实例
Dec 27 #Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 #Python
python获取本机所有IP地址的方法
Dec 26 #Python
python检测IP地址变化并触发事件
Dec 26 #Python
python实现自动获取IP并发送到邮箱
Dec 26 #Python
python 实现分页显示从es中获取的数据方法
Dec 26 #Python
You might like
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
Use Word to Search for Files
2007/06/15 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
vue实现信息管理系统
2020/05/30 Javascript
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
python re.match()用法相关示例
2021/01/27 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
Ado与Ado.net的相同与不同
2014/12/08 面试题
一年级学生期末评语
2014/04/21 职场文书
写得不错的求职信范文
2014/07/11 职场文书
预备党员个人总结
2015/02/14 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL