【问题标题】:Reset the session variable when the user leaves a specific page (Except refresh)当用户离开特定页面时重置会话变量(刷新除外)
【发布时间】:2017-07-24 02:22:12
【问题描述】:

首先,对不起,如果这是重复的,我已经搜索过,到目前为止我一无所获。

所以,当用户转到“fightzone1.php”时,它会发起随机战斗。

$query=$db->prepare('SELECT * FROM monsters ORDER BY RAND() LIMIT 1');

怪物的最大生命值在数据库中。但是,他的实际健康是这样计算的:

$monster_actualhealth = ($data["monster_health"] -   $_SESSION['damage']);
  • $Monster_actualhealth 是怪物的生命值。

  • $data["monster_health"] 是怪物的最大生命值,位于数据库中

  • $_SESSION['damage'] 是用户将对怪物造成的伤害。

<form action="" method="POST"><input type="submit" value="Attack the creature" name="attacking"></form>

使用此按钮,用户可以对怪物造成伤害

     if (isset($_POST['attacking'])) { 
        if (!isset($_SESSION['last_post'])) { 
     $_SESSION['last_post'] = 0;
  }
  $currtime = time(); 
  if ($currtime  > ($_SESSION['last_post'] + 2)) {
     $_SESSION['last_post'] = $currtime; 

      $randomdamageperso = rand(5, 12);
        $query->execute();
        $query->CloseCursor();
      $_SESSION['damage'] = ( $_SESSION['damage'] + $randomdamageperso);
     $monster_actualhealth = ($data["monster_health"] -   $_SESSION['damage']);
      echo "You inflicted " . $randomdamageperso . "  !";
           echo '<meta http-equiv="refresh" content="1.5" />';

}
}
}

(我删除了一些文本以使脚本易于理解且不那么混乱,他工作正常,但如果我忘记删除 1 或 2 个元素,请不要担心。)

(从现在开始我们就叫$_SESSION['damage'] 就叫$damage) 所以,基本上;它将一个随机数添加到$damage(介于 5 和 12 之间),并将该数字添加到 $damage 的前一个数字中,使其更大。因此,例如,如果$damage 为 12,怪物生命值为 35,则实际怪物生命值为 23。

现在,棘手的部分是用户可以离开页面,去治疗,然后回到这个页面。是的,怪物会改变,它会是另一个,但 $_SESSION['damage'] 会保持不变,让怪物在战斗尚未开始时失去生命值。

正如你在我的脚本中看到的,有 echo 使页面刷新以实际刷新怪物的健康显示,因此用户可以跟踪战斗。 (它显示了他造成了多少,1.5秒后文字消失并刷新。)

我不能用“卸载”功能做一些javascript,因为按钮会刷新页面,我不希望$damage在我按下按钮时变为0。

我试图把一切都说清楚,所以感谢您抽出时间来帮助我!

编辑:

<?php
        $query=$db->prepare("SELECT * FROM fightmonster WHERE player_id='" . $_SESSION['id'] . "'  ORDER BY time_stamp desc limit 1");
        $query->execute();
        $result=$query->fetch();
                $query->CloseCursor();
if (isset($result['id'])){
echo "unfinished business!";
}

【问题讨论】:

    标签: javascript php jquery ajax session


    【解决方案1】:

    要销毁特定会话名称,您可以使用unset()

    unset($_SESSION['name']);
    

    但是,在您的情况下,为此使用 SESSIONS 是一个坏主意。

    您应该使用战斗表来保存用户 ID、怪物 ID、strtotime() 格式的开始时间和造成的伤害,当用户返回时,只需检查用户是否已经开始战斗那个怪物与否。当伤害达到 0 时,您删除战斗行或将其保留用于历史记录。

    这样做的好处是您还可以随时间增加怪物的生命值,因此如果用户在 5 分钟后回来,怪物可能会恢复 1 或 2 点。

    没有创建会话来在这样的活动环境中保存临时变量。它们用于存储非活动变量并将它们逐页保存。

    所以根据这个解释,你会更好:

    1. 创建战斗表 {id, monster_id, player_id, damage, start_time}
    2. 保存对战斗台造成的损坏
    3. 可选创建一个 cron 脚本,根据开始时间减少怪物的伤害,以减少伤害等级小于怪物最大生命值的战斗
    4. 当玩家回来时,通过检查玩家在离开之前是否已经开始与怪物进行战斗来恢复与怪物的战斗

    只是一个想法,当用户离开时,怪物可能有随机机会拿起新武器或盔甲或施展魔法,甚至进入会增加攻击或防御的狂暴状态。所以玩家在离开未完成的战斗之前可能会三思而后行,如果怪物完全治愈,他会逃跑。

    在任何情况下,表都会提供比非常不稳定的会话更多的选项。 (并不是说不可能开始工作)这不是最有效的方法,因为会话会在某些时候自我杀死它,丢失所有数据。使用表格将为您的游戏打开新的可能性,例如战斗历史、战斗统计等。


    但如果你真的想使用 SESSIONS 并坚持这个想法,你可以将伤害值绑定到怪物 ID 或事件 ID,这样会话就不会破坏新事件/怪物战斗的开始。

    $_SESSION[damage][555][12]
    $_SESSION[time_stamp][555][123456789]
    

    其中 555 是怪物 ID,12 是总伤害,123456789 是战斗开始的时间戳。

    但我仍然认为这是一个坏主意哈哈


    根据您在下面的评论,您只需要简单的检查

    // SQL examle    
    // SELECT * FROM fight WHERE player_id='$_SESSION[id]' and max_health<damage ORDER BY start_time desc limit 1
    
    if (isset($result->id)){
        echo "unfinished business!";
    }else{
        echo "starting a new battle!";
    }
    

    以上只是一个概念。你可以找出实现这一点的正确方法。

    【讨论】:

    • 哇,这实际上是一个很好的答案,谢谢!我想我现在需要你的帮助。因此,我创建了一个表“fightmonster”,其中包含战斗 ID、玩家 ID、怪物名称和怪物生命。问题是每次我刷新时,都会创建另一场战斗。我如何制作“如果找到与 $_SESSION['id'] 具有相同 id 的 player_id,则”?如果用户已经在战斗中,我需要它不要随机选择怪物。
    • 没问题。 Juste 在我的答案中添加了一个新部分。这只是一个概念思想。但它应该让你走上正轨。请接受答案 ;-) 如果您有任何其他问题,请告诉我
    • 您好,感谢您的回答!对不起,我对 MySQL 很不好,所以我有另一个问题。我试着像你告诉我的那样做(看看我在原帖中的编辑),但我不知道你从哪里得到这个 $result 。试图弄清楚,没有任何线索。谢谢你帮助我;)
    • $result 将是数据库查询的返回。在你的情况下,它会像这样 $result->id;
    • 嗨。对于所有的问题和时间,我感到非常抱歉,但我必须编写代码。所以现在,一切都很好,有一个名为“fightm”的表,其中包含临时行和我需要的一切。唯一的问题是我仍然不知道主要问题的答案:我怎么知道用户何时离开?我怎么知道用户没有离开战斗来治疗并回来了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多