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_width: #如果小球碰到了畫布右邊,則把速度改成每次向左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_width: #如果球拍要超過畫布右側了,則球拍的移動速度變為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,\nHow about try again?',font=('Times',22)) #在(200,100)坐標處創建文本‘...’,字號22號 94 tk.update() #更新內容
用IDLE自帶的tkinter寫的小球游戲,
參考教材《教孩子學編程》作者Jason R.Briggs