python實(shí)現(xiàn)彈跳小球
前言
學(xué)習(xí)Python的過(guò)程中,比較喜歡通過(guò)實(shí)際的小項(xiàng)目進(jìn)行鞏固學(xué)習(xí),決定寫(xiě)一個(gè)彈跳小球的程序。這個(gè)實(shí)戰(zhàn)例程是在公眾號(hào)上看到的,他的編寫(xiě)過(guò)程比較完整,步驟清晰,貼的代碼并不完整,但是我還是決定嘗試一下,在嘗試的過(guò)程中由于自己的基礎(chǔ)知識(shí)并沒(méi)有學(xué)到類(lèi)這里,所以是在摸索的階段,一邊學(xué)習(xí)基礎(chǔ)知識(shí),一邊編寫(xiě)這個(gè)例程,最終還是把它給完成了,雖然后面在網(wǎng)上看到了代碼,幸好沒(méi)有提前看到,這一天中我還是學(xué)習(xí)到了很多。
創(chuàng)建窗口
from tkinter import Tk import tkinter import random import time def main(): #創(chuàng)建Tk對(duì)象 tk = tkinter.Tk() #窗口取名“Ball” tk.title ("Ball") #.通知窗口管理器調(diào)整布局大小,0,0表示不能被拉升 tk.resizable (0,0) #創(chuàng)建一個(gè)長(zhǎng)為400*500的界面,背景色為默認(rèn) tk.wm_attributes("-topmost",1) canvas = tkinter.Canvas(tk, width=500, height=400, bd=0) #通知窗口管理器注冊(cè)組件 canvas.pack() #刷新一下界面 tk.update()
點(diǎn)擊運(yùn)行就會(huì)出現(xiàn)一個(gè)Ball的空白窗口
創(chuàng)建Ball的類(lèi)
在這里的話,暫時(shí)不一點(diǎn)一點(diǎn)的貼編寫(xiě)過(guò)程的代碼了,直接把代碼貼出來(lái)吧
class Ball(): #注意:特殊方法“init”前后有兩個(gè)下劃線,第一個(gè)參數(shù)永遠(yuǎn)是self #由于類(lèi)可以起到模板的作用,因此,可以在創(chuàng)建實(shí)例的時(shí)候, #把一些我們認(rèn)為必須綁定的屬性強(qiáng)制填寫(xiě)進(jìn)去。通過(guò)定義一個(gè) #特殊的init方法,在創(chuàng)建實(shí)例的時(shí)候,就把canvas,color等屬性綁上去 def __init__(self,canvas,paddle,color): self.canvas = canvas #少了這句話,一直報(bào)錯(cuò)'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里面隨機(jī)取一個(gè) self.y = -2#-2表示y軸運(yùn)動(dòng)的速度 self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() self.hit_bottom = False #設(shè)定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) #表示向上運(yùn)動(dòng) 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 #如果小球碰到了畫(huà)布右邊,則把速度改成每次向左2個(gè)像素 if pos[2]>=self.canvas_width: self.x = -2 #如果小球碰到畫(huà)布底端 則返回hit_bottom為T(mén)rue if pos[3]>=self.canvas_height: self.hit_bottom = True #判斷球是否撞到了木板 if self.hit_paddle(pos) == True: self.y = -3
木板
#如何增加按一下鍵盤(pán)木板動(dòng)一下的功能? 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: #沒(méi)有碰到底部的話執(zhí)行下面的語(yǔ)句 ball.draw() #調(diào)用ball對(duì)象的函數(shù)draw() paddle.draw()#調(diào)用paddle對(duì)象的函數(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)坐標(biāo)處創(chuàng)建文本‘...',字號(hào)22號(hào) tk.update() #更新內(nèi)容 tk.mainloop() main()
最終完成就是這樣的了,用鍵盤(pán)的左右控制藍(lán)色的木板接球就可以了
要是不小心沒(méi)接到,游戲就game over 啦!
最后說(shuō)一下,感覺(jué)很多功能不完善,比如沒(méi)有點(diǎn)擊再來(lái)一次的按鈕什么的,后期會(huì)一步步完善,增加游戲開(kāi)始、分?jǐn)?shù)、關(guān)卡、難度等等,到時(shí)候?qū)懸黄瓿傻木帉?xiě)過(guò)程記錄!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用python計(jì)算時(shí)間差(返回天數(shù))
這篇文章主要給大家介紹了關(guān)于如何利用python計(jì)算時(shí)間差(返回天數(shù))的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09python數(shù)據(jù)分析之聚類(lèi)分析(cluster analysis)
聚類(lèi)分析本身不是一個(gè)特定的算法,而是要解決的一般任務(wù)。它可以通過(guò)各種算法來(lái)實(shí)現(xiàn),這些算法在理解群集的構(gòu)成以及如何有效地找到它們方面存在顯著差異。這篇文章主要介紹了python數(shù)據(jù)分析之聚類(lèi)分析(cluster analysis),需要的朋友可以參考下2021-11-11python中mechanize庫(kù)的簡(jiǎn)單使用示例
最近的項(xiàng)目中使用到了mechanize庫(kù),下面寫(xiě)個(gè)簡(jiǎn)單使用的小例子給大家參考2014-01-01Python實(shí)現(xiàn)解析與生成JSON數(shù)據(jù)
JSON文件是一種輕量級(jí)的數(shù)據(jù)交換格式,它采用了一種類(lèi)似于JavaScript語(yǔ)法的結(jié)構(gòu),可以方便地在不同平臺(tái)和編程語(yǔ)言之間進(jìn)行數(shù)據(jù)交換,下面我們就來(lái)學(xué)習(xí)一下Python如何使用內(nèi)置的json模塊來(lái)讀取和寫(xiě)入JSON文件吧2023-12-12AI:如何訓(xùn)練機(jī)器學(xué)習(xí)的模型
這篇文章主要介紹了是如何進(jìn)行機(jī)器學(xué)習(xí)的模型的訓(xùn)練,全文邏輯清晰,簡(jiǎn)單易懂,如果您正在學(xué)習(xí)機(jī)器學(xué)習(xí)那么可以參考下,說(shuō)不定會(huì)有不一樣的收貨2021-04-04