码迷,mamicode.com
首页 > 其他好文 > 详细

反弹吧,小球!

时间:2015-09-06 17:53:38      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:

 1 ###########################################
 2 ###此代码源于《趣学Python编程》#反弹吧,小球!###
 3 ###########################################
 4 from tkinter import *
 5 import time
 6 import random
 7 
 8 class Ball:
 9     def __init__(self,canvas,paddle,color):
10         self.canvas = canvas#创建画布
11         self.paddle=paddle#把球拍赋值给小球
12         self.id = canvas.create_oval(10,10,25,25,fill=color)#创建小球
13         self.canvas.move(self.id,245,100)#为小球创建初始位置
14         starts = [-3,-2,-1,1,2,3]#为小球x轴移动速度赋值
15         random.shuffle(starts)
16         self.x=starts[0]
17         self.y=-3
18         self.canvas_height = self.canvas.winfo_height()#获取画布高度
19         self.canvas_width = self.canvas.winfo_width()#获取画布宽度
20         self.hit_bottom = False#小球是否触底
21 
22     def hit_paddle(self,pos):#pos为小球位置
23         paddle_pos = self.canvas.coords(self.paddle.id)#获取拍子位置
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]:#如果只判定在不在拍子的边上,那样容易越过拍子
26                 return True
27         return False
28     
29     def draw(self):
30         self.canvas.move(self.id,self.x,self.y)#小球移动步长
31         pos = self.canvas.coords(self.id)#获取小球的位置
32         #################判定小球是否越界
33         if pos[1]<0:#小球左碰壁
34             self.y=3
35         if pos[3]>=self.canvas_height:#小球碰到画布底就结束游戏
36             self.hit_bottom = True
37         if self.hit_paddle(pos) == True:#小球碰到拍子
38             self.y=-3
39         if pos[0]<=0:#小球碰顶
40             self.x = 3
41         if pos[2]>=self.canvas_width:#小球右碰壁
42             self.x=-3
43         
44 
45 class Paddle:
46     def __init__(self,canvas,color):
47         self.canvas = canvas
48         self.id = canvas.create_rectangle(0,0,100,10,fill=color)
49         self.canvas.move(self.id,200,300)
50         self.x=0
51         self.canvas_width = self.canvas.winfo_width()
52         self.canvas.bind_all(<KeyPress-Left>,self.turn_left)#响应左键
53         self.canvas.bind_all(<KeyPress-Right>,self.turn_right)#响应右键
54 
55     def draw(self):
56         self.canvas.move(self.id,self.x,0)#移动拍子
57         pos = self.canvas.coords(self.id)#获取拍子位置
58         if pos[0]<=0:#拍子左碰壁就停
59             self.x = 0
60         elif pos[2]>=self.canvas_width:#拍子右碰壁就停
61             self.x=0
62 
63     def turn_left(self,evt):#按响应键后的响应函数
64         self.x=-3.5
65 
66     def turn_right(self,evt):
67         self.x=3.5
68 
69 tk=Tk()#创建画布对象
70 tk.title(Game)#设置窗口标题
71 tk.resizable(0,0)#窗口不可调整大小
72 tk.wm_attributes("-topmost",1)#窗口总在最前
73 canvas=Canvas(tk,width=500,height=500,bd=0,highlightthickness=0)#后两项设置画布无边界,更美观
74 canvas.pack()#显示画布
75 tk.update()#刷新屏幕
76 paddle = Paddle(canvas,blue)#创建球拍
77 ball=Ball(canvas,paddle,green)#创建小球对象
79 while 1:
80     if ball.hit_bottom == False:#如果小球触底
81         ball.draw()#小球移动
82         paddle.draw()
83     tk.update_idletasks()#加速刷新画面
84     tk.update()#刷新画面
85     time.sleep(0.01)#延迟刷新

 

反弹吧,小球!

标签:

原文地址:http://www.cnblogs.com/ficow/p/4786590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!