計量經濟本科在讀,斷斷續續學編程一段時間了,仍是個編程小白,一直沒有什麼連續的輸出,不能徹底解決問題,頗有挫敗感。立個flag,但願寫出來的東西通熟易懂,天天進步一點點。若有錯誤,請多多指正。java
開始以前,須要你們大體知道IP Address(IP 地址), ports(通訊端口), sockets的概念。打一個比喻,你要去一棟大樓裏面辦護照,而後你經過IP地址找到了它,而後辦護照的辦公室在201(port 想象成一個電腦上實現某個功能的application),你去到那個辦公室之後遞交了申請護照所需的材料,而後領導了護照的過程(socket 溝通的過程)。IP地址被用來給Internet上的電腦一個編號。一般每臺聯網的PC上都須要有IP地址,才能正常通訊。一個進程經過internet socket,將它的輸入與輸出,與一個特定的傳輸協議,一個通訊端口,與IP地址,關係起來。這個關係動做,稱爲綁定(binding),在這以後,就能夠經過網絡提交與接收數據(這裏咱們用的是接收發送datagram packtes)。數據庫
遊戲主要功能
- 用UDP(User Datagram Protocol)用戶數據報協議實現穩定的多人聯機飛行器隕石小遊戲。
- 主要功能菜單:
-單機玩小遊戲
-可以Host聯機多人遊戲,同步更新
-可以旁觀(Spectator)多人遊戲
-可以臨時加入遊戲,或者離開遊戲
-Score board.編程
- 遊戲規則:子彈,飛船,隕石三件套。除了飛船和飛船相撞不會損毀,其他組合都會有一方被損毀。多人聯網遊戲,活到最後的飛船得一分。單人遊戲按摧毀隕石數目得分。
- 每個用戶有一個用戶名,不一樣用戶飛船顏色不一樣
- High score persistence. 得分存到數據庫,而後Score board會從高倒低排序。
- 主要涉及的知識點有networking between the server and the client 和multi-threads.
程序結構設計
- main package asteroids有3個packages(net, gui, userTypes, model)和一個main class.
- net package有五個class,主要用於networking。
-server 包含了三個class: ClientAccepter, ShipReceiver, ModelSender分別用來接收註冊用戶,Host接收飛船, Host傳送整個Game Model給clients。
-client 包含了兩個class:ShipSender, ModelReceiver設計模式
- gui package 包含了三個class (AsteroidsPanel, Asteroids Frame, Player), 主要用來畫遊戲框架,飛船,隕石一類的遊戲物件,這些物件會根據玩家按鍵來操做。
- userTypes 有一個abstract super-class 叫作User,User有四個sub-class 分別是玩家種類(SinglePlayer, Joiner, Spectator, Host),也用到了gui package的player class。
設計模式
- MVC: 用來分開GameModel, View(AsteroidsFrame, AsteroidsPanel)和Controller(Player)
- Factory Pattern: 用在構造Asteroids, Spaceship和Bullets物件。都是super-class GameObject的subclass。這樣作的好處在於咱們的client在建立對象時,並不須要知道具體要建立對象的哪一個class。
- Observer pattern: 由於存在對象間的one-to-many relationships。因此一個對象狀態改變,咱們想要其它與之關聯的對象也自動變化。在這裏,Player是咱們的Subject class,User是咱們的Observer class (包含了Joiner, Host, Spectator和SinglePlayer).
- 其它Patterns: 有些pattern並無徹底用到。不少已經被封裝在server的實現裏。好比說Transfer Object pattern 和 Command pattern。
- Database (Score.java)用了ObjectDB。也用到Factory Pattern的概念(EntityManagerFactory)。
網絡設計
若是一個client想要參與遊戲,他須要輸入本身的用戶名和Host的IP地址。接着,用戶名,IP地址,client port number還有client的種類(也就是User 的種類)被Host Game的ClientAccepter接收,若是client是Joiner,緊接着一艘有着那個用戶名的飛船就被建立了。Host的ModelSender就知道具體哪一個IP地址須要被Broadcast整個Host的Game Model。網絡
這裏ModelSender, ModelReceiver共用一個port(想象成一個傳輸遊戲組建的application);ShipSender, ShipReceiver共用一個port; ClientAccepter用一個port (ClientRegister被包含在了Joiner class裏)。
app
- 若是client是joiner,他會接收Host傳輸來的GameModel,而後他會經過ShipSender把用戶按鍵信息傳送回Host。Host會經過ShipReceiver接收,而後計算期中的邏輯關係,更新做圖(畫新的飛船而後根據用戶傳輸過來的按鍵信息讓飛船移動)。client並不參與任何涉及遊戲邏輯(運動)的計算,只有HostGame class會進行全部的計算。
- 若是client是Spectator, 他就只會從Host的Modelsender接收到信息(ModelReceiever)。過程並無任何新的飛船被建立。
- 須要指出ClientRegister 和 ClientAccpeter的過程只在加入遊戲前創立鏈接。但其它過程如發送、接收遊戲model, 即飛船相關建立、運動(按鍵更新運動)的信息會經過網絡不斷傳輸、接收和更新。
代碼
有人閱讀的話,我就貼上代碼,繼續更。框架
遊戲組件
畫框架和飛船
網絡實現
單機
主機
聯機
觀看
數據庫鏈接