物件導向的程式設計在遊戲開發中使用(六):數與抽象數

遊資網發表於2019-08-26
物件導向的程式設計在遊戲開發中使用(六):數與抽象數

我並不是遊戲開發的從業人員,甚至連軟體開發都不是,但至少我是程式設計師。

我認為,一個【物件導向】的理念在學習過程中的重要性遠大於對於程式碼本身含義的認識。 這一點可以在諸多書籍中得到論證,但很奇怪的一件事是,絕大部分的視訊入門教程和並沒有過多的強調這一點。

系列收藏夾:https://cowlevel.net/collection/3476202

嘿,你做的不錯!你已經有了一個計算器對嘛?

或者你沒有,因為這沒必要。我要做的並不是要告訴你們計算器要怎麼寫,而是要怎麼吧一個過程更加的物件導向

那麼換個問題,你們已經瞭解到了一些簡單的,封裝和職責之類的事情對吧。

但是我們並沒有從其中收穫好處,反而增加了我們的工作量

0需求

那麼這部分我們就開始著手準備一些真正使我們受益的工作

或許你還記得,我們使用了

  1. number *= 10

  2.         number += num
複製程式碼

來增加我們數字的位數,而且他很有用。正在你非常高興的時候,你(內心中的)老闆敲了敲你的桌子“嗨,你的計算器做的不錯,可惜它只能計算軟體提供的數字,我們的客戶需要它能計算其他的一些什麼,比如一個分數?”

顯然,違逆老闆不是一個好的選擇,你只能去修改你的程式碼

這部分很複雜,但是我會盡力將他講的通俗。

通俗並不是什麼好事,但在這種情況下是必要的

1功能分析

顯然我們需要一個數字,這個數字可以決定並改變自己的型別,當我們輸入新內容,這個數字將把新內容加入他們自己的後方,然後這個數字可以與其他數字做加減法。
再附加一個額外功能,我們會比較數字的種類,讓複雜的數主導運算。

因此,我們設計分為兩個部分,一個萬能數,代表一個數字,維護著數字型別和數字內容,以及一個抽象的數字,完成數字內容的工作

物件導向的程式設計在遊戲開發中使用(六):數與抽象數

2抽象數

我們的第一個抽象數實現他本來的功能

  1. var number = 0

  2. var nClass = "AbsBaseNumber"

  3. func get_class():

  4.         return nClass

  5.         pass
複製程式碼

顯然Godot的get_class並不是這麼好用


  1. func set_number(num):

  2.         number = num

  3.         pass

  4. func can_push(num):

  5.         return (num is int)

  6.         pass
複製程式碼

對輸入的內容進行判斷,而符合基本數字要求的是int

  1. func push_number(num):

  2.         number *= 10

  3.         number += num

  4.         pass

複製程式碼

把輸入的num推到自己的資料內

  1. func get_data():

  2.         return number

  3.         pass

  4. func get_number():

  5.         return str(number)

  6.         pass
複製程式碼

使用number會得到一個可顯示的字串,

而使用data則可以獲得一個可使用的data,這個data並不一定是實際上的數,可能會包含許多資訊,這些資訊會被負責計算的數字加以運用

由於我們現在只有一類抽象數,並不需要考慮一個高階抽象數被從一個低階抽象數轉換所需要的內容

同樣,我們也沒有考慮當高階抽象數運算時,get_data()該如何運作,或許在處理高階數字的時候,我們需要先獲取他的類,再用獨特的演算法對應處理這個數字

3數

在有了抽象的數字後,我們使用一個數字類來控制抽象數字

  1. func push_number(num):

  2.         if number.can_push(num) :

  3.                 number.push_number(num)

  4.         pass

複製程式碼

用來向數字推入一個符號,由於我們只有一種抽象數,因此並沒有考慮無法推入數字的情況。

我們在未來會加入“升級”方式,逐個詢問抽象數,直到有一個肯接受我們的輸入

  1. func get_data():

  2.         return number

  3.         pass

  4. func get_number():

  5.         return number.get_number()



  6. get_data會獲取數所表示的抽象數,而get_number則會返回一個可顯示在螢幕上的字串



  7. func set_number(num):

  8.         number = num

  9.         pass



  10. func can_operation(num):

  11.         return NM[number.get_class()] >= NM[num.get_data().get_class()]

  12.         pass
複製程式碼


判斷當前抽象數能否控制這個運算,或許未來會有更復雜的環境需要更復雜的條件

我們既然已經把增加數字和獲取顯示的功能交給數字處理

我們要更改核心邏輯處理相應事物的部分,

把他們修改成 get_number()和push_number()


4運算

到現在為止都一切順利,但是運算的職能被我們交給了math類來做

現在我們要收回這部分功能

但,慢著,我們把一個簡單的數字變成了一個複雜的三層結構

我們現在需要 萬能數→ 抽象數→ 數

在抽象的部分,他可以知道他自己,我們通過更高層的邏輯來限制輸入的抽象數在他處理範圍之內。

number是自身儲存的資料,而num是傳入的抽象數,我們使用get_data來獲取對方儲存的資料加以運算

  1. func do_add(num, ans):

  2.         ans.set_number(number + num.get_data())

  3.         return ans

  4.         pass

  5. func do_sub(num, ans):

  6.         ans.set_number(number - num.get_data())

  7.         return ans

  8.         pass
複製程式碼


將當前數字作為運算的控制者時,會先呼叫被控制的data,並返回一個抽象數ans

而在萬能數的部分,我們需要根據自己的抽象數建立一個相同等級的抽象數作為答案接收,放入一個萬能數的答題卡

number是自身儲存的抽象數,為了保證儲存答案的部分等級與其本身相同,我們使用自身儲存來賦值一個臨時變數來接受答案

num是傳入的一個萬能數,我們使用get_data來拿到他的抽象數

把對方的抽象數交給自身抽象數進行處理,我們在此之前需要完成等級判定

  1. func operation(num, type, ans):

  2.         var tNum = number

  3.         if type == BusiLogic.BT["ADD"]:

  4.                 number.do_add(num.get_data(), tNum)

  5.                 ans.set_number(tNum)

  6.         elif type == BusiLogic.BT["SUB"]:

  7.                 number.do_sub(num.get_data(), tNum)

  8.                 ans.set_number(tNum)

  9.         elif type == BusiLogic.BT["EQU"]:

  10.                 ans = self

  11.         else :

  12.                 ans.set_number( tNum.set_number(0) )

  13.         return ans

  14.         pass
複製程式碼

而最後,我們需要改寫這項工作之前的主人

建立一個新的萬能數,作為答案儲存

  1. var tNum = MyNumber.new()



  2.         if num1.can_operation(form[0]):

  3.                 tNum = num1.operation(form[0], symb, tNum)

  4.         else:

  5.                 tNum = form[0].operation(num1, symb, tNum)
複製程式碼

選擇合適的控制者控制整個運算

系列文章
物件導向的程式設計在遊戲開發中使用(一):類
物件導向的程式設計在遊戲開發中使用(二):方法
物件導向的程式設計在遊戲開發中使用(三):三大特性
物件導向的程式設計在遊戲開發中使用(四):五大原則

物件導向的程式設計在遊戲開發中使用(五):基本計算器
物件導向的程式設計在遊戲開發中使用(六):數與抽象數
物件導向的程式設計在遊戲開發中使用(七):享受勞動果實

作者:Kingfeng
來源:奶牛關
原地址:https://cowlevel.net/article/2053862


相關文章