2009-11-02 41 views
3

这与预防webform resubmission有关,但是这次上下文是基于网络的RPG。玩家击败怪物后,会掉落物品。所以我想阻止用户点击后退按钮,或者不断刷新,以“欺骗”项目丢弃。PHP - 这是防止重新提交的好方法吗?

由于物品掉落频繁,使用数据库来存储唯一的'drop-transaction-id'似乎不可行。我下面娱乐的想法:

  1. 对于每一个战斗的基础上,当前日期与时间,用户的ID,并将其存储到数据库和会话创建独特的价值。有可能给定一个用户ID,你可以取回数值

  2. 如果来自会话的值存在于DB中,那么'战斗'是有效的并且允许用户访问所有与战斗有关的页面。如果它不存在于数据库中,则新的战斗状态开始

  3. 战斗结束时,唯一值从数据库中清除。

  4. 清除DB中30分钟的值。

任何意见,改进,或陷阱,以这种方法被欢迎

回答

3

这个问题是非常主观的,有事情你可以不能做,取决于周围已经存在的数据/框架。

您提供的解决方案应该可以工作,但它取决于您可用的唯一战斗/战利品/用户数据。

我认为这是你认为最好的?这是我认为最好的:)

  1. 获取用户ID以及来自该战斗的独特数据。像战斗开始时,战斗结束时间等
  2. 存储在数据库中,或什么都存储系统,您必须
  3. 一旦你收集的战利品,删除记录

这样,如果是用户ID和唯一的战斗数据存在,他们没有得到他们的战利品。

你说得对;跟踪每一块战利品太多,你最好临时存储数据。

2

似乎是一个合理的方法。无论如何,我假设你正在存储玩家在战斗中的事实。否则,如果他们想避免打架,他们可以关闭浏览器?

战斗结局和战利品掉落应该视为一种惯常的操作。如果没有战斗,就不会有战利品。

1

这取决于您的游戏设计:您是否更倾向于roguelikes的方向,只有转身次数,因此在两次转身之间的长时间停顿肯定是可能的(如通过聊天室咨询其他人,注意:在NetHack中不是考虑作弊)?用户只能在某些地点或任何地点保存游戏吗?这在设计上有很大的不同,例如为类似于Thorarin提到的漏洞利用做出贡献。

如果你的游戏只使用一次保存的传统roguelike路线,转动地下室和permadeath,那么可以将任何给定角色的当前回合数与任何游戏相关信息(存货,地图,敌人和他们的状态),然后在玩家的任何行动中检查这一点,从而防止转弯两次。

-2

或者,您可以将所有东西都捆绑在客户端JavaScript中,这样即使他们重新提交了表单,它也会生成一个全新的战斗/财富相遇。

+0

...因此,当他们不满意第一卷中的低级宝藏时,让他们重玩相遇。 – Residuum 2009-11-02 10:40:54

+0

如果游戏主要是基于战斗而不会产生影响的,那取决于游戏的运行方式。 – Steerpike 2009-11-02 10:51:20

+0

然后你最终得到小便秘法。永远不要相信客户。 – 2009-11-02 11:18:17