[FlyPie's Tank Factory]程式蠱 沉睡了兩年的專案意外的發揮了作用

Day 3,374, 22:10 Published in Republic of China (Taiwan) Republic of China (Taiwan) by flypie

仍然繼續自耕....

防機吃



上一份報紙我有淺淺提到Space Simulator這個專案,不過沒有做太多解釋,這篇報紙會稍做詳細的解釋。
一切都要從兩年前說起......

我高三(高職)的時候在電腦課上無聊寫了一個在二維空間中使粒子亂飛的程式,然後我想,何不試著讓這些粒子像月球繞著地球一樣運動?接著使用三角函數寫出單純的圓周運動(數位類比鐘的基本寫法),到後來試著加入萬有引力常數和質量,把八大行星都丟入這個二維模型內,最後用質點系統和指標(pointer)模擬火箭和衛星的發射(指標使我可以取得多級火箭的總質量,並使多級火箭分離成為可能),那個時候我僅依靠牛頓三大定律的公式,讓一個小小的二維太陽系在我的電腦內運作,還試著用我設計得非常爛GUI(圖形化用戶界面)把衛星送入軌道。
到這一步,只因為我在此不久前曾接觸Kerbal Space Program這款遊戲和這段影片(https://www.youtube.com/watch?v=WecHubjGQIw)的影響。
高三那一年,學校有樂高機器人的課程,加上那不久前(兩年前)好奇號才登陸火星,於是我一直著迷於如果我能讓機器人登陸火星那會是多美妙的事啊!於是我想寫兩組程式,一組作為物理模型運算行星以及飛船的運動;另一組作為自動控制,模擬將飛船從地球導航到火星的程式。
(多虧了那個時候為了寫這專案,複習了不少力學,才讓我在大一修普通物理和大二修靜力學這麼輕鬆)

那個時候的成品我也有發報紙(https://www.erepublik.com/en/article/-flypie-s-tank-factory-1-2488264/1/20)

之後就是我上一篇報紙提到的,我要把主力放在太空這件事上面,從2016-12-05開始試著用OpenGL寫東西,中間因為遭遇期末考中斷開發了3周,一直到2017-01-18物理運算的部份大致完成,開始要加入駕駛飛船的部份。沒錯,我說「飛船」不是「衛星」,後來把程式的目標放在「模擬近未來宙域戰爭」的方向去了,反正駕駛和軌道切換等等和上太空的原始目的不衝突,而且這樣更容易吸引大眾目光(?),前面也提到我加入了某個學校的單位,總要生產出一些可以展示的東西,過於學術性就不好作為展示用途了(仔細想想我的戰車也是這樣來的吧=_=)。
總之到2017-01-18為止,成果大約如下:
簡單的繪圖以及重力運算測試 https://youtu.be/QTvsrQxrXcE
加入飛船物件以及三維雷達的HUD https://youtu.be/ZMH1CObTGxQ
第二個影片其實在暗示「我掌握了三維旋轉的公式」這件事,當時花了不少時間在啃這東西的資料上面,
第二個影片的狀態其實很好理解:有一個攝影機被丟在太空中,而且自帶角速度,在動者恆動的定律下,它會一直旋轉到天荒地老。
先不提程式還有一些BUG,比如說三維雷達(特定角度會不依照預期的跳動),寫到這裡的時候頭腦已經有點混亂到快要不知道自己在寫什麼了。

不同於遊戲,我不能想讓飛船怎麼動、怎麼轉;就怎麼動、怎麼轉。一切必須要有物理基礎,對現代航天器稍微有點概念的人大概知道這些航天器在太空中要轉向要仰賴一種名為RCS(姿勢控制系統)的東西,(用飛輪轉向的ISS先不提),以雙子座計畫的飛船為例,需要32個小型火箭引擎來讓太空艙轉動並固定在某個姿勢。



也就是姿勢的控制,如果讓一個人控制32個引擎的推進與否是無法完成,這個部份需要仰賴電腦將駕駛者的意圖轉換成能夠驅動飛船的訊號來控制這32具小引擎,換句話說如果我要作到這點,我需要在寫一組飛船的作業系統放到我所謂的模擬器裡面,如果只是這樣還不足以讓我混亂。

為了能把「駕駛太空船」這遙遠的體驗帶給大眾,這個模擬器的可塑性必須很高,從最簡單的引入曲速引擎,讓沒有任何軌道概念民眾也能體驗,到最複雜可以打指令和飛船作業系統溝通的高端玩家。
首先,我不能把飛船寫死在程式裡,要能夠用載入檔案的方式,使飛船的種類有無限的可能,因為飛船的不同(硬體的配置就不相同,飛船質量、引擎的效率、RCS的配置等等),飛船的作業系統也必須不同,
不過「載入另一個程式到程式裡」這件事超出當時的我能力所及,加上太陽系+飛船+引擎種種資料結構的規劃已經讓我陷入沒有頭緒的地步,就只好先把專案放一旁,過年去了。

(上下文有關連)

兩年前,高三的時候學校有上C語言的課(用來寫單晶片),不過同學普遍興趣缺缺,都利用電腦課打game,高三快畢業的時候,突發奇想,想讓寫C這件事變得更有趣味性,或許可以勾起同學們興趣。我一直認為這遊戲(http://armorgames.com/play/15988/solarmax-2)有發展成競技遊戲的潛力,於是我就借用了裡面「比大小,多數優勢」的概念,製作了一個規則簡單的遊戲(https://youtu.be/PdqwF0GdaIU)。
領地以格子的方式呈現,如果1個格子處於佔領(除了自己有兵力沒有其他敵人),每一回合就會增加1個財力,如果有兩個以上的勢力都有兵力,就會進入交戰,兵力會被耗損,
耗損的公式:A'=A-(B+C+D+E)/2,
舉例現在一個地塊上有A、B兩個勢力,兵力分別是70、80,那麼雙方的兵力會如下變化:
70 80
30 45
7 30
0 26
最後由B取得佔領。
財力可以以1:1的比換成兵力,並在自己佔領的任意地塊上投入兵力。除了購買兵力,還可以藉由call function將指定數量的兵力調度到上下左右的地塊去。當時寫了3個AI作為示範,
一個會一直往右上角跑、一個具有隨機性的侵略性(影片中的紅色)、一個會搶無主地但是絲毫沒有侵略性(影片中的黑色)。
最後......同學還是繼續打game,我的計畫失敗了xdd

後來在大學碰到一位學長,他論文是寫機器學習方面的,他看到我寫的這個東西表示有興趣,因為可以用在機器學習上(讓AI學習怎麼玩這個遊戲),我把源碼給了他,他也試著以源碼為基礎另外撰寫他的想法,也和他以這程式為話題聊了不少天,不過學長後來忙於業務,沒有太多時間可以寫這個。

載入AI到程式內進行戰鬥......載入程式到另一個程式內執行......恩?這不就是我現在需要的嗎!
於是過年後2017-02-05開始,我就以重建這個程式為目標,並一邊學習怎麼載入程式到另一個程式,
最後得到了這個(https://youtu.be/-BwoOr0KsqE),Alpha.so.0.3其實就是原本的黑色帝國那組邏輯,Beta則是以前者為基礎再加上侵略性。
(沒有說等於而是說邏輯是因為後來我只用了一半的行數就寫出原本的AI,而且還消除原版帶有的BUG....)

這篇主要是想把最近寫的東西拿出來報告一下進度,順便澄清沒有偏離主要專案,Space Simulator的細節可能就等到下一篇吧(>WO)