1. 程式人生 > >貪吃蛇“大作戰”(二)

貪吃蛇“大作戰”(二)

面向對象的思想 遊戲 宋體 坐標 IT 初始 距離 出現 self.

從對象出發看貪吃蛇


  在上一篇博客中,我通過逐行分析代碼對貪吃蛇的運行機制做了一個簡要的介紹;逐行分析後可以看出這個貪吃蛇例程的編寫範式更突出面向過程:該例程先是預設食物和貪吃蛇的位置參數,然後通過選擇邏輯判斷外部命令的值,根據不同的值做出不同的動作,最後在地圖上將之前的動作“渲染”,達到貪吃蛇“前進”的效果;如此下來,一步一步地根據“看得到的邏輯”實現了貪吃蛇的運行機制。

  現在,我從面向對象的編程思維來對這個貪吃蛇運行機制做一個分析。從下面這幅圖中我們看到了什麽?

技術分享圖片

  我們能看到蛇、老鼠還有它們身下的草地,換個意思說是:蛇、食物和它們的活動空間。整個貪吃蛇的運行機制就是圍繞著三個對象建立的。我們針對這三個對象分別做一個深入的分析。

  蛇

  •   蛇是動物,是會動的,所以它掌握了“動”(move)這個方法
  •   蛇是綠色的,所以它有“顏色”(color)這一屬性
  •   從圖上能看出,這條蛇有個鮮明的特征——長,所以蛇具有長度(length)這個屬性
  •   蛇會吃老鼠,所以蛇有吃(eat)這個方法,蛇吃到老鼠會長大,所以蛇每次吃到老鼠長度會發生變化

  老鼠(食物)

  •   老鼠是群居動物,假定每次只出現一只老鼠,那麽每次老鼠出現的位置是隨機的,老鼠有隨機出現的特性
  •   老鼠是棕色的,所以它有“顏色”這個屬性
  •   老鼠是蛇的食物所以老鼠被蛇吃了之後會消失,然後又出現一只老鼠,所以老鼠有存在與不存在這兩種狀態

  草地(活動空間)

  •   草地是草綠色的,所以有“顏色”這個屬性
  •   草地範圍有限,蛇和老鼠只能在草地中活動,草地有大小這個屬性

  我通過python代碼分別對蛇、老鼠和草地這三個對象做一個定義:

#蛇的類定義
class Snake(direc)
    color = green
    length = 5
    position = 0  # 蛇出現的初始位置 
    def move(self,direc):
        if  self.direc = w:
            #執行向上前行動作
        if  self.direc = s
            #
執行向下前行動作 if self.direc = ‘a #執行向左前行動作 if self.direc = ‘d #執行向右前行動作 def eat(): #判斷是否吃到老鼠 #執行吃到老鼠的操作——length += 1 #老鼠的類定義 class Mouse(): color = brown #此處定義老鼠出現的位置(草地內的隨機位置,不包括蛇的體內) #此處判斷老鼠是否存在,若不存在則刷新出新的老鼠 #草地的類定義 class grass(): color = grassgreen area = ‘20*20‘

  以上一些代碼邏輯暫用文字表現,理解意思就好,會在後續的博客以完整的代碼例程來展現面對對象的貪吃蛇運行機制(還沒開始編寫代碼)。其實原來的代碼就可以用面向對象的思想來看,我只是通過類定義把面對對象表現的更鮮明。

  列表lc可以代表蛇這個對象,它包括了蛇的長度屬性和位置信息,通過對列表操作可以表達蛇“前進”這個方法。

  列表sw可以代表食物這個對象,它包括了食物的位置,通過對它操作可以判斷食物是否存在,控制食物下一次出現的位置

  列表li則可以代表草地這個對象,它包括了草地的面積和“顏色”,通過對蛇和食物“顏色”屬性的”渲染“可以在草地上觀察到蛇和食物的位置變化信息。

  還可以通過數學知識——坐標軸來看待這個代碼例程:草地就是坐標軸(整數坐標軸)中的x軸0~20與y軸0~20聯合包圍起來的一個區域;蛇就是在這個區域中連續的幾個點;食物就是這個區域中可以隨機出現的一個點;通過對這個坐標軸體系中的這三個對象進行操作就可以實現一個簡單的貪吃蛇運行機制。

ps:這兩篇博客我都是通過文字來解釋貪吃蛇的運行機制,在下一篇博客我會開始運行這個代碼例程,並不斷完善這個例程(因為我發現這個例程其實距離真正可玩的貪吃蛇遊戲還有很大的距離,bug有點多,代碼結構也不夠合理),將我學習改善這個例程的每個細節和大家分享;最後我會以面向對象的編程範式來實現這個貪吃蛇遊戲,並爭取可以通過窗口來真正地玩這個遊戲,而不是命令行模擬。

  

貪吃蛇“大作戰”(二)