.net 基于回合的棋盘游戏的网络通信

.net 基于回合的棋盘游戏的网络通信,.net,network-programming,c++-cli,.net,Network Programming,C++ Cli,我的第一个问题是,如果出现问题,请不要太苛刻:) 我目前是一名CS学生(来自德国,如果这些信息有任何用处的话;),我们得到了一份免费的可选择编程作业,我们必须在C++/CLI Windows窗体应用程序中编写。 我的团队,另外两人和我,决定采用网络兼容的棋盘游戏风险端口 我们将工作分为3个部分,即UI、游戏逻辑和网络。现在我们要做的是让所有的东西一起工作,最大的问题是,如何让客户机彼此同步 到目前为止,我们的方法是,每个客户都拥有计算和/或执行所有可能操作所需的所有信息。实际上,除了游戏初始化阶

我的第一个问题是,如果出现问题,请不要太苛刻:)

我目前是一名CS学生(来自德国,如果这些信息有任何用处的话;),我们得到了一份免费的可选择编程作业,我们必须在C++/CLI Windows窗体应用程序中编写。
我的团队,另外两人和我,决定采用网络兼容的棋盘游戏风险端口

我们将工作分为3个部分,即UI、游戏逻辑和网络。现在我们要做的是让所有的东西一起工作,最大的问题是,如何让客户机彼此同步

到目前为止,我们的方法是,每个客户都拥有计算和/或执行所有可能操作所需的所有信息。实际上,除了游戏初始化阶段(添加玩家、选择地图等),客户机拥有所有可用的信息,这需要一个“超级客户机”和一些额外的东西来控制事情

这是我们方法的标准场景:

  • 玩家执行动作,动作有效并在玩家客户端上执行
  • 操作通过网络发送
  • 在其他客户端上执行操作
  • 到目前为止,我们提出的设计(即目前为止没有或没有代码)类似于下面的伪序列图


    Gui、控制器和网络将所有可能的操作(即更改数据的所有操作)作为接口的方法来实现。因此,每个部分都可以以某种方式实现该方法以完成其工作

    动作()的示例:

    在玩家端的客户端:

    Player-->Gui.Action()
    Gui-->Controller.Action()
    Controller-->Logic.Action
        (Logic.Action() == NoError)? 
        Controller-->Network.Action()
    Network-->Parser.ParseAction()
    Network.Send(msg)
    
    在所有其他客户机上:

    Network.Recv(msg)
    Network-->Parser.Deparse(msg)
    Parser-->Logic.Action()
    Logic-->Gui.Action()
    

    问题:

    这是我们完成任务的可行方法吗?
    有更好/更简单的方法吗?
    建议,批评

    我们的知识(因此您可以更好地针对您的答案):

    我们是初学者,在一个小团队的大项目上编程。 我们都有一些一般的编程经验,对.Net库和Windows窗体有一些基本的了解


    如果你需要更多的信息,请尽管问。

    < P>我只知道我不会说C++是初学者的语言。我从来没用过它,但我的朋友们把它描述成“男人的语言”。我猜这会让你的胸部长出毛发

    我从来没有写过这样的应用程序,虽然有人会说Winforms/thick客户端正在卷土重来,但我认为大多数人都会做基于web的开发

    我想WCF应该是一个合理的选择,但我以前从未将其用于点对点的东西

    你怎么知道还有哪些客户,这样你就可以和他们一起玩了? 电话会议解决方案似乎使用一个集中的系统:你拨一个特定的号码,它会告诉你你是第一个参加会议的人。如果有人离开,其他人都还在。这可能更符合您的要求——让一个中央系统来协调数据。如果两个客户端发送冲突的操作,会发生什么情况

    有了中央系统,你就可以建立直接的规则来管理游戏,而且管理起来也会更容易。您可以在事务中包装肌动蛋白的处理,这样就不会发生冲突。唯一的问题是保持所有客户端同步;他们所要做的就是从中央服务器获取更新-但是他们什么时候做?他们是直接投票还是在发生变化时由中央服务器“告知”他们?后者可能要好得多,但我不知道你会如何使用你提出的技术来做到这一点


    我希望这会有帮助。

    一般来说,这个主意看起来不错。 为了用伪代码证明这个想法,你可以设计一个小原型

    因为,您想要构建的游戏是基于回合的-您需要有保证的网络交付。
    为了简化数据传输,您可以使用库

    您好,谢谢您的回答。问题是,我们必须完全使用这些技术,即C++/CLI和.Net Windows窗体。甚至不可能使用其他的.NET语言,我们的教授在这方面非常严格:(不要问我为什么)我想用初学者的东西说的是,我们都知道C++和.NET的东西,至少是理论方面。但是,我们两人都没有任何“真实世界”的编程经验,更不用说这种规模的项目了。上面例子中的网络类只是整个网络的抽象。但是服务器只是用来管理连接和客户机,并向所有其他客户机广播传入的操作。使用上述方法,我们认为没有必要赋予服务器更多的功能,因为每个客户端都可以自己进行计算和处理。当然,听起来你知道自己在做什么。我只是很抱歉,我没有任何现实世界的建议可以给你-这似乎是适用的。没有什么可抱歉的:)实际上,我只是想检查一下,我们的方法是否可行,并且不仅在纸面上看起来不错。因此,我们不必花3周的时间编写代码,只需看到这些都是废话。这就是我认为真实经验可能会有所帮助的地方,了解什么在理论上看起来不错,什么实际上是可以实现的。thx,我们真的必须仔细研究序列化,如果只是为了节省游戏。要学的新东西:)