許毅的那個精簡版的小虛擬機器核心在他回來後的幾天內很快就完成了。虛擬機器模擬的是計算機的硬體,相當於人的身體,但還沒有靈魂,也就是計算機的軟體。虛擬機器是作業系統中的計算機,而在虛擬機器中執行的軟體則是軟體中的軟體了。由於這是精簡了的虛擬機器,只能支援少數的一些機器指令,所以編寫虛擬機器能夠執行的程式時,也得注意只用到這些指令的功能,否則就會報錯,說指令不能識別。
現在完成的這個虛擬機器核心就相當於一個CPU,許毅接下來要做的就是給這個光禿禿的CPU加上其他硬體資源,例如加入圖形化的輸入輸出介面,加上虛擬記憶體等。
再經過幾天時間,這些七七八八的組建總算完成了,最後將他們很好地組合起來,整合在一個大軟體中,最後許毅還在外面加上了兩層加密效能絕好的“殼”。許毅有美術功底,所以他特地還進行了一下介面美化。根據許毅原來的構思,他將這個遊戲命名為“達爾文生存”。
遊戲編寫好之後,他自己沒怎麼玩,因為在他看來這實在是太簡單,沒意思。然後他把這個遊戲傳給周松,讓他試試。周松確實對這個表現出很大的興趣。於是,獲得許毅同意之後,他將這個遊戲放到了論壇上。結果令許毅大為失望,對這個遊戲感興趣的人並不多,而且這些人也只是玩個新鮮而已,等知道怎麼回事了,他們就將其拋棄了。周松做了調查,大家一致認為這個遊戲實在是太缺乏趣味性,程式編寫之後,幾個小黑點在顯示器上移動,然後就這麼等著。看他們慢慢爬動,接著結果就出來了……太無聊了!
這個時候,他們提出,最好能夠將這個遊戲複雜化,例如動作多樣性、更具挑戰性,遊戲更加熱血等等……
倒!許毅看到他們的回帖之後真想抽他們。他辛辛苦苦把這個東西編寫出來,結果沒人欣賞,失策啊!許毅這次“寓教於樂”的嘗試就這樣胎死腹中。
不過。許毅還是沒有放棄,這些人的建議給了他靈感,連他自己都對他們提出的這個遊戲感興趣起來。許毅接下來的很長一段時間都化在那個黑客遊戲的構思和設計當中,按照他的構想,如果這個遊戲編寫成功。極有可能形成一個大型地賽事……
許毅現在上課不睡覺了。取而代之的是趴在課桌上發呆,有時候又會突然拿起筆,在稿紙上記錄著什麼。顏玉看得奇怪,多次詢問許毅是不是出了什麼事情。她也看過許毅紀錄在稿紙上的東西,都是一些框圖或者程式碼之類的,她一點都看不懂。
許毅考慮到,把程式碼完全放到虛擬機器中執行這個方法現在還沒有條件實現。因為虛擬機器編寫的工程難度實在太大,同時需要很長的時間和極大的精力。另外,他編寫這個遊戲地目的是用來增加大家學習程式設計的興趣,提高程式設計水平,所以他改變了起初的想法,不再去編寫一個完整的虛擬機器。而是模擬系統,程式碼還是交給實際地計算機去執行,沒有必要重新編寫一個虛擬機器。
模擬,顧名思義,模模擬實。也就是用一定地手段去建立相關模型。模仿現實生活中的一些具體存在的東西。例如某個小區的整體規劃模型就是一種實物模型模擬,屬於實物建模,用實物把想要表現的東西用模型做出來。另外還有一些抽象的模擬,例如虛擬現實模擬和純粹的數學模擬等。虛擬現實是用計算機技術把現實地東西做成動畫(二維、三維)的形式,這裡計算機及軟體就是用來模擬的工具;純粹的數學模型則是純抽象的概念,沒有形象的表現方式,用數學函式來表示系統,數學函式就是它地工具。
許毅所採用的方式就是虛擬現實模擬,以二維的動畫形式表現出來。經過幾周的構思和設計,他終於將整體框架大致完成。他將這個遊戲命名為“生死鬥”,正如其名,這個遊戲的主要行為就是各個“角鬥士”進行生死角鬥,不論是單打獨鬥還是進行大混戰,目的就是要殺死對方,贏得角鬥。
整個遊戲最重要的是模擬系統的服務端-Figenven,全部的資料和指令都是Figenven當中處理並執行的,它就相當於遊戲的心臟,遊戲者並不能看到它,只是在底層執行。當然,Figenven提供一個虛擬場地-Figenven,也叫“鬥獸場”。所有參加角鬥的角鬥士的外在圖形表示都是在這個鬥獸場中進行角鬥。
實際上可以說是模擬系統服務端包含兩個程式:Figenven和Fignin。
Figenven負責“角鬥士”的移動、與客戶端(Clien)進行通訊、按照一定的規則控制遊戲的程序。
Fignin,即鬥獸場,則負責利用作業系統的圖形顯示功能在Figenven中顯示虛擬場地。Figenven可以同時和多個Fignin相連,這樣,大家就可以在多個顯示器上同時顯示生死鬥遊戲的情況。
有服務端,自然必有客戶端(Clien)。生死鬥的客戶端(Figenven)是由遊戲參與者編寫。它相當於“角鬥士”的大腦,指揮著角鬥士的運動和動作。客戶端和服務端的通訊是透過UDP/i協議進行資訊互動的,所以,遊戲者可以實用支援UDP/i協議的任何程式系統。透過這種資訊互動,客戶端傳送指令去控制鬥獸場中的角鬥士,同時,角鬥士還可以反饋一些資訊給服務端。
遊戲中的“角鬥士”是一個抽象的資料模型,“他”由著自己的一些屬性:運動和戰鬥。運動有“走”、“跑”、“加速”、“減速”、“轉身”……等等等等,許毅設計得很詳細,基本是按照一個人的實際情況來的。戰鬥模型許毅則簡化了,只有“拳擊”、“腳踢”這兩種攻擊以及相應的防禦動作而已。其實這個設計並不難,按照面向物件的設計思想,將“角鬥士”抽象成一個物件,其他的都是他的屬性,而屬性也還可以是物件,也就是說屬性也可以有屬性,依此類推……
…………
整個工程是非常龐大的,所以許毅在開始的時候並沒有急著動手編寫,而是仔細反覆地思考、補充。不但從全域性考慮其整體結構,還得注意以後要新增新的功能。畢竟,現在他的構思相對來說,還比較粗糙,還有很多細節沒有考慮到,到時候肯定會要升級。作為一個大的專案,這些因素都是必須考慮的。需求分析,可行性分析……這些都是軟體工作聽知識,沒有參與過大型的專案開發的人是體會不到這些步驟的重要性的。次等的程式設計師通常是想到什麼就立刻動手,準備工作什麼都不做,就這麼編下去,碰到問題再臨時解決,到最後甚至還會加上一些令人難以接受的程式碼。於是,最終編寫出來的原始碼已經是“慘不忍睹”,甚至隔了一段時間之後連他自己都讀不懂這些程式碼了。這種憑自己的感覺編寫軟體的方式在應付小軟體的時候通常不會出什麼問題,就算出了問題,從頭再編寫就是了,不用花多少時間。但遇到大型軟體的時候,這種開發方式往往能夠逼人去撞牆。編寫小部分都得花上幾個月的時間,哪有這麼多時間讓你去從頭開始?真正有經驗的程式設計師都知道“磨刀不誤砍柴工”的道理,他們首先會仔細規劃,整個程式會分為幾個部分,估計以後將要進行那些功能的補充等等……他們將這些經驗提取出來,然後經過科學研究,抽象出軟體工程學這門學科。
當然,絕大多數駭客的程式碼編寫習慣在正統的程式設計師眼中都不怎麼好,他們對程式效率的追求近乎苛刻,於是,他們的作品當中往往會出現一些生澀難懂的程式碼,這些程式碼是那麼的奇怪,以至於那些規規矩矩的程式設計師想破頭皮也百思不得其解。他們往往會發出這樣的感嘆:“這樣也行?”、“變數怎麼可以這麼用?”、“天!這個演算法太巧妙了,他到底是怎麼想到的?”……這點可以從Linu編寫的Linu原始碼中找到例項。
許毅編寫的這個工程有點大,可以說是他第一次獨自一人開發這麼大的專案。給顏玉編寫的那個“超級駭客套裝”雖然貌似看起來很大,但那些軟體都是一些獨立的小軟體組成的難度並不是很大。而他現在編寫的這個“生死鬥”就不同了,整體聯絡非常,他不但要編寫整個模擬系統,而且還制定遊戲規則,最要命的是要將這些遊戲規則整合程式當中去。所以他才花那麼大的時間來進行構思和設計,因為如果以後遊戲規則有所變動,那麼軟體也要進行相應修改,非常麻煩。