如何设计基于计时器的网页游戏(如Cafe World)

Mic*_*icz 1 language-agnostic

我需要设计和实现基于计时器的游戏(客户端上的Flash,服务器上的PHP),比如Cafe World,即用户点击按钮,等待几秒钟,发生一些事情,然后他可以再次点击.这将是一个食品生产线的模拟.

将有N个生产线元素,每个元素都有一个具有不同持续时间的独立计时器,每个都可以提示M个操作(首先立即启动,下一个启动时完成前一个等等).

如何使用数据库后端实现此类功能的服务器端?目前我正在考虑提示的计数器,当前活动操作的"剩余时间"指示和上次更新的时间.当请求操作时,我将使用从上次更新开始经过的时间更新"剩余时间"和提示计数器.任何想法,评论或更好的想法?

最佳答案获得赏金.

Ken*_*iah 5

在阅读了你的问题,其他答案和讨论后,我想我终于掌握了你的要求(因此是一个新的答案).

首先,您需要跟踪最终用户的会话.当游戏开始时,您将不得不启动一个新的PHP会话并向Flash游戏发送某种会话标识符.每当Flash游戏ping服务器时,它都会传递会话标识符,因此PHP知道它正在使用哪个游戏实例.

PHP服务器本身将是一个被动实体 - 闪存客户端将进行数据的推送和拉取.假设一个用户对事件X,Y和Z进行排队,它们每个都需要20秒......一旦用户尝试对每个事件进行排队,Flash客户端就会通知服务器,服务器会将其记录在队列中,或者由于验证而返回错误(即队列中的事件太多).

此外,客户端将每隔几秒轮询服务器以检查事件的状态.每次客户端注册新事件或轮询状态时,服务器将检查队列中的时间戳并将事件标记为已完成/等,然后向客户端发送响应.这比尝试在后台运行一个试图每秒实时更新数据库的脚本更清晰,更实用.唯一的缺点是,如果由于某种原因断开连接,客户端重新连接之前不会处理特定会话的事件.但是无论连接之间的时间量如何,用户仍然会将服务器视为实时更新,因为数据在发送回客户端之前总是被刷新.

如果您有任何特定于实现的问题,请随时发布您的数据库架构和/或您的服务器代码.

更新:响应Pie的评论,基本上有三种方法将事件标记为已完成... 1.)当客户端连接到服务器以获取请求时,将完成的事件标记为在数据库中完成,或者2.)自动标记事件通过使用后台进程完成,或3.)两者的组合.

如果您按照选项1检查事件时间戳并在每个客户端连接上标记已完成的事件,则在提供客户端请求时,您的数据库将完全是最新的.如果你遵循选项二,在cron上运行的PHP脚本可以确保即使客户端消失,数据库也是最新的,确保你的数据通常不到一分钟 - 无论客户端是否存在或不.

无论您将如何使用数据(高分表等),结合使用这两种技术可能是最好的主意.新鲜数据总是一个加号,从cron脚本定期增量刷新永远不会伤害任何人.

就标记事件标记为已完成而言,您只需要检查事件的相对开始时间+事件持续时间与当前时间的关系.在队列中,事件的开始时间定义为添加到队列中第一个项目的起始时间戳的所有先前未完成的排队事件的持续时间和冷却时间.