基于转弯的棋盘游戏的网络通信

时间:2010-06-03 00:52:12

标签: .net network-programming c++-cli

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

我目前是CS学生(来自德国,如果这个信息有用;))我们得到了一个可自由选择的编程作业,我们必须在C ++ / CLI Windows窗体应用程序中编写。<登记/> 我的团队,另外两个人和我,决定选择与网络游戏风险相关的网络兼容端口。

我们将工作划分为3个部分,即UI,游戏逻辑和网络。现在,我们必须让所有事情一起工作,而最重要的问题是,如何让客户彼此保持同步?

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

这是我们方法的标准方案:

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


    Gui,Controller and Network将所有可能的操作(即所有更改数据的操作)作为接口的方法实现。因此,每个部分都可以以完成工作的方式实现该方法。

    Action()示例:

    在玩家方的客户端:

    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窗体的基本了解。

    如果您需要任何进一步的信息,请随时询问。

2 个答案:

答案 0 :(得分:0)

我所知道的是,我不会说C ++是初学者的语言!我从未使用它,但是我的朋友将它描述为“男人的语言”。我想它会把毛发放在胸前。

我从来没有写过这样的应用程序,虽然有些人会说Winforms /胖客户端正在回归,但我认为那里的大部分人都会进行基于网络的开发。

我想WCF是一个合乎逻辑的观察点,但我之前并没有将它用于点对点的东西。

你怎么知道哪些客户在那里,所以你可以玩它们? 电话会议解决方案似乎使用集中式系统:您拨入特定号码,它会告诉您第一个加入会议的人。如果有人离开,其他人仍然在那里。这可能是您所追求的更多 - 让中央系统调解数据。如果两个客户端发送冲突的操作会发生什么?

使用中央系统,您可以构建直接的规则来管理游戏,并且管理起来更容易。您可以在事务中包含对actin的处理,以便您不会发生冲突。唯一的问题是保持所有客户同步;他们所要做的只是从中央服务器获取更新 - 但他们什么时候这样做?他们只是轮询它还是在发生变化时被中央服务器“告知”?后者可能要好得多 - 但我不知道你是如何使用你提议的技术来做的。

我希望有所帮助。

答案 1 :(得分:0)

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

因为,您想要构建的游戏是基于回合制的 - 您需要保证网络传输。 对于数据传输简化,您可以使用proto buff