2013-03-08 185 views
0

我對Java很陌生,剛剛開始網絡連接,所以我提前爲任何愚蠢的問題道歉。我有一個基本的遊戲,玩家(或機器人)可以在地圖上移動,直到找到項目並退出,但使用網絡我希望玩家和機器人能夠在同一地圖上同時在服務器。Java網絡 - 客戶端和服務器

我有5類:

  • GameRules - 控制遊戲邏輯/規則
  • 地圖 - 包含地圖。
  • 玩家 - 代表一名玩家。
  • Bot - 以機器人的方式進行遊戲。
  • PlayGame - 通過CLI控制與遊戲的交互。

我很確定GameRules和Map會在服務器端,而PlayGame會在客戶端,但是我不確定Bot和Player類在哪裏?另外,我是否將GameRule和Map合併到一個類中,或者在每個類中放入一個套接字?

非常感謝。

+0

無論如何,您最終必須在兩個項目之間共享代碼。這是服務器 - 客戶端架構的命運。 – nurettin 2013-03-08 13:38:17

回答

0

客戶端 - 服務器遊戲中的大多數模型應駐留在客戶端和服務器上。

  • 客戶端需要模型來可視化他們所持有的數據;
  • 服務器需要它們根據業務邏輯對其進行修改 - 然後將中間結果發送給客戶端以更新其模型。服務器必須這樣做,因爲這是其存在的原因:通過成爲唯一可以改變遊戲狀態的節點來保持遊戲狀態一致。

您可以隨時嘗試在客戶端保留所有模型,但想象一下當您想與N個客戶端進行遊戲時,您會爲自己編入什麼編碼恐怖。他們都必須擁有一致的狀態。讓一個節點(服務器)做出決定,然後其他節點必須遵循指示,這是更加安全的。

請注意,在更高級的實現中,如實時遊戲,客戶端還實現了一些預測行爲來隱藏客戶端 - 服務器延遲,從而暫時改變遊戲狀態,但服務器命令總是推翻客戶的決定。您還可以以這樣的方式對客戶端進行編碼,即使他沒有收到來自服務器的先前「移動」的確認時,他總是能夠繼續播放 - 您必須在某些移動時實施回滾/更正功能被服務器拒絕。

0

根據所需的業務邏輯和同步時間的複雜性,完全有可能將大多數所有內容都保留在客戶端級別,而只是使用服務器作爲更新代理。想象一下2人在線國際象棋遊戲。規則是如此標準,時間只是來回,所以這個遊戲的「服務器」只需要通過一個玩家來回移動。會像用插座替換祖父棋牌賽中的郵件。每個(客戶)方都知道如何處理移動以及哪些新移動是有效的。