2012-04-17 39 views
5

我正在开发一个网站,这是一种游戏。用户的进度保存在MySQL数据库中。如何在MySQL数据库中保存游戏进度

我想通过一个表保存一个列保存(ID)和一个列进度,其中进度是数据类型文本。当用户开始时,进度被设置为(例如)'0'。如果他进入第1级,进度设置为'0#1',第2级设为'0#1#2'。级别的顺序是免费的,我想保存它。所以进展可以是'0#4#2#15'等等。

这是一个很好的方法吗?我没有使用SQL的经验,我不想做一些非常愚蠢的事情。我已经读了很多有关表格,外键和什么的令人困惑的信息...

我想感谢您的阅读时间,我期待着答复。

瑞安

+0

请把它分成多个问题。 – 2012-04-17 13:31:03

+0

你可能是指“缓存”而不是“缓冲”? – Widor 2012-04-17 13:31:25

+0

@Jan你是对的。 – Ryan 2012-04-17 13:45:13

回答

2

回答你的问题1

我不会接近你的问题的这种方式。我将创建3个表格:一个Levels表格('levelKey'的主键),一个Users表格('userKey'的主键)和一个User_Levels表格,其中有一个组合键'levelKey'和'userKey'。当用户完成一个级别时,只需插入User_Levels表。然后看用户是否已经完成了水平是一个简单的选择:

SELECT 'a' FROM User_Levels WHERE userKey = ? AND levelKey = ? 

如果行数> 0,用户已经完成了水平

+0

在我看来,这是一个很大的方法。如果您需要保持完成级别的顺序,则可以在User_Levels中具有序号值的第三列。例如,如果用户2以该顺序完成级别1,4和2,则该表将具有'(userKey,levelKey,ordinalValue)'条目'(1,1,1),(1,4,2), (1,2,3)'。 – mdoyle 2012-04-17 16:08:37

+0

是的,我只列出了答案中必要的列(键)。您可以使用任何描述级别,用户或两者之间关系的信息(User_Levels)。 – 2012-04-17 16:19:34

+0

“这是一个很好的方法”=“观察者是更好的方法”。啧。 – mdoyle 2012-04-17 19:30:27

1

关于你的第一个问题,如果游戏/水平是非线性的,我会采取不同的方法;我只需添加一个包含用户ID列和已完成级别列的表。因此,如果用户1完成水平0,4和7,我的表将有3行:

UID levels_completed 
1 0 
1 4 
1 7 

关于你的其他问题,您可以使用JavaScript事件和Ajax检测页面关闭,但我不会依靠那个;我会在需要时运行查询。如果你的会话被破坏,你已经太晚了...

+0

那么,水平更像是“部分”,这将是一堆。顺序很重要,因为玩家可以前后移动。 当玩家恢复游戏时,我正在读取数组的进度。 随着大量用户和每个用户的大量部分,这仍然是一个好方法吗? – Ryan 2012-04-17 13:51:29

+0

@Ryan这只是一个基本的例子,但如果你想添加更多的信息,你可以添加包含附加信息的列。无论哪种方式,在这样的表格上操作都比在压缩到一个字段中的大量信息的表格上更容易。 – jeroen 2012-04-17 13:54:51

2

至于问题2,我会说查询量不是问题。毕竟,你是数据写入数据库,不能访问它。就我个人而言,只要用户实际完成一个级别,我就会向数据库发送一个“保存”。

watcher已经发布了一个很好的方法,将关卡和用户分成不同的表格。从进度登录到User_Levels的顺序可以看出进度的顺序,所以不需要存储像1#3#4#的东西#9

您可能想要用ajax发送保存在后台,所以你不要打断游戏。例如,看看jQuery's $.post method。或者,如果您的游戏处于Flash中,则可以使用URLRequest。

相关问题