#!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("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 写一个弹球的小游戏的更多相关文章

  1. 10分钟用scratch写一个大鱼吃小鱼的小游戏

    第一次给张江小朋友教Scratch课程之前,还在担心一些概念能不能向小朋友解释清楚,可上完课发现,我严重低估了小朋友的聪明程度,发现现在的孩子相比较自己8.9岁的时候,简直聪明太多倍了. 所以总结了半 ...

  2. Python3的tkinter写一个简单的小程序

    一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...

  3. Python中写一个乒乓球类的游戏

    最近开始学Python,感觉挺好玩的,既有脚本语言的灵活性,又有丰富的类库与面向对象的特点,开发起来很方便. 游戏的规则和乒乓球一样,如果妙蛙种子掉地上了就算输,你可以用蓝色的跷跷板弹它,使他不落到地 ...

  4. 用js写一个贪吃蛇小游戏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  6. 利用 Python 写一个颜值测试小工具

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 很多人学习python,不知道从何学起.很多人学习p ...

  7. canvas写个简单的小游戏

    之前在HTML5 Canvas属性和方法汇总一文中,介绍过Canvas的各种属性以及方法的说明,并列举了自己写的一些Canvas demo,接下来开始写一个简单的小游戏吧,有多简单,这么说吧,代码不到 ...

  8. python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“大”,3<=总值<=10为“小”。然后告诉玩家猜对或者是猜错的结果。

    python小练习:使用循环和函数实现一个摇骰子小游戏.游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“ ...

  9. 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

    ​ 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...

随机推荐

  1. 【poj2947】高斯消元求解同模方程组【没有AC,存代码】

    题意: p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x, ...

  2. appcan UI

    appcan UI 公共类 ([appcanUI框架地址:](http://newdocx.appcan.cn/UI/source) .ub { display: -webkit-box !impor ...

  3. js_setCookie,getCookie和checkcookie函数

    随便说说: cookie和sessionStrong,localStrong在web应用中都有一种存储的功能,也就是说可以把一些数据记录在浏览器.cookie和后两者的主要区别 是cookie是和后端 ...

  4. metlnfo 5.3.1 sql注入复现

    首先还是要说的是metlnfo是伪全局变量机制 所以如下: /admin/include/global.func.php function save_met_cookie(){ global $met ...

  5. 【Python学习】Jupyter解决单个变量输出问题

    使用Jupyter的时候有时候发现,我明明写了好几个变量打印,但是它只显示最后一个.Out只有一个. 但是使用下面的语句.就可以实现多个输出. from IPython.core.interactiv ...

  6. 日常开发技巧:在远程机器上直接使用adb

    背景 嵌入式开发中,开发工作是在远程服务器上进行的.当需要adb推送一个文件到开发板时,则需要重新在本地机器中找到该文件,再执行命令.这样的操作比较麻烦. 下面介绍我的解决方式. sshfs挂载 首先 ...

  7. JAVA常见的集合类

    关系的介绍: Set(集):集合中的元素不按特定方式排序,并且没有重复对象.他的有些实现类能对集合中的对象按特定方式排序. List(列表):集合中的元素按索引位置排序,可以有重复对象,允许按照对象在 ...

  8. VPS性能综合测试(7):服务器压力测试,VPS系统负载测试

    1.可能有的VPS主机使用性能测评工具得出的结果很优秀,但是最终运用到实际生产时却发现VPS主机根本无法承受理论上应该达到的流量压力,这时我们就不得不要怀疑VPS商是不是对VPS主机的参数进行了“篡改 ...

  9. Canvas开发库封装

    一.Canvas第三方类库 1.常见的第三方类库 konva.js <style> body{ margin:0; } </style> </head> <b ...

  10. git配置服务器版仓库

    1.git 可以使用四种主要的协议来传输数据:本地传输,SSH 协议,Git 协议和 HTTP 协议.现在使用360同步盘同步一个网络的仓库管理. 2.查看设置好的360同步盘的文件 3.创建空的仓库 ...