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