如何构建我的数据库的HTML回合制战略游戏?

我正在制作简单的HTML套接字游戏,我想随着时间的推移logging。

这是一个“风险”types的游戏,可以征服个别的瓷砖,瓦片最多的团队正在获胜。

截至目前,我已经完成了大部分的游戏,但问题是每次服务器重新启动时,所有的服务器数据都将丢失。

我想使用数据库来存储所有不同的团队,以及所有已经被征服的瓦片,但是我也想用时间戳来存储所有的瓦片征服,这样我就可以看到地图被征服的进程。 (所以我理论上可以及时回放,看看地图是如何演变的)。

我也希望在服务器崩溃的情况下,服务器可以从数据库中检索数据并返回到之前的世界状态(哪个方块被谁征服等)

我对数据库非常陌生,因为我不得不在学校学习SQL。 我正在考虑使用MongoDB(noSQL),并且看到我只会最多每隔几秒钟向董事会写信,这是正确的方法吗?

你用这个数据库真的没关系。 你可以使用几乎任何。

用于存储所有游戏的当前状态的SQL-by-the-book解决scheme将是创建具有这些字段的表格:

  • game_id(primary_key)
  • tile_id(primary_key)
  • 所有者

游戏历史将如下所示:

  • game_id(primary_key)
  • move_id(primary_key)
  • 时间戳
  • TILE_ID
  • new_owner

实际上,现在的状态可能是多余的,因为你可以通过简单地从历史中重建整个游戏来构建当前的游戏状态。 但是对于这样一个普通的操作来说,这可能是相当强烈的performance(为了节省游戏服务器上的内存,你会想暂停任何游戏到数据库没人动的一段时间)。

但是,如果检索整个游戏是您的主要用例,那么您可能会决定偏离当前状态表的SQL-by-the-book并将游戏状态存储为二进制文件,并将其存储为BLOB:

  • game_id(primary_key)
  • 游戏状态

然后你就不能再对单个的tile进行查询了,但是保存和恢复完整的gamestate将会是一个更快的操作,因为它只是一行。


这个问题也提到了MongoDB。 这看起来如何? MongoDB强调关系嵌套的文档。 任何有关系的东西都应该默认存储在同一个文档中(有例外,见后文)。 默认的游戏文档如下所示:

{ _id: ObjectId(), player1: <player identifier>, player2: <player identifier>, tiles: [ // array representing the states of all tiles ], history: [ { timestamp: Date(), tile_id: <index in the tile-array above>, new_owner: <player identifier> }, /*...and more such objects...*/ ] } 

但是,MongoDB存在一个问题:它不喜欢文档的增长,因为当文档增长超过其初始大小时,它有时需要重新定位到不同的硬盘位置。 这有害于写入性能。 所以当你注意到更新游戏历史成为一个瓶颈时,你可能想把它移到不同的集合,每个游戏事件都是一个文档:

 { _id: ObjectId, game: <ObjectId of the game where the event happened> timestamp: Date(), tile_id: <index in the tile-array above>, new_owner: <player identifier> } 

通常你可以通过不同的方法达到同样的目的。 这一切都取决于你想要做什么,你select什么:编程语言,服务器,数据库等

无论如何,如果您使用的是websocket,请考虑使用实时数据库,如RethinkDB (NoSQL)或Firebase实时数据库 。

AFAIK Mongodb不支持实时,我自己也没有使用Firebase,但是我有RethinkDB的经验,绝对是尖端的。 注意:RethinkDB的语法很丑陋(恕我直言),因为它在市场上相对较新,所以在stackoverflow中你可能找不到太多的帮助(你自己)。

TL; DR:

恕我直言,在你的情况下,如果你可以避免使用任何数据库,只是不要使用任何。 因为如果服务器崩溃或某些玩家打折,他们会轻松地重新开始游戏并再次玩。