Jyanken Login

二人のプレイヤーがログインします。
jyanken_login.php を呼び出すコードです。
<a href="http://maedakobe.rw.xsi.jp/php/jyanken_login.php" target="_blank">じゃんけんゲームにログイン</a>

Form から jyanken.txt をリセットしてからログインして下さい。
じゃんけんゲームにログイン

jyanken_login.php の概要

  1. ネット対戦ゲームでは、ゲームそのものよりもサーバーを介して情報をやり取りする処理が面倒です。
    ネット対戦じゃんけんゲームの前段階として、二人のプレイヤーがログインするプログラムを作成します。
    jyanken_login.php では Login Class を組み込んでいます。
    Login Class の説明は Login Class を参照して下さい。
  2. jyanken_login.php は5秒置きにポーリングで呼ばれて jyanken.txt の現在の情報を制御変数に入力します。
    1. プレイヤーは Form から支持を与えます。
    2. 最初にリセットを選んで jyanken.txt を初期化して下さい。
    3. プレイヤーAが ID に AA とタイプして、ログイン選択で送信ボタンをクリックします。
      プレイヤーBを待ち合せる状態で待機します。
    4. プレイヤーBが別のネット環境からホームページを立ち上げます。
      (1台のパソコンで別のホームページを立ち上げてテストすることも出来ます)
    5. プレイヤーAとプレイヤーBが揃うとゲームが始まります。
      今回のプログラムはゲームが開始出来る状態になると終了です。
    6. ポーリングでは不規則に更新される jyanken.txt から最新のデータを制御変数に入力します。
      現在の状況を $msg= $game->message() で設定して form_call($id, $msg) で表示します。
      これによりプレイヤーは何もしないで待っていれば、相手がそろったことやジャンケンをするタイミングを知ることが出来ます。

jyanken_login.php の説明

  1. jyanken_login.php のソースコードです。
    utf-8 でアップロードすることも出来るようですが、コマンドプロンプトでコンパイルすると全角が文字化けします。
    そこで PHP のソースコードは、従来通り Shift_JIS を使います。
    <html>
    <body bgcolor=#fafeff>
      <h1>対戦相手を待つ</h1>
    <?php
        header("Content-Type: text/html; charset=Shift_JIS");
        require_once("login_class.php");
        $game= new login_class();
        $id= $_GET['id'];       //ID
        $play= $_GET['play'];   //Play
        if ($play==4)
        {   $game->put_file();
            $game->form_call('-', "ゲームをリセットしました");
            return;
        }
        if (!isset($id))    $id= '-';
        if ($id=='-')
        {   $game->form_call('-', "ID をタイプして下さい");
            return;
        }
        $game->get_file();
        switch($play)
        {   case 5:
                $game->state= 9;
                $game->put_file();
                $msg= "ゲームを終了します<br>\n";
                exit();
            case 0: case 1: case 2: case 3:
                $game->action($id, $play);
                $msg= $game->message();
                break;
            case 9:
                $msg= $game->message();
                break;
            default:
                $msg = "** play error : $play<br>\n";
                break;
        }
    error_log("$id, $play;  $game->state, $game->id_a, $game->id_b\n", 3, 'app.log');
        $game->check($id, $play);
        if ($game->state>0)
        {   print("** プレイヤーがそろいました **<br>\n");
            exit();
        }
        $game->form_call($id, $msg);
    ?>
    <script type="text/javascript">
    function update()
    {   var id = "<?php echo $id;?>";
        str = "jyanken_login.php?play=9&id=" + id;
        location.href = str;
    }
    setTimeout('update()',5000);
    </script>
    </body>
    </html>
    
  2. 二人のプレイヤーのログインを管理する jyanken_login.php です。
    プレイヤーから渡された $play で指示をします。
    本来なら 0 ~ 2 は [グー, チョキ, パー] で、3 がログイン(確認)ですが、今回は 0 ~ 3 のときに action() 関数を呼び出します。
     4リセット
     5ゲームを終了
     9ポーリング
    以外ログイン
  3. 最初に login_class を生成します。
    パラメータで渡された $id, $play を受け取ります。
    $play==4 のときは jyanken.txt を初期化します。
    $id が '-' のときは ID をタイプするように促します。
        require_once("login_class.php");
        $game= new login_class();
        $id= $_GET['id'];       //ID
        $play= $_GET['play'];   //Play
        if ($play==4)
        {   $game->put_file();
            $game->form_call('-', "ゲームをリセットしました");
            return;
        }
        if (!isset($id))    $id= '-';
        if ($id=='-')
        {   $game->form_call('-', "ID をタイプして下さい");
            return;
        }
    
  4. get_file(); で jyanken.txt に記録されているデータを取得します。
    $play の値によって処理を振り分けます。
    0 ~ 3 のときは action($id, $play); を呼んで jyanken.txt を更新します。
    9 のときはポーリングで、現在の $state に従ってメッセージを設定して表示します。
        $game->get_file();
        switch($play)
        {   case 5:
                $game->state= 9;
                $game->put_file();
                $msg= "ゲームを終了します<br>\n";
                exit();
            case 0: case 1: case 2: case 3:
                $game->action($id, $play);
                $msg= $game->message();
                break;
            case 9:
                $msg= $game->message();
                break;
            default:
                $msg = "** play error : $play<br>\n";
                break;
        }
    
  5. デバッグのために error_log() に記録します。
    form_call($id, $msg); を呼び出して次のプレイを促します。
    error_log("$id, $play;  $game->state, $game->id_a, $game->id_b\n", 3, 'app.log');
        $game->check($id, $play);
        if ($game->state>0)
        {   print("** プレイヤーがそろいました **<br>\n");
            exit();
        }
        $game->form_call($id, $msg);
    
  6. javascript で5秒ごとにポーリングします。
    jyanken.txt ファイルが更新されるのはゲームに進展があったときです。
    ポーリングでは、最新の情報を取得してメッセージで知らせてくれます。
    function update()
    {   var id = "<?php echo $id;?>";
        str = "jyanken_login.php?play=9&id=" + id;
        location.href = str;
    }
    setTimeout('update()',5000);
    
  7. app.log の記録です。
    9; はポーリングで呼ばれたときです。
    AA, 3;  0, AA, -    //AA がログイン
    AA, 9;  0, AA, -
    AA, 9;  0, AA, -
    AA, 9;  0, AA, -
    AA, 9;  0, AA, -
    BB, 3;  1, AA, BB   //BB がログイン
    AA, 9;  1, AA, BB   //AA のポーリング
    

[Next Chapter ↓] Jyanken Class
[Previous Chapter ↑] Login Class

前田稔の超初心者のプログラム入門
PHP Program