以Atari先鋒Rampart的風(fēng)格保護(hù)您的城堡。Mark在最新版本的Wireframe雜志中向您展示了如何操作。
上世紀(jì)80年代,一種新的戰(zhàn)略流派應(yīng)運(yùn)而生。塔防游戲包括在你的城堡周圍建造圍墻或障礙物,以防止敵人摧毀它。Atari發(fā)行的《Rampart》是該類游戲中一個(gè)著名的早期作品。比賽分為兩個(gè)階段。在建造階段,玩家在堡壘周圍的墻壁上填洞,并放置大炮。在第二階段,玩家的堡壘將被艦隊(duì)從海上攻擊,玩家可以用大炮還擊。這個(gè)循環(huán)會(huì)一直持續(xù)下去,直到玩家無(wú)法再填補(bǔ)墻壁的空隙,或者他們摧毀了所有攻擊船只。
大炮準(zhǔn)備好了,準(zhǔn)備戰(zhàn)斗!這是最初的Rampart,由Atari于1990年開發(fā)。
在我們的PygameZero示例中,我們將研究?jī)煞N塔防機(jī)制:筑墻系統(tǒng),然后檢查要塞是否被墻包圍。要開始編碼,我們需要一個(gè)背景——在本例中,是一個(gè)海岸線部分。然后,我們需要定義一個(gè)不可見(jiàn)的網(wǎng)格,該網(wǎng)格將保存墻所在位置的詳細(xì)信息。如果我們假設(shè)每個(gè)墻段是40×40像素,那么在800×600像素的窗口上,我們可以定義一個(gè)二維列表中20×15的網(wǎng)格。在這個(gè)列表中,我們將從所有設(shè)置為0的正方形開始,然后如果我們添加墻截面,將該正方形切換為1。為了定義我們可以構(gòu)建和不能構(gòu)建的地方,我們可以加載一個(gè)小黑白圖像,并從中讀取像素,將不可構(gòu)建的正方形設(shè)置為3。
我們的堡壘將占據(jù)四個(gè)正方形,因此我們將堡壘位置的左上角正方形設(shè)為2,其他三個(gè)正方形設(shè)為3。這將阻止玩家在堡壘上筑墻。我們使用on_mouse_move()函數(shù)跟蹤鼠標(biāo)的移動(dòng),當(dāng)我們獲得鼠標(biāo)x和y坐標(biāo)時(shí),我們?cè)阪i定到不可見(jiàn)網(wǎng)格的鼠標(biāo)指針下繪制一段墻。當(dāng)我們得到一個(gè)on_mouse_down()事件時(shí),我們檢查所經(jīng)過(guò)的正方形是否為0,如果為0,我們將其轉(zhuǎn)換為1。
我們向塔防流派致敬。建造一系列的墻來(lái)安全地包圍你的堡壘。
在draw()函數(shù)中,如果我們?cè)诰W(wǎng)格中有1的地方繪制一個(gè)墻截面,我們將看到墻所在的平面正方形。然而,我們想要的是所有的墻都與外面的城垛連接起來(lái)。為此,我們需要檢查每個(gè)墻件周圍的正方形,并根據(jù)其與其他墻件的連接方式來(lái)更改我們使用的圖像。我們查看上方、右側(cè)、下方和左側(cè)的正方形,如果沒(méi)有墻,則創(chuàng)建一個(gè)帶零的字符串,如果有墻,則生成一個(gè)帶1的字符串。這意味著如果沒(méi)有墻連接,我們將獲得字符串“0000”,如果上方有墻,將獲得字符串1000,如果當(dāng)前墻的左側(cè)和右側(cè)有墻,示例:“wall0101”。
在示例的第二部分,我們將檢測(cè)堡壘是否被墻包圍。有多種方法可以做到這一點(diǎn),但我們將使用“flood fill”例程來(lái)測(cè)試這一點(diǎn)。首先,我們制作一份網(wǎng)格列表的副本以進(jìn)行測(cè)試。然后,從網(wǎng)格上的堡壘位置開始,我們遞歸地測(cè)試所有相鄰的正方形。如果我們碰到了一堵墻,那么我們就關(guān)閉了回路的分支。這就產(chǎn)生了一系列向外延伸的測(cè)試,直到到達(dá)地圖的一側(cè),或者因?yàn)樗械拇a分支都碰到了墻,所以我們沒(méi)有正方形來(lái)測(cè)試。如果到達(dá)地圖的邊緣,墻上就會(huì)有洞;否則,堡壘將被封閉。
這些是我們的筑墻和測(cè)試程序。為了完成塔防風(fēng)格的游戲,你需要添加一些大炮和艦船來(lái)戰(zhàn)斗,但我們會(huì)把這部分留給你來(lái)實(shí)現(xiàn)。
這是Mark的塔防游戲開始代碼。要在系統(tǒng)上運(yùn)行它,首先需要安裝PygameZero。完整說(shuō)明可在此處(http://wfmag.cc/pgzero)找到。有關(guān)完整代碼,請(qǐng)?jiān)L問(wèn)我們的github(http://wfmag.cc/wfmag70)。
獲取Wireframe#70
您可以在Wireframe第70期中閱讀更多類似的功能(https://www.raspberrypi.com/news/tag/wireframe/),可直接從Raspberry Pi Press(http://wfmag.cc/issues)獲得,我們?cè)谌蚍秶鷥?nèi)提供。
大結(jié)局:Wireframe#70,現(xiàn)已上市。
如果你喜歡數(shù)字形式的雜志,你也可以下載Wireframe第70期的免費(fèi)PDF?。╤ttp://wfmag.cc/70)
審核編輯 :李倩
-
編碼
+關(guān)注
關(guān)注
6文章
946瀏覽量
54866 -
python
+關(guān)注
關(guān)注
56文章
4798瀏覽量
84799
原文標(biāo)題:Python中的塔防墻建筑|Wireframe#70
文章出處:【微信號(hào):Arm軟件開發(fā)者,微信公眾號(hào):Arm軟件開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論