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 にプッシュします。

ユーザーがフォームを送信するときは、Submit と特殊キーの両方にチェックを入れます。

それらが一致する場合、ユーザーは 1 回戦闘を行いました。バトル スクリプトを処理するときは、必ずキーを削除/再生成してください。

ユーザーが F5 キーを押してフォームをもう一度再送信すると、キーが無効なため機能しません。新しいキーを取得するには、ページを更新する必要があります。

に関してはsession_destroy()、これは必要ありません。適切なセッションだけunsetにするか、そのセッションに新しい価値を与えます。

于 2013-04-06T04:29:54.623 に答える