6

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

我想通过保存一个带有列保存(ID)和列进度的表来解决这个问题,其中进度是数据类型文本。当用户开始时,进度设置为(例如)“0”。如果他进入第 1 级,进度设置为“0#1”,第 2 级设置为“0#1#2”。关卡的顺序是免费的,我想保存它。所以进度可能是'0#4#2#15'等等。

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

我要感谢您花时间阅读本文,我期待着答案。

瑞安

4

3 回答 3

4

回答你的问题 1

我不会以这种方式解决您的问题。我将创建 3 个表:一个Levels表('levelKey' 的主键)、一个Users表('userKey' 的主键)和一个User_Levels具有 'levelKey' 和 'userKey' 复合键的表。当用户完成一个级别时,只需插入到User_Levels表中。然后查看用户是否完成了一个级别是一个简单的选择:

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

如果行数 > 0,则用户已完成关卡

于 2012-04-17T13:37:17.100 回答
2

至于问题2,我想说查询的数量不是问题。毕竟,您是在将数据写入数据库,而不是访问它。就个人而言,每当用户实际完成一个级别时,我都会向数据库发送“保存”。

watcher 发布了一个很好的方法来将级别和用户拆分到不同的表中。从进度登录到 User_Levels 的顺序可以看出进度的顺序,因此无需存储类似 1#3#4#9 的内容

您可能希望使用 ajax 在后台发送存档,这样您就不会中断游戏。例如,查看jQuery 的 $.post 方法。或者,如果您的游戏是 Flash,您可以使用 URLRequest。

于 2012-04-17T13:51:55.493 回答
1

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

UID  levels_completed
1    0
1    4
1    7

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

于 2012-04-17T13:38:49.137 回答