python實現(xiàn)彈跳小球
前言
學習Python的過程中,比較喜歡通過實際的小項目進行鞏固學習,決定寫一個彈跳小球的程序。這個實戰(zhàn)例程是在公眾號上看到的,他的編寫過程比較完整,步驟清晰,貼的代碼并不完整,但是我還是決定嘗試一下,在嘗試的過程中由于自己的基礎知識并沒有學到類這里,所以是在摸索的階段,一邊學習基礎知識,一邊編寫這個例程,最終還是把它給完成了,雖然后面在網上看到了代碼,幸好沒有提前看到,這一天中我還是學習到了很多。
創(chuàng)建窗口
from tkinter import Tk
import tkinter
import random
import time
def main():
#創(chuàng)建Tk對象
tk = tkinter.Tk()
#窗口取名“Ball”
tk.title ("Ball")
#.通知窗口管理器調整布局大小,0,0表示不能被拉升
tk.resizable (0,0)
#創(chuàng)建一個長為400*500的界面,背景色為默認
tk.wm_attributes("-topmost",1)
canvas = tkinter.Canvas(tk, width=500, height=400, bd=0)
#通知窗口管理器注冊組件
canvas.pack()
#刷新一下界面
tk.update()
點擊運行就會出現(xiàn)一個Ball的空白窗口

創(chuàng)建Ball的類
在這里的話,暫時不一點一點的貼編寫過程的代碼了,直接把代碼貼出來吧
class Ball():
#注意:特殊方法“init”前后有兩個下劃線,第一個參數(shù)永遠是self
#由于類可以起到模板的作用,因此,可以在創(chuàng)建實例的時候,
#把一些我們認為必須綁定的屬性強制填寫進去。通過定義一個
#特殊的init方法,在創(chuàng)建實例的時候,就把canvas,color等屬性綁上去
def __init__(self,canvas,paddle,color):
self.canvas = canvas
#少了這句話,一直報錯'Ball' object has no attribute 'paddle'
self.paddle = paddle
self.id = canvas.create_oval(10,10,25,25,fill=color)
self.canvas.move(self.id,245,100)
starts=[-3,-2,-1,-1,1,1,2,3]
random.shuffle(starts)
self.x = starts[0]#從list里面隨機取一個
self.y = -2#-2表示y軸運動的速度
self.canvas_height = self.canvas.winfo_height()
self.canvas_width = self.canvas.winfo_width()
self.hit_bottom = False #設定hit_bottom初始值為false
def hit_paddle(self,pos):
paddle_pos = self.canvas.coords(self.paddle.id)
if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
return True
return False
def draw(self):
# self.canvas.move(self.id,0,-1) #表示向上運動
self.canvas.move(self.id,self.x,self.y)#,self.r,self.l
pos = self.canvas.coords(self.id)
if pos[0]<=0:
self.x = 2
if pos[1]<=0:
self.y = 2
#如果小球碰到了畫布右邊,則把速度改成每次向左2個像素
if pos[2]>=self.canvas_width:
self.x = -2
#如果小球碰到畫布底端 則返回hit_bottom為True
if pos[3]>=self.canvas_height:
self.hit_bottom = True
#判斷球是否撞到了木板
if self.hit_paddle(pos) == True:
self.y = -3
木板
#如何增加按一下鍵盤木板動一下的功能?
class Paddle:
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2
def __init__(self,canvas,color):
self.canvas = canvas
self.id = canvas.create_rectangle(0,0,150,10,fill=color)
self.canvas.move(self.id,200,300)
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
def draw(self):
self.canvas.move(self.id,self.x,0)
pos = self.canvas.coords(self.id)
if pos[0] <= 0:
self.x = 0
if pos[2] >= self.canvas_width:
self.x = 0
paddle = Paddle(canvas,"blue")
ball = Ball(canvas,paddle,"red")
while 1:
if ball.hit_bottom==False: #沒有碰到底部的話執(zhí)行下面的語句
ball.draw() #調用ball對象的函數(shù)draw()
paddle.draw()#調用paddle對象的函數(shù)draw()
tk.update_idletasks()
tk.update() #更新框架
time.sleep(0.01) #睡眠0.01秒
elif ball.hit_bottom==True: #要是小球接觸了底部
canvas.create_text(200,100,text='Aha,you lose it,\nHow about try again?',font=('Times',22)) #在(200,100)坐標處創(chuàng)建文本‘...',字號22號
tk.update() #更新內容
tk.mainloop()
main()
最終完成就是這樣的了,用鍵盤的左右控制藍色的木板接球就可以了

要是不小心沒接到,游戲就game over 啦!

最后說一下,感覺很多功能不完善,比如沒有點擊再來一次的按鈕什么的,后期會一步步完善,增加游戲開始、分數(shù)、關卡、難度等等,到時候寫一篇完成的編寫過程記錄!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python數(shù)據(jù)分析之聚類分析(cluster analysis)
聚類分析本身不是一個特定的算法,而是要解決的一般任務。它可以通過各種算法來實現(xiàn),這些算法在理解群集的構成以及如何有效地找到它們方面存在顯著差異。這篇文章主要介紹了python數(shù)據(jù)分析之聚類分析(cluster analysis),需要的朋友可以參考下2021-11-11
Python實現(xiàn)解析與生成JSON數(shù)據(jù)
JSON文件是一種輕量級的數(shù)據(jù)交換格式,它采用了一種類似于JavaScript語法的結構,可以方便地在不同平臺和編程語言之間進行數(shù)據(jù)交換,下面我們就來學習一下Python如何使用內置的json模塊來讀取和寫入JSON文件吧2023-12-12

