在网络上使用观察者模式进行棋盘游戏

时间:2009-11-27 17:28:10

标签: design-patterns networking observer-pattern

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

您可能也对pubsubhubbub感兴趣。

答案 1 :(得分:3)

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

由于您正在处理异步数据,因此您可能希望查找名为“publish / subscribe”的观察者变体。这些观察结果是由具体的观察者听取事件,然后在他们需要交流时提出事件。例如,收到数据可能会引发事件。

您还可以查看远程处理,这是您在此尝试做的事情。虽然对于你想要做的事情来说可能有点太重了。

答案 2 :(得分:0)

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

对不起,我知道这不能回答你的具体问题,只是把它作为思考的食物。

答案 3 :(得分:0)

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

对于你的第二个问题:在定时同步和bandwitch方面,“推”方法更好。使用RPC库(远程过程调用)来模拟函数调用。如果您使用的是C ++,我推荐Raknet。如果您使用的是Java,我建议使用Jnag或原型缓冲区。