最近在用python寫一個命令行遊戲:升(jian)級(hua)版植物大戰殭屍,順便鞏固一下python編程技巧。在這個過程當中,也收穫(cai)了很多樂趣(keng)。目前1.0版已經在GitHub上發佈,這是連接。今天就把全過程與你們分享~~~python
既然是植物大戰殭屍,確定要有遊戲盤。我想在一開始儘可能簡化遊戲,因此用了一個一維數組:git
# game.py board = [0] * 10
我想先無論陽光的問題,用一個類實現基礎的植物大戰殭屍角色的功能。github
先上代碼,基本功能都有了:面試
# game.py board = [0] * 10 class GameObject: indicating_char = 'o' # 在命令行顯示的字符 def __init__(self, pos): """ 初始化,並把本身放上游戲盤 """ if pos in range(10): self.pos = pos if board[self.pos] == 0: board[self.pos] = self else: print("Position already used.") def __str__(self): """ 字符串表示 """ return self.indicating_char def __repr__(self): """ Python shell/print顯示 """ return self.__str__()
嗯,去IPython裏面試試看!shell
In [1]: import game as g In [2]: g.board Out[2]: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] In [3]: g.GameObject(0) Out[3]: o In [4]: g.board Out[4]: [o, 0, 0, 0, 0, 0, 0, 0, 0, 0]
不錯!可是,也該爲後續程序想一想呀。好比,要讓向日葵每步生產必定的陽光,或讓最後一個殭屍死去時結束遊戲,這些方法都應該在基礎類中定義。因而,我在GameObject
類中追加了這些代碼:編程
def step(self): """ 每步執行的操做 """ pass def die(self): """ 死掉時的操做 """ pass
好吧,兩個空方法,但很快,GameObject
的子類們就會重寫它們,使它們變得有意義的!數組
對了,說到子類,咱們就先從植物開始吧!ui
先想一想一株《植物大戰殭屍》裏的植物該有什麼屬性和行爲吧。除了基礎類裏定義好的以外······陽光!種植植物須要陽光,這不就是屬性嗎?還有,當初始化一株植物時,扣除必定的陽光,不就是行爲嗎?來,先把這些實現了!命令行
先在遊戲盤定義的後面加上一行:debug
sunlight = 50
而後就是植物基礎類Plant
:
class Plant(GameObject): indicating_char = 'p' def __init__(self, pos, sun_required): super().__init__(pos) global sunlight if sunlight >= sun_required: sunlight -= sun_required else: print("Sunlight not enough.")
好,這就成了。按照慣例,到IPython裏試一試(注意!第一個坑):
In [1]: from game import * # 坑! In [2]: Plant(0, 50) Out[2]: p In [3]: sunlight Out[3]: 50
TMD怎麼可能!!!難道sunlight不該該是0嗎?!本身debug半天無果後我決定上思否提問。感謝思否!我上午提的問,下午就有了答案。因而,我趕快又去試了試:
In [1]: import game as g # 命名空間問題!!! In [2]: g.Plant(0, 50) Out[2]: p In [3]: g.sunlight Out[3]: 0
成功!
下次,我將秀出真正「看得見」、也一直沿用至今的兩個類:Sunflower
和Peashooter
。還有,咱們的敵人:殭屍的基礎類也該出場了!歡迎來看哦!