2012-01-27 18 views
2

对,我试图创建一个系统,用户可以在其中执行某些操作,但必须等到mysql表中的所有其他用户都已移动,即使用PHP/MySQL创建基于回合的系统的可能方法

用户1使得移动,用户2和3必须等待 user2的举动,使用户1和3必须等待 用户3使移动,用户1和2必须等待 USER1使得移动...

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

这是我唯一的想法,有没有更容易或替代方法?

+0

我认为programmers.stackexchange.com是这个问题的一个更好的地方。 – 2012-01-27 18:44:30

+0

同意Toby; [meta](http://bit.ly/zrmGDQ): “堆栈溢出问题几乎所有的问题或答案都有实际的源代码,对于包含程序员问题的程序员来说,更为罕见(尽管当然可以)源代码。” – mzhang 2012-01-27 18:48:39

回答

1

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

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

0

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

(注:这是基于“必须等待所有其他用户”,而不是严格的招秩序 - 即“A”必须“B”必须在“C”移动等移动前)

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

0

有一个从零开始的游戏序列号。为每个玩家设置一个“上次移动”号码。当玩家移动时,将他们的“上次移动”数字设置为等于游戏序列号。一旦每个玩家都移动了,增加游戏序列号。

虽然您可能想要使用超时,否则不移动的玩家可以无限期延迟其他玩家。

0

我会首先通过计算速度来确定$序列。然后比较速度以确定订单。然后使用该订单发送移动通知。使用时间戳来确保用户不会接管一天或不久,您只需要一个cron作业即可。

有一个变量或数组保存前n个最后序列,因此您可以轻松地将上次移动的播放器移到后面,而无需混合uP命令。

让页面检查玩家顺序的顺序,并且不允许采取行动,除非它处于1或0.请确保对输入进行消毒,以避免操纵。然后插入你的表格和图形和游戏方程。

0

您可以保存每个用户最后一次移动的日期时间。因此,当您通过此日期时间列对DESC进行排序时,您只需要提取结果的第一行,其中将包含允许移动播放器的ID。

1

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

  • 你更新+阅读每一个球员的一举一动,当你需要保持最小信息,其举动是
  • 当您编码下一回合信息时,您正在丢失关于玩家顺序的信息。

的高级别溶液:

  1. 创建games表,每场一行,像INT currentTurn
  2. 一列上的每个游戏进行创建gameUsers表,链接到它的游戏games
  3. 分配给每个n用户gameUsersINT playerOrder测距[1-N]
  4. 仅接收来自playerN如果playerN == "SELECT playerID FROM gameUsers WHERE playerOrder = currentTurn"
  5. 移动后成功一步:"UPDATE games SET currentTurn = currentTurn + 1 WHERE game = thisGame"

相信上述表结构是定向的表示良好的对象实际的游戏模式。您可以将其他每场比赛的东西存入games,如获胜者,长度,日期等。请原谅pseudoSQL。

相关问题