使用PHP/MMySQL创建基于回合的系统的可能方法


Possible ways to create a turn based system using PHP/MySQL

好吧,我正试图创建一个系统,用户可以在其中做一些事情,但必须等到mysql表中的所有其他用户都采取了行动,即

用户1移动,用户2和3必须等待用户2移动,用户1和3必须等待用户3移动,用户1和2必须等待user1移动。。。

我想到的一种方法是给每个用户一个号码(从1到玩家总数,比如6),然后当玩家移动时,将他们的号码设置为最大号码(6),并将其他人的号码减少一,所以人数最少的人是唯一可以玩的人。

这是我唯一的想法,有更简单或替代的方法吗?

我的建议是将最后一次移动日期存储为日期时间。当你需要检查用户是否可以移动时,只需从表中选择最后移动日期小于或等于当前玩家最后移动日期的所有其他玩家。如果行数不为0,则玩家还不能移动。

这种方法的好处是简单——每次允许玩家移动时,只需使用当前日期和时间更新列即可。

您提出的解决方案似乎有点迂回:

  • 当你需要维护的最低信息是谁的移动时,你正在更新+读取每个玩家的每个移动
  • 当你对下一回合信息进行编码时,你会丢失有关玩家顺序的信息

高级解决方案:

  1. 创建一个games表,每个游戏一行,并使用类似INT currentTurn的列
  2. 在每个游戏的基础上创建一个gameUsers表,链接到games中的游戏
  3. 是否gameUsers中的每个n用户分配范围为[1-n]的INT playerOrder
  4. 如果playerN == "SELECT playerID FROM gameUsers WHERE playerOrder = currentTurn",则仅接受来自playerN的移动
  5. 成功移动后:"UPDATE games SET currentTurn = currentTurn + 1 WHERE game = thisGame"

我相信上面的表结构是一个很好的面向对象的实际游戏模型表示。您可以将其他每场比赛的内容存储到games中,如获胜者、长度、日期等。请原谅伪SQL。

您可以有一个列为hasMoved tinyint(1) required default 0的表,并查询where hasMoved == 0;如果查询返回null,则所有玩家都已移动。

(注意:这是基于"必须等待所有其他用户",而不是严格的移动顺序,即"a"必须在"B"之前移动,必须在"C"之前移动等)

此外,使用这种方法的查询有点慢,(对我来说)似乎有点不必要的资源密集型——也许可以考虑使用Ajax?

有一个从零开始的游戏序列号。每个玩家都有一个"最后移动"的号码。当玩家移动时,将他们的"最后移动"编号设置为游戏序列号。每个玩家移动后,增加游戏序列号。

不过,你可能需要使用暂停,否则一个不移动的玩家可能会无限期地延迟其他玩家。

我会首先通过计算速度来确定$sequence。然后比较速度以确定顺序。然后使用该命令发出他们搬家的通知。使用时间戳来确保用户不会占用一天的时间,无论时间有多长,您都需要一个cron作业。

让一个变量或数组保持前n个最后一个序列,这样你就可以很容易地将最后一个移动的玩家移到后面,而不需要混合uP顺序。

让页面检查玩家的顺序,除非是1或0,否则不允许操作。请确保对输入进行消毒,这样就不存在操作。然后插入你的表格、图形和游戏方程式。

您可以保存每个用户最后一次移动的日期时间。因此,当你按照这个日期-时间列对这个表进行DESC排序时,你只需要提取结果的第一行,它将包含允许移动的玩家的ID。