極客戰(zhàn)記地牢里的關(guān)卡主要是偏向鍛煉用戶的基本語(yǔ)法結(jié)構(gòu)和計(jì)算機(jī)思維,讓大家熟悉極客戰(zhàn)記的操作與代碼的使用。來(lái)到了森林,關(guān)卡將會(huì)變得更多更難,同樣,到了森林,大家就正式開(kāi)始接觸編程的幾大重要知識(shí)點(diǎn):條件判斷、運(yùn)算符、函數(shù)、對(duì)象屬性。
一、邊地之牢
這一關(guān)涉及的編程知識(shí)為:函數(shù)和 參數(shù),大家需要理解函數(shù)及其參數(shù)是什么東西,究竟需要如何使用,即可順利過(guò)關(guān)。
進(jìn)入本關(guān),剛開(kāi)始如果你不太明白這一關(guān)需要英雄做什么,那么你可以直接點(diǎn)擊運(yùn)行按鈕,來(lái)觀察游戲過(guò)程,你需要找到兩個(gè)要點(diǎn):現(xiàn)有的代碼是在讓英雄干什么?游戲是為什么失敗的,那么我們應(yīng)該怎么做?
這是在默認(rèn)代碼下的運(yùn)行情況,可以知道:默認(rèn)代碼的作用,就是讓英雄循環(huán)往返于上方的兩個(gè)點(diǎn),上方的敵人一出現(xiàn),就被英雄消滅了。但英雄沒(méi)有前往下方,導(dǎo)致下方的敵人擊殺了村民,游戲失敗。因此我們可以照著現(xiàn)有的代碼略作改動(dòng),增加一段攻擊下方敵人的代碼。因此,此時(shí)的通關(guān)思路為:理解現(xiàn)有代碼,對(duì)現(xiàn)有代碼略作改動(dòng),需要實(shí)現(xiàn)的功能是:巡邏保衛(wèi)下方村民安全。
觀察代碼,在以往我們的代碼都是僅有一個(gè)代碼塊,一個(gè)While True無(wú)限循環(huán)代碼塊包括了所有的運(yùn)行代碼塊,而本關(guān),除了While True代碼塊以外,還多了一塊代碼,它就是def函數(shù)代碼塊。
二、函數(shù)
函數(shù)是我們?cè)谏弦魂P(guān)接觸到的知識(shí)點(diǎn),在Python里,我們使用關(guān)鍵字 def 來(lái)定義一個(gè)函數(shù):關(guān)鍵字def是英文單詞define的縮寫(xiě),具有定義、明確的意思,我們創(chuàng)建一個(gè)函數(shù),也叫定義一個(gè)函數(shù)。創(chuàng)建函數(shù)的格式如下:
def 函數(shù)名,即函數(shù)里的代碼,也叫函數(shù)體??梢钥吹?,我們創(chuàng)建函數(shù)的時(shí)候,使用了冒號(hào),為函數(shù)創(chuàng)建了一個(gè)單獨(dú)的代碼塊。如果不記得代碼塊的概念了,可以點(diǎn)擊鏈接,回到地牢復(fù)習(xí)一下:極客戰(zhàn)記[地牢]:迷失在書(shū)庫(kù)-通關(guān)代碼及講解,調(diào)用函數(shù)的格式則是:函數(shù)名(),十分簡(jiǎn)單。
函數(shù)的作用:如果你有一段非常方便的代碼,例如尋找敵人攻擊敵人,那你要在每個(gè)可能有敵人的地方,都寫(xiě)一遍這一段代碼,十分繁瑣。
而函數(shù),就是一個(gè)偷懶的工具,我們可以把它想象成一個(gè)機(jī)器人,我們?cè)跈C(jī)器人的程序里(函數(shù)體內(nèi))寫(xiě)好代碼,當(dāng)我們需要使用這段代碼時(shí),呼叫機(jī)器人的名字(函數(shù)名加括號(hào)),就能叫出這機(jī)器人來(lái)幫忙,而不需要總是寫(xiě)一大串同樣的代碼了。
也因此,函數(shù)內(nèi)的代碼,它在沒(méi)被調(diào)用時(shí),是不會(huì)執(zhí)行的。就像圖中的函數(shù)checkAndAttack,雖然它的代碼在最上面,但它的代碼不會(huì)被執(zhí)行,而是直接跳過(guò),當(dāng)后面有需要調(diào)用函數(shù)時(shí),才運(yùn)行這一段代碼。了解了函數(shù)以后,我們?cè)賮?lái)了解一下參數(shù)。
三、參數(shù)
我們剛剛說(shuō),函數(shù)就像一個(gè)機(jī)器人,代碼寫(xiě)在機(jī)器人的程序里,因此我們可以這么理解,函數(shù)和其他的代碼,它們是互不相關(guān)的,機(jī)器人的程序(函數(shù))和正常運(yùn)行的代碼,是兩個(gè)相互獨(dú)立的程序。
因此,我們?cè)谡_\(yùn)行的代碼里寫(xiě)的一些變量,它們是不能直接使用到函數(shù)里的,因?yàn)樗鼈兪腔ゲ幌嚓P(guān)的兩個(gè)程序。而參數(shù),就是幫我們把外界變量傳入函數(shù)內(nèi)的工具。
創(chuàng)建參數(shù)的方法:def 函數(shù)名(參數(shù)名),直接在函數(shù)名的括號(hào)內(nèi)寫(xiě)上你要?jiǎng)?chuàng)建的參數(shù)名即可,你還可以創(chuàng)建不止一個(gè)參數(shù):def 函數(shù)名(參數(shù)名1,參數(shù)名2,參數(shù)名3……):參數(shù)就是一個(gè)變量,它是專門(mén)用在函數(shù)里的,你可以提前寫(xiě)好它們各自要做的工作:
def Test(t1,t2):
hero.attack(t1)
hero.say(t2)
然后我們?cè)侔错樞?,在調(diào)用的時(shí)候把我們的變量傳入?yún)?shù)里:
def Test(t1,t2):
hero.attack(t1)
hero.say(t2)
enemy1 = hero.findNearest
Enemy()
word = "你好!"
Test(enemy1,word)
Test(enemy1,word),就是把enemy1作為t1,word作為t2傳入了Test函數(shù)里,這樣此時(shí)執(zhí)行Test函數(shù)的時(shí)候,英雄就是去攻擊enemy1,并說(shuō)“你好!”
明白了這兩個(gè)知識(shí)點(diǎn)以后,我們?cè)倏吹疥P(guān)卡里的代碼:此時(shí)我們就知道,上方一個(gè)代碼塊,是系統(tǒng)已經(jīng)幫我們寫(xiě)好的攻擊敵人,并回到中心點(diǎn)的代碼塊,無(wú)需修改。那么我們以目前while True內(nèi)的代碼作為模板,寫(xiě)出攻擊底部敵人的代碼:移動(dòng)到下方X標(biāo)記處。
到達(dá)下方后,尋找最近的敵人,使用checkAndAttack()函數(shù)攻擊下方新找到的敵人,通關(guān)代碼。