Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在棋盘游戏中使用网络上的观察者模式 我想基于C++中的风险制作一个基于网络的棋盘游戏。我的想法是有一个中央服务器,它承载一个游戏大厅,用户可以在这里连接和制作/加入游戏。在这种情况下,观察者模式似乎很有吸引力,因为我可以在服务器上托管所有游戏模型/逻辑,而客户端只是观察者,并使用视图显示当前游戏状态_Design Patterns_Networking_Observer Pattern - Fatal编程技术网

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

Design patterns 在棋盘游戏中使用网络上的观察者模式 我想基于C++中的风险制作一个基于网络的棋盘游戏。我的想法是有一个中央服务器,它承载一个游戏大厅,用户可以在这里连接和制作/加入游戏。在这种情况下,观察者模式似乎很有吸引力,因为我可以在服务器上托管所有游戏模型/逻辑,而客户端只是观察者,并使用视图显示当前游戏状态,design-patterns,networking,observer-pattern,Design Patterns,Networking,Observer Pattern,我的第一个问题:这种方法可行吗?我听到/想到的大部分是客户有自己的游戏模型。然而,我认为对于一个计算量不大的游戏,由服务器托管的单一模型会有优势(没有不同步的问题,防止作弊等) 我的第二个问题:我将如何在网络上实现观察者模式?因为我不能通过网络直接调用方法,所以我需要一些简单的方法来使用数据模拟这种情况。使用“拉”(观察员请求更新游戏数据)或“推”(服务器向所有客户端推出新的更新数据)方法会有更多的优势吗 看来您使用Observer模式有双重目的。您的游戏客户端将“观察”服务器,但这还不是全部。

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


我的第二个问题:我将如何在网络上实现观察者模式?因为我不能通过网络直接调用方法,所以我需要一些简单的方法来使用数据模拟这种情况。使用“拉”(观察员请求更新游戏数据)或“推”(服务器向所有客户端推出新的更新数据)方法会有更多的优势吗

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


很抱歉,我知道这并不能回答您的具体问题,但请将其作为思考的素材。

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

因为您处理的是异步数据,所以可能需要查找一个称为“发布/订阅”的观察者变体。其中的观察是由具体的观察者倾听事件,然后在需要交流时提出事件。例如,接收数据可能引发事件


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

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


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

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

XMPP也可以正确地为您服务(请参阅)。您需要的是Jabver服务器和C++ XMPP库(GOLOX是一个很好的支持XEP -0600)。
您可能也对它感兴趣。

不过,任何GUI都不是这样吗?GUI获取用户输入并将其发送到模型,但GUI还充当使用观察者模式的模型视图。确实,一些GUI使用观察者模式更新显示状态,并使用其他方式更新用户信息。有些人实际上使用中介模式将UI与底层逻辑分离。您的连接限制是什么?我所知道的大多数游戏都使用TCP/IP连接来保持与服务器的连接,并获取关于事件的实时通知。服务器是关键设计模式之一。它也被大量用于网络游戏架构。很好的答案!我建议使用XMPP作为传输协议。使用任何XMPP客户机(如Pidgin)手动调试都很容易。请注意,您仍然需要执行以下操作:(1)序列化-从/到字符串表示封送/解封送对象,(2)路由-将收到的消息对象连接/路由到适当的观察者/侦听器对象/方法,以及(3)绑定/映射-将消息中的对象映射回方法参数(或为简单起见,映射为单个对象参数)。有用的概念参考:,请检查我是如何在此处完成的:。我在那里使用了ApacheCamel,是的,它是Java的。我也会质疑“C++”部分,如果它不是严格的要求,那么使用Java或其他更好的JVM语言(Scala、Groovy)将更有效率。