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_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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM