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