0

我正在尝试为我的游戏制作一个简单的战斗脚本,但在战斗结束后,我不希望玩家能够单击刷新并再次与怪物战斗......或者能够一遍又一遍地点击提交继续获得获胜的奖励..那么在被击中的人的攻击按钮并且战斗显示结果之后我需要做什么,以使其不会发生?如果我尝试使用 session_destroy() 将玩家注销并解决问题:/

这是我的代码有什么帮助吗?

   if(isset($_POST['Submit']))
    {

     $player=$_SESSION['username'];
     $playerstats1="SELECT * from users where username='$player'";
     $playerstats2=mysql_query($playerstats1) or die ("Could not find player");
     $playerstats3=mysql_fetch_array($playerstats2);

     $pokemonstat1="SELECT * from user_pokemon where belongsto='$player' AND slot='1'";
     $pokemonstat2=mysql_query($pokemonstat1) or die ("Could not find pokemon");
     while($row = mysql_fetch_array($pokemonstat2)){

     $yourmonster="SELECT * from pokemon where name='".$row['pokemon']."'";
     $yourmonster2=mysql_query($yourmonster) or die ("Cannot select battle the pokemon");
     $yourmonster3=mysql_fetch_array($yourmonster2);


     $monstername=$_SESSION['pokemon'];
     $monstername=strip_tags($monstername);
     $selmonster="SELECT * from pokemon where name='$monstername'";
     $selmonster2=mysql_query($selmonster) or die ("Cannot select battle the pokemon");
     $selmonster3=mysql_fetch_array($selmonster2);

           $totalskill=$yourmonster3[att] * $row['level'] + $selmonster3[att] * 5;
           $randomnumber=rand(1,$totalskill);
           if($randomnumber<=$yourmonster3[att] * $row['level'])
           {
             echo "<center>";  
             echo "you have won!";
             echo "</center>";

           } else {
               echo "<center>";
               echo "you have lost!";
               echo "</center>";
           }
         }
    }

再次更新。

   $battle_id = md5(uniqid(rand(), true));
    echo $battle_id;
    // $battle_id would be something like 9a8ab59df7079208843086e9b49a7862

    // initialise the battle log
    if(!isset($_SESSION['battle_log']) || !is_array($_SESSION['battle_log']))
    {
        $_SESSION['battle_log'] = array();
    }

   // Check if the battle hasn't been played
   if(!in_array($battle_id, $_SESSION['battle_log']))
   {
       // add played battle to the log

       // ... your battle code goes here



    if(isset($_POST['Submit']))
    {

     $player=$_SESSION['username'];
     $playerstats1="SELECT * from users where username='$player'";
     $playerstats2=mysql_query($playerstats1) or die ("Could not find player");
     $playerstats3=mysql_fetch_array($playerstats2);

     $pokemonstat1="SELECT * from user_pokemon where belongsto='$player' AND slot='1'";
     $pokemonstat2=mysql_query($pokemonstat1) or die ("Could not find pokemon");
     while($row = mysql_fetch_array($pokemonstat2)){





     $yourmonster="SELECT * from pokemon where name='".$row['pokemon']."'";
     $yourmonster2=mysql_query($yourmonster) or die ("Cannot select battle the pokemon");
     $yourmonster3=mysql_fetch_array($yourmonster2);


     $monstername=$_SESSION['pokemon'];
     $monstername=strip_tags($monstername);
     $selmonster="SELECT * from pokemon where name='$monstername'";
     $selmonster2=mysql_query($selmonster) or die ("Cannot select battle the pokemon");
     $selmonster3=mysql_fetch_array($selmonster2);

           $totalskill=$yourmonster3[att] * $row['level'] + $selmonster3[att] * 5;
           $randomnumber=rand(1,$totalskill);
           if($randomnumber<=$yourmonster3[att] * $row['level'])
           {
             echo "<center>";  
             echo "you have won!";
             echo "</center>";

           } else {
               echo "<center>";
               echo "you have lost!";
               echo "</center>";
           }
         }
    }
          $_SESSION['battle_log'][] = $battle_id;
   }else {

      echo "Don't try to cheat...";
   }
4

2 回答 2

1

只需在会话中设置一个值,指示用户已经进行了战斗。然后,您可以检查该值以查看您的用户是否已经参加过战斗。

您将在会话中保存的值将是唯一的,例如战斗 ID。如果这是您没有的东西,那么您可以通过对战斗中的所有独特值进行签名来创建独特的战斗参考。像这样:-

    $battle_id = md5($player.$row['pokemon'].$monstername);
    // $battle_id would be something like 9a8ab59df7079208843086e9b49a7862

在脚本开始时初始化所有战斗的日志:-

    // initialise the battle log
    if(!isset($_SESSION['battle_log']) || !is_array($_SESSION['battle_log']))
    {
        $_SESSION['battle_log'] = array();
    }

然后在任何战斗开始之前检查它是否尚未播放

   // Check if the battle hasn't been played
   if(!in_array($battle_id, $_SESSION['battle_log']))
   {
       // ... your battle code goes here

       // add played battle to the log
       $_SESSION['battle_log'][] = $battle_id;
   }

所以沿着这些路线的东西应该起作用: -

// initialise the battle log
if(!isset($_SESSION['battle_log']) || !is_array($_SESSION['battle_log']))
{
    $_SESSION['battle_log'] = array();
}

if(isset($_POST['Submit']))
{
    $player=$_SESSION['username'];
    $playerstats1="SELECT * from users where username='$player'";
    $playerstats2=mysql_query($playerstats1) or die ("Could not find player");
    $playerstats3=mysql_fetch_array($playerstats2);

    $pokemonstat1="SELECT * from user_pokemon where belongsto='$player' AND slot='1'";
    $pokemonstat2=mysql_query($pokemonstat1) or die ("Could not find pokemon");

    while($row = mysql_fetch_array($pokemonstat2))
    {
        $yourmonster="SELECT * from pokemon where name='".$row['pokemon']."'";
        $yourmonster2=mysql_query($yourmonster) or die ("Cannot select battle the pokemon");
        $yourmonster3=mysql_fetch_array($yourmonster2);

        $monstername=$_SESSION['pokemon'];
        $monstername=strip_tags($monstername);
        $selmonster="SELECT * from pokemon where name='$monstername'";
        $selmonster2=mysql_query($selmonster) or die ("Cannot select battle the pokemon");
        $selmonster3=mysql_fetch_array($selmonster2);

        // generate the battle id based on the unique battle details
        $battle_id = md5($player.$row['pokemon'].$monstername);

        $totalskill=$yourmonster3[att] * $row['level'] + $selmonster3[att] * 5;
        $randomnumber=rand(1,$totalskill);
        if($randomnumber<=$yourmonster3[att] * $row['level'])
        {
            echo "<center>you have won!</center>";
        } else {
            echo "<center>you have lost!</center>";
        }

        // Check if the battle hasn't been played
        if(!in_array($battle_id, $_SESSION['battle_log']))
        {
            // any code below will only be run once per battle
            // ...

            // add played battle to the log
            $_SESSION['battle_log'][] = $battle_id;
        }
    }
}

注意:请记住,会话只是暂时的,因此一旦会话被破坏,所有战斗历史都会丢失,因此请保留数据。您可以创建一个battle表来执行此操作。

于 2013-04-06T04:31:29.610 回答
0

在战斗开始之前生成一个特殊密钥并将其指定到会话中。还将它作为 HTML 表单中的隐藏输入推送到 HTML。

当用户提交表单时,检查提交和特殊键。

如果他们匹配,用户进行一次战斗。当您处理战斗脚本时,请确保删除/重新生成密钥。

如果用户按 F5 并再次重新发布表单,它将无法正常工作,因为密钥无效。他们需要刷新页面以获取新密钥。

至于session_destroy(),你不需要这个。只是unset适当的会话,或者给那个会话一个新的值。

于 2013-04-06T04:29:54.623 回答