到目前为止,我有很多工作游戏,但到目前为止,我真的无法添加所有功能,因为我无法解决这个问题。
假设我有班级董事会,每个董事会在这些广场上都有正方形和棋子。 我有很多玩家连接到游戏,每两个玩家(和观察员等)我需要有单板。我的问题是从哪里开始?
我认为首先我需要多个类Board的实例,然后我需要一种方法将这些板绑定到各个游戏(游戏由GUID识别)。
我的问题是从哪里开始?
到目前为止,我有它的工作,但它大量使用数据库,它不是真正的最佳,我目前的方法,我不能真正做我想要的所有事情(移动验证,倾倒板状态以供将来参考等)。
答案 0 :(得分:1)
由于存储游戏状态的复杂性,棋盘游戏可以很好地利用像MongoDB这样的非关系型数据库。
如果这不是一个选项(我假设您使用的是完整的Microsoft堆栈),我仍然会避免使用数据存储的关系方法。在不知道游戏细节的情况下,我只能推测。因此,我将以拼字游戏为例。
倾倒董事会
您可以将整个电路板状态存储在boardState
表格中,如下所示(5x5非规则拼字游戏板:))
* * * o *
* w o r d
* * v * *
* * e * *
* * r * *
然后,应用程序逻辑可以处理所有处理。想象一下,如果你试图关联存储这些信息,数据库开销就会增加!
移动验证
虽然拼字游戏没有“移动”可言,但这无论如何应该避开数据库。所有过程,如字检查,电路板限制,游戏逻辑等,都应该在应用层完全处理。
申请实施
如果我是你,我将继续沿着你正在前进的路径,拥有许多Game
类的实例,每个实例都包含一个Board
对象。将所有内容存储在内存中,并在应用程序层中执行所需的所有计算,直到需要保留某些内容(如果您希望稍后保存游戏,则为棋盘状态,游戏分数)。此时,将其转储到数据库。
在不了解您的游戏逻辑的情况下,我无法推测我将如何处理它,所以有一个20,000英尺的自上而下的视图。
<强>更新强>
根据新信息,我只是将带有GUID标识符的GameCollection类加载到内存中。您可以通过colGames[GUID]
和colGames[GUID].Board
的电路板访问各个游戏。游戏结束/保存后,将所有相关信息存储在数据库中,并将其从内存中删除。
答案 1 :(得分:0)
两年前,我做了一个多人在线纸牌游戏作为Facebook应用程序。不幸的是游戏不再起来。 该游戏托管在Azure上。前端是在Silverlight中完成的。 我坚持游戏状态的方式是Azure表存储中的一个条目。我使用ProtoBuf序列化游戏状态(非常非常快)。每个游戏都有一个GUID作为唯一标识符。此GUID充当Azure表存储中的密钥。每当请求进入时,我就会反序列化游戏状态,处理消息,如果发生更改,我会覆盖现有的游戏状态。我确实将SQL Server用于其他目的(统计数据等)但不保留游戏状态。使用SQL可能比Azure表存储更快,但性能从来都不是问题,所以我从未研究过它。