python使用tkinter写的弹跳游戏。

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

 用IDLE自带的tkinter写的小球游戏,

参考教材《教孩子学编程》作者Jason R.Briggs

原文地址:https://www.cnblogs.com/caesura-k/p/8893027.html