廠內物流規劃設計

所謂廠內物流如果去掉工作人員,那麼我認為就有以下幾點:

生產線平衡。

工作地佈置規劃。

物料存儲區規劃。

那麼在游戲裏,有體現的就比如:小小大工廠(Little Big Workshop),這個游戲如果你要真以用最快的速度完成的話,你就必須要考慮到上述三點。否則,你的員工就會滑水摸魚。

再比如異星工廠(Factorio),這個游戲的火車,本質上就可以理解成「物料存儲區規劃」。在物流規劃里,這部分有幾個要素:

對於大價值的零件,要有最小臨時庫存。對於小價值零件,要根據包裝的收容數確定。

具體到游戲裏,對於大價值零件。比如藍板,衛星等。都是現場製作,現場使用。對於小價值零件,比如銅鐵礦,直接集中擺上若干個廠就完事。

包裝形式根據具體情況制定。

具體到游戲裏,根據生產區的實際流量大小和生產要求。選用正確的包裝形式,要麼選傳送帶上貨品,要麼選無人機一次多個。

再者,需要考慮到工位(也就是每一個工廠)需要從包裝中取勝貨物的(比如人運,分揀器和機械爪)。那麼這樣,一個工廠的基本結構就出來了

考慮物流成本,物流成本在要綜合考慮廠區自身資金和供應商運輸壓力

具體到游戲裏,所謂工廠本身的資金就是你的肝。玩這游戲,你的生產成本有兩個:一就是你的肝,二就是游戲裏的地皮。而供應商的運輸壓力其實是不存在的。游戲裏不存在供應商壓貨的需求。

在了解以上理論以後,再去掉游戲中根據不需要考慮的合理性要求。那麼,設計一個工廠最簡單,最好想的形式就出來了:總線。

從這個角度考慮,物流塔的存在,使得物流成本大幅度降低。在物流成本極大降低增加的情況下,「物料存儲區規劃」就不存在問題。那麼,玩家所說的游戲體驗降低就是一個客觀存在。

廠內物流規劃設計-論

根據上述觀點,限制物流塔是必須的。那麼,假定持有這種觀點,物流塔應當如何限制,才能保證游戲樂趣呢?同樣,也要從上述理論考慮:

1. 限制物流塔的數目是不足夠的,物流塔的存在就是一種技術突破。而對於任何一種理論,只要技術突破了就一定不能只從舊的理論的出發。比如,當相對論出現以後,雖然經典物理體系一樣能用,但是用的時候就一定要注意使用范圍。

那麼,對於這裏也是一樣的。比如限制為:一星一塔三本地(即一個星球一個星際物流塔,三個本地物流塔),這個不能完全解決問題。一塔三本地就是5個物料輸入。那麼我只要有兩個星球,就是二塔六本地。經過簡單的設計,就可以避開限制。

具體到游戲裏:最麻煩的綠糖,其實可以分成兩部分,引力透鏡和量子晶片。你給他溯源一下,就發現,這兩種材料都可以在有三個星球的星系裏,使用一星一塔三本地的限制,完成大規模生產。

2. 在不限制物流塔的情況下,可以考慮增加物流塔的成本壓力。對於現有的物流塔來說,他降低了運輸成本。那麼,可以給他加回去,讓你用的時候要更加小心。雖然說,這游戲的主要成本是肝。但是實際上,在游戲裏,運輸成本其實是電,飛船和曲鞘。因為運輸船每次外派都要消耗電,飛船和曲鞘。不過,這裏飛船是可回收的。

那麼,在這種情況下,增加運輸成本就有兩種思路:

* 增加消耗器的消耗,這個不可取。消耗器用肝就能補齊,而用肝補的東西都是惡心玩家。

* 增加飛船的消耗,這個可取,游戲裏現在的飛船非常簡單無腦。那麼,如果將星際飛船變為《X4:基石》的那種呢?即:星際飛船是一種需要玩家自行製作的,可以搭乘的,可以配置的中型產品。玩家生產每一架飛船都需要消耗巨量的物資,以此限制飛船數目。

同時,每一架飛船不再只服務於一個物流塔,而是可以服務於多個物流塔。那麼這時,就需要設計星際間物流。這樣的修改是增加游戲內容。

綜上,有如下建議:

1. 將星際物流塔的工作范圍限制在本星系

2. 在星系間,增加一個比如名為「貨棧」的巨構。玩家需要首先建設「貨棧」才能開啟跨星際運輸,物流塔把所有的星球資源送入「貨棧」

3. 在「貨棧」里,玩家可以消耗大量資源建設星際運輸船。星際運輸船在建設以後,擁有超大量的空間,可以在貨棧之間運輸貨物。

那麼這樣,看上去就比原來更加費肝。但是,這一些就不再建立在惡心玩家的基礎上了。好用的東西一樣好用,要你設計的東西還是要設計。而且,理論高度更上一層樓。異星工廠,你只是在一個星球上搞三搞四。

而這個,則是考慮在整個宇宙里遨遊四方。

面向過程程序設計

我玩游戲有幾個層次和目的,一來是享受游戲本身的樂趣。二來是理解游戲的實現方式。三來是思考游戲對現實世界的啟發。那麼具體到本游戲裏,就是這樣的:

在沒有物流塔之前,生產線的設計是「自頂向下,逐步細化」這是一種面向過程的程序設計思路。在這種思想的指導下,就會有一個必然的產物:函數。人們總是期望復用已經寫好的內容和模塊。所以,在面向過程階段,使用了函數做為復用單元。什麼是函數?函數就是根據指定輸入,輸出指定內容。具體到游戲裏,就是一個大家耳熟能詳的詞:黑盒。

所謂「黑盒」,在異星工廠那裏,就是有設計過的生產線,用最低的成本設計一個生產效率最高的模塊。這個要求與函數何其的相像?在每一個程序里,程式設計師對於函數的設計都是無止境的,任何一個函數都需要進行優化。這是我認為黑盒的理論來源。那麼,如何優化「黑盒」?如何優化「函數」?優化函數不過就是兩個指標「時間復雜度」,「空間復雜度」,那麼優化黑盒也是一樣。

具體到游戲裏,你需要對黑盒的生產時間進行調整,選用合適的配方,可以讓黑盒在同樣的時間生產更多的內容。選用合適的傳送帶佈局,就可以讓你的黑盒更加緊湊。這對於每一個程式設計師而言,都是老本行。

我在公司培訓的時候,對於完全無基礎的員工,有要求他們去玩一下 異星工廠。我的作業很簡單,設計一個藍板的黑盒,不許抄別人的作業,要從 「時間」和「空間」 兩個維度分析我為什麼要這麼設計。

面向對象程序設計

但是,物流塔的出現讓設計思想有了進一步的升華。物流塔出現以後,玩家可以使用模塊為單位對工廠進行設計。那麼,這時指導理論就變成了面向對象程序設計。在面向對象程序設計中,需要考慮的問題就不再是某個函數的效率,而是整個系統的復用性。

那麼,這時就會發現,最優解變成了面水黨。如果不知道如何弄的可以參考我之前的帖子。這也是為什麼我瘋狂的吹物流塔。我同樣給我的學生留了一個作業:

在戴森球計劃里,如何體現「高內聚,低耦合」的程序設計思想

那麼,答案就很顯而易見,並且非常簡單了。面水黨通過把每種產物都分解開來,每個產物增加了不同的物流塔進行生產,生產線之間沒有互相影響的情況。更換一個生產線,只要生產速度相同對整體沒有影響。這個就是「低耦合」。而生產線之間的生產過程使用工廠進行,修改時也只針對本工廠和本物流塔,這個就是「高內聚」

那麼,試問對於一個已經進入面向對象階段的程式設計師。你要給他多少好處,才能讓他重回面向過程呢?我認為,現實里很簡單,你加點錢,不要說面向過程,面向二進制我也做。但是,游戲裏我認為是給不起的。

領域驅動設計

在面向對象的程序設計里,有一個重要的概念就是「最小知識原則」對於一個類而言,他要認識最少的內容。所以,才會有設計模式。比如工廠模式,就是通過「封裝性」隱藏掉了「具體的產品」,只向外界暴露出工廠類,產品抽象類 兩個知識。

那麼,所謂「最小知識」就可以理解為一個概念的邊界。這就引出了現在最熱門的程序設計思想,領域驅動設計(DDD)。

具體到游戲裏,每一個物流塔都可以感知到整個宇宙里所有其它的物流塔,那麼就相當於他認識了全宇宙所有的知識,這顯然不符合一部分玩家的理解。那麼,詬病他也是應該的,同樣,修改他的也不應該是限制他的數目。因為,一個類被實例化以後,你限制他在函數裏的實例個數,就相當逼迫程序多開幾個函數。這是完全搞人肝的做法,完全沒有意義。同樣,還是我剛才的建議:

1. 將星際物流塔的工作范圍限制在本星系

2. 在星系間,增加一個比如名為「貨棧」的巨構。玩家需要首先建設「貨棧」才能開啟跨星際運輸,物流塔把所有的星球資源送入「貨棧」

3. 在「貨棧」里,玩家可以消耗大量資源建設星際運輸船。星際運輸船在建設以後,擁有超大量的空間,可以在貨棧之間運輸貨物。

從程序設計思想的角度來看他,所謂「貨棧」就是一個模塊的邊界(接口)。只有「貨棧」才能開啟星際運輸,意味着只有「邊界」才能與其它模塊進行數據交換。

所謂星際物流塔只能在本星系工作,就是將領域的邊界明確化。本星系就是一個領域,他只負責生產一種/一些產品,而通過「邊界」與外界進行數據交互

所謂的「復雜星際運輸船」指的是領域間數據交換的成本。在DDD使用的場合里,數據的交換成本有些是很高的。所以用這個進行模擬。

同樣在的,在DDD里,「微服務」是一個很火熱的概念。那麼,我的建議就可以理解為每一個星系都是微服務中一個模塊。星系運輸船相當於在微服務之間有帶寬限制的網絡環境。那麼,如何設計就是一個可以研究和討論的問題。

戴森球計劃-物流塔及生產線設計指南