0

我对 Java 很陌生,刚刚开始网络,所以我提前为任何愚蠢的问题道歉。我有一个基本游戏,其中玩家(或机器人)可以在地图上移动,直到找到物品并退出,但是使用网络我希望玩家和机器人能够同时在同一张地图上玩服务器。

我有 5 节课:

  • GameRules - 控制游戏逻辑/规则
  • 地图 - 包含地图。
  • 玩家 - 代表玩家。
  • Bot - 作为机器人玩游戏。
  • PlayGame - 通过 CLI 控制与游戏的交互。

我很确定 GameRules 和 Map 将在服务器端,而 PlayGame 将在客户端,但是我不确定 Bot 和 Player 类的位置?另外,我是将 GameRule 和 Map 合并到一个类中,还是在每个类中放置一个套接字?

非常感谢。

4

2 回答 2

0

根据业务逻辑的复杂性和所需的同步时间,完全有可能将大部分内容保留在客户端级别,而只需将服务器用作更新的代理。想象一个 2 人在线国际象棋游戏。规则是如此的标准,而且时间只是来回的,所以这个游戏的“服务器”只需要从一个玩家到另一个玩家来回传递每一个动作。就像用插座代替祖父国际象棋比赛中的邮件一样。每个(客户端)方都确切地知道如何处理移动以及哪些新移动是有效的。

于 2013-03-13T08:38:13.440 回答
0

客户端-服务器游戏中的大多数模型应该同时驻留在客户端和服务器上。

  • 客户需要模型来可视化他们持有的数据;
  • 服务器需要他们根据业务逻辑修改它们——然后将中间结果发送给客户端以更新他们的模型。服务器必须这样做,因为这就是它存在的原因:通过成为唯一可以改变游戏状态的节点来保持游戏状态的一致性。

您总是可以尝试将所有模型保留在客户端,但想象一下,当您想使用 N 个客户端制作游戏时,您会陷入什么样的编码恐惧。它们都必须具有一致的状态。让一个节点(服务器)做出决定,然后其他节点必须遵循指令要安全得多。

请注意,在更高级的实现中,例如实时游戏,客户端还实现了一些预测行为来隐藏客户端-服务器延迟,从而暂时改变游戏状态,但服务器命令总是会否决客户端的决定。您还可以以这样一种方式对客户端进行编码,即使他还没有收到来自服务器的先前“移动”的确认,他也始终能够继续玩 - 当某些移动时,您必须实现回滚/校正功能被服务器拒绝。

于 2013-03-08T13:40:15.067 回答