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)#延迟刷新
时间: 2024-10-11 19:29:18