目錄
- 1.創(chuàng)建游戲的主界面
- 2.創(chuàng)建一個(gè)Ball球的類(lèi)
- 3.我們讓球向上動(dòng)起來(lái)
- 4.讓球能回彈
- 5.增加球的運(yùn)行方向
- 6.增加小木板
- 7.讓木板可以移動(dòng)
- 8.增加球和木板的碰撞
- 9.判斷當(dāng)球運(yùn)動(dòng)到底部游戲結(jié)束
我們前面講了幾篇關(guān)于類(lèi)的知識(shí)點(diǎn),為了讓大家更好的掌握類(lèi)的概念,并靈活的運(yùn)用這些知識(shí),我寫(xiě)了一個(gè)有趣又好玩的彈球的游戲,一來(lái)可以把類(lèi)的知識(shí)融會(huì)一下,二來(lái)加深對(duì)Python的興趣.你會(huì)發(fā)現(xiàn)哎呀Python寫(xiě)小游戲還是蠻方便的,蠻有意思的~~
先看一下我們的最終效果圖
我們分9步來(lái)講解如何寫(xiě)這個(gè)小游戲
1.創(chuàng)建游戲的主界面
我們用Python的內(nèi)置模塊Tkinter來(lái)完成了,它是Python的標(biāo)準(zhǔn)GUI工具包,可以非常方便在制作GUI小工具,因?yàn)槭强缙脚_(tái)的,可以方便的在win和linux下運(yùn)行,我們用Tk里的canvas繪圖功能來(lái)制作一個(gè)小游戲.先來(lái)把主界面畫(huà)出來(lái)
(1).創(chuàng)建一個(gè)tk的實(shí)例
(2).然后給這個(gè)窗口取一個(gè)名字叫g(shù)ame
(3).通知窗口管理器調(diào)整布局大小,0,0表示不能被拉升
(4).創(chuàng)建一個(gè)長(zhǎng)為400*500的界面,背景色為默認(rèn),邊框?yàn)楹穸葹?
(5).通知窗口管理器注冊(cè)組件
(6).刷新一下界面
2.創(chuàng)建一個(gè)Ball球的類(lèi)
好主界面有了,我們就開(kāi)始創(chuàng)建球
(1)首先我們創(chuàng)建一個(gè)Ball的類(lèi),這個(gè)類(lèi)的初始化參數(shù)有兩個(gè):
一個(gè)canvas也就是畫(huà)圖用來(lái)畫(huà)一個(gè)球,一個(gè)是color,表示球的顏色
(2)在類(lèi)的初始化的函數(shù)里面
初始化canvas,
畫(huà)一個(gè)實(shí)心的球并記錄下它的id
創(chuàng)建球的默認(rèn)在主界面上的位置,我們把它放屏幕中間
然后讓球出現(xiàn)在主界面上:
3.我們讓球向上動(dòng)起來(lái)
剛才在Ball類(lèi)里面有一個(gè)draw函數(shù),我們現(xiàn)在在draw里面加點(diǎn)東西,讓球向上運(yùn)動(dòng)
4.讓球能回彈
(1).第三步我們球能向上運(yùn)動(dòng),現(xiàn)在我們要讓它能碰到墻壁反彈
我們剛才是把self.canvas.move(self.id,0,-1)寫(xiě)死0,-1,表示x坐標(biāo)不動(dòng),y坐標(biāo)不斷的-1也就是球在向上運(yùn)動(dòng)
現(xiàn)在我們把這兩個(gè)值設(shè)成兩個(gè)變量self.x,self.y,當(dāng)我們的球運(yùn)動(dòng)到上邊界的時(shí)候,就把self.y加1,也就向下運(yùn)行,
當(dāng)運(yùn)動(dòng)到下邊界的時(shí)候,就把self.y減1,表示向上運(yùn)行
(2).那么如何判斷球已經(jīng)碰壁了,很簡(jiǎn)單,我們動(dòng)態(tài)的去球的坐標(biāo)[x1,y1,x2,y2],
x1,y1 表示top-left 左上角的坐標(biāo)
x2,y2 表示bottom-right右下角的坐標(biāo)
獲取了球的坐標(biāo)之后(它是一個(gè)list),判斷一下pos[1]和pos[3]就可以了
5.增加球的運(yùn)行方向
現(xiàn)在我們的球的運(yùn)動(dòng)方向是固定的,我們希望每次球的運(yùn)動(dòng)方向要隨機(jī),不然太low了,怎么做呢,很簡(jiǎn)單增加一個(gè)隨機(jī)函數(shù)就可以了
在__init__()函數(shù)里面,我們改一下
self.x = 0
self.y = -1
變成:
starts=[-3,-2,-1,1,1,2,3]
random.shuffle(starts)
self.x=starts[0]#從list里面隨機(jī)取一個(gè)
self.y=-3#-3表示y軸運(yùn)動(dòng)的速度
6.增加小木板
現(xiàn)在我們的球已經(jīng)可以在界面上到處亂竄了,我們現(xiàn)在增加一個(gè)木板來(lái)打彈球
7.讓木板可以移動(dòng)
我們通過(guò)綁定一些鍵盤(pán)事件,讓木板可以移動(dòng)
增加2個(gè)函數(shù),左移和右移,有同學(xué)會(huì)問(wèn)evt是啥,不急下面會(huì)說(shuō).
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2
在Paddle的初始化函數(shù)里面綁定兩個(gè)鍵盤(pán)事件:
就是按鍵盤(pán)左鍵就是響應(yīng)self.turn_left
就是按鍵盤(pán)右鍵就是響應(yīng)self.turn_right
evt是向系統(tǒng)注冊(cè)的事件
8.增加球和木板的碰撞
現(xiàn)在球也有了,木板也有了,而且可以左右挪動(dòng),現(xiàn)在最精彩的部分要上演了,就是增加球碰到木板之后反彈,那么如何判斷球碰到木板了,簡(jiǎn)單我們只要在球的類(lèi)里面增加一個(gè)函數(shù)來(lái)判斷是否碰撞了
def draw(self):
--snip--
if self.hit_paddle(pos) == True:
self.y = -3
--snip--
9.判斷當(dāng)球運(yùn)動(dòng)到底部游戲結(jié)束
經(jīng)過(guò)上面8步,游戲大體功能已經(jīng)有了,那么如何判斷游戲結(jié)束呢,我們?cè)O(shè)定只要球運(yùn)動(dòng)底部的時(shí)候(可以認(rèn)為是球碰到了地面),游戲就失敗了,加幾行代碼就搞定了.
class Ball():
def __init__(self,canvas,paddle,color):
--snip--
self.hit_bottom=False
def draw(self):
--snip--
if pos[3]>=self.canvas_height:#判斷當(dāng)球的下沿大于等于主界面的高度
self.hit_bottom=True
--snip--
paddle=Paddle(canvas,"blue")
ball=Ball(canvas,paddle,"red")
while 1:
if ball.hit_bottom==False and ball.paddle.started :
ball.draw()
paddle.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01)
源碼大概100行實(shí)現(xiàn)了簡(jiǎn)單的功能,其實(shí)這個(gè)游戲還可以增加很多功能,比如記錄分?jǐn)?shù),增加游戲開(kāi)始和結(jié)束的提示,增加木板和球的種類(lèi),增加管卡和難度等等大家可以自己發(fā)揮一下, 寫(xiě)完很有成就感~~
到此這篇關(guān)于用Python寫(xiě)一個(gè)簡(jiǎn)易版彈球游戲的文章就介紹到這了,更多相關(guān)python寫(xiě)彈球游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python生命游戲?qū)崿F(xiàn)原理及過(guò)程解析(附源代碼)
- 詳解Python 實(shí)現(xiàn)元胞自動(dòng)機(jī)中的生命游戲(Game of life)
- python實(shí)現(xiàn)生命游戲的示例代碼(Game of Life)
- python實(shí)現(xiàn)21點(diǎn)小游戲
- 教你用Python寫(xiě)一個(gè)植物大戰(zhàn)僵尸小游戲
- python實(shí)戰(zhàn)之90行代碼寫(xiě)個(gè)猜數(shù)字游戲
- 教你如何用python開(kāi)發(fā)一款數(shù)字推盤(pán)小游戲
- python實(shí)現(xiàn)簡(jiǎn)單反彈球游戲
- Python實(shí)戰(zhàn)之實(shí)現(xiàn)康威生命游戲