【问题标题】:DB design question - multiplayer gameDB 设计问题 - 多人游戏
【发布时间】:2010-12-28 23:14:18
【问题描述】:

我是数据库设计的新手。我正在尝试编写一个棋盘游戏(最多 4 名玩家),并试图想出一种相互交流动作的方法。 根据stackoverflow的建议,我正在为此使用数据库。

我的问题是 - 当玩家 A 移动时,B、C 和 D 必须读取移动。所以 A 移动的事实需要传达给 B、C 和 D。我正在这样做以下方式。请告诉我是否有更好的方法来做到这一点。在我看来,这一切似乎都是错误的,而且非常不稳定。

我有一个包含以下字段的表格 -

gameId, userMove, flagA, flagB, flagC, flagD

所以当 A 采取行动时,我会写下其他内容 - (flagA=0, flagB=1, flagC=1, flagD=1)

当 B、C 或 D 读取 A 的动作时,它们会减少相应的标志。

除非所有标志都为 0,否则 A 不会更新表。

当其他人采取行动时也会发生同样的事情。

评论?为此必须有更好的方法。我在这里看到的错误 -

  • 我正在循环选择,直到 A 的所有标志都为 0
  • 我正在循环选择,直到相应用户的标志设置为读取移动。

我需要担心很多服务器负载和客户端超时。

我希望我能够清楚地解释我的问题。如有需要,请提出问题。

感谢任何帮助。

编辑:游戏是基于网络的(在浏览器中运行),我使用 php 进行服务器端开发,所以我不能使用内存缓存,但如果可能的话我很乐意这样做。

谢谢, - 帕夫

【问题讨论】:

  • 循环表示轮询,还是循环表示迭代?
  • 我不太明白你为什么要使用数据库?玩家之间的动作交流?正如 Daniel 指出的那样,DB 不是用于此目的的最佳选择,使用本地内存会更好

标签: mysql database database-design


【解决方案1】:

如果您的游戏玩家将在单个游戏会话期间与一个游戏服务器进行交互,那么您似乎可以将所有状态保存在内存中。

数据库非常适合持久存储数据,并保证原子性、一致性和完整性。但是,对于您所描述的时间状态,您似乎不需要任何这些功能。

【讨论】:

  • 正是我不想为此类数据使用数据库的原因。但是我的游戏是基于网络的(它在浏览器中运行),我使用 php 来实现。我没有办法为此维护内存缓存。不过,这将是理想的。你熟悉php开发吗?
  • @user220201:肯定有办法在对 php 的不同请求之间共享内存中的数据。您可能想检查这个问题:stackoverflow.com/questions/4089361/…。如果您想了解有关此主题的更多信息,请随时发布新问题。 PHP 专家将乐于提供帮助。
  • Daniel,使用数据库的另一个好处是我可以扩展而不必担心游戏中的所有玩家都转到同一个服务器实例。
  • 嗯,是的...您还可以获得另一个优势,如果服务器崩溃,您可以重新启动并恢复游戏。
【解决方案2】:

如果 flagA、B、C 和 D 都是位,您可以考虑将它们全部放入一列并将该列视为位掩码。

这将允许一列控制所有标志。它可以使您的选择和更新更加清晰。

在此处阅读使用位掩码:

【讨论】:

  • 确实如此 - 它还可以增加其他玩家的数量 - 但请记住,这样做会消除您对这些列进行索引查找的能力。
  • 让它成为一个标志是个好主意。问题是我对循环部分没有太大改进,这是我真正想要删除的部分。
  • 实际上使用按位运算符应该能够避免循环。你能举一个你认为你做不到的例子吗?
【解决方案3】:

您是否考虑过使用文件来存储信息?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2019-06-25
    • 2011-07-05
    • 1970-01-01
    • 2012-01-31
    • 2014-03-08
    相关资源
    最近更新 更多