2

我正在寻找基于 C++ 风险的网络棋盘游戏。我的想法是有一个中央服务器来托管一个游戏大厅,用户可以在其中连接和制作/加入游戏。在这种情况下,观察者模式似乎很有吸引力,因为我可以在服务器上托管所有游戏模型/逻辑,而客户端只是对此的观察者并使用视图显示当前游戏状态。

我的第一个问题:这种方法可行吗?我听到/想到的大部分内容是客户有自己的游戏模型。但是,我正在考虑对于计算量不高的游戏,由服务器托管的单个模型将具有优势(没有不同步问题,防止作弊等)。

我的第二个问题:我将如何通过网络实现观察者模式?由于我无法通过网络直接调用方法,因此我需要某种简单的方法来使用数据来模拟它。使用“拉”(观察者请求更新游戏数据)或“推”(服务器向所有客户端推送新的更新数据)方法会有更多优势吗?

4

4 回答 4

4

从您的问题陈述来看,您似乎需要实现分布式观察者模式或分布式发布/订阅。PubSub 是一种消息传递范式,可以使用 MOM(面向消息的中间件)轻松实现 - (请参阅 RabbitMQ、ActiveMQ、OpenMQ),其中 MOM 完成繁重的工作。

XMPP 也可以为您服务(参见XEP-0060)。您只需要一个 Jabber 服务器和一个 C++ XMPP 库(gloox 是一个很好的库,并且支持 XEP-0600)。

您可能还对pubsubhubbub感兴趣。

于 2010-07-28T04:51:36.670 回答
3

如果你真的想这样做,让你的具体观察者也实现代理模式。代理处理发送/接收数据,基本上将本地方法调用转换为远程方法调用。

由于您正在处理异步数据,您可能需要查找称为“发布/订阅”的观察者的变体。其中的观察是由具体的观察者监听事件,然后在他们需要通信时引发事件。例如,接收数据可能引发事件。

您还可以研究远程处理,这就是您在这里尝试做的事情。尽管对于您要尝试做的事情来说,这可能有点太重了。

于 2009-11-27T17:44:36.357 回答
0

您似乎将观察者模式用于双重目的。您的游戏客户端将“观察”服务器,但这还不是全部。他们还将把玩家信息传回服务器。所以他们真的做的不仅仅是观察。也许只使用基本的客户端/服务器范例,而不用担心“设计模式”。或者,如果您想要一种设计模式的方法,可以查看服务器作为中介的中介模式。就个人而言,我会坚持使用客户端/服务器方法。

抱歉,我知道这并不能回答您的具体问题,而只是将其作为思考的食粮。

于 2009-11-27T17:41:12.913 回答
0

对于您的第一个问题:是的,它是每个客户端-服务器游戏都使用的模型。

对于您的第二个问题:“推送”方法在定时同步和带宽切换方面更好。使用 RPC 库(远程过程调用)来模拟函数调用。如果你使用 C++,我推荐 Raknet。如果您使用 Java,我推荐 Jnag 或 proto-buffers。

于 2010-06-30T16:21:42.507 回答