新 Login

新三山くずしゲームでは、ビルトインサーバーでテストするので文字コードに utf-8 を使います。
新ネット対戦型 Login の呼び出し方です。
<a href="http://maedakobe.rw.xsi.jp/php/miyama2_login.php" target="_blank">新対戦型ゲームのログイン</a><br>

二人のプレイヤーが同時にログインして下さい。
(1台のパソコンで別のホームページを立ち上げてテストすることも出来ます)
RESET
新対戦型ゲームのログイン

プログラムの説明

  1. ネット対戦三山くずしゲームのように交互にプレイするゲームでは、サーバーからの呼び出しを受けてクライアント側が調べるよりもサーバー側で待ち合せて通知する方法が適しています。
    'miyama2_call.php' がログインを通知してくれるプログラムで、1秒ごとに "miyama.txt" を入力して $st と同じ値、または $state>2 になると miyama2_login.php を呼び出します。
    新対戦型三山くずしゲームでは miyama.txt と Miyama2 Class を使用します。
    miyama.txt をサーバーにアップロードして、書き込みと読み込み属性を許可して下さい。
    ゲームの進展は $state で判定するので、今回は $state 以外の項目は使いません。
    名前 説明
    $state ゲームの進行状態
    $id_a プレイヤーAのID
    $id_b プレイヤーBのID
    $ary[3]山の石の数
    $state でゲームの進行を管理するのですが、今回は $state>0 になると終了です。
    $state 説明
    0 二人のプレイヤーが揃うのを待つ
    1 プレイヤーAがプレイする
    2 プレイヤーBがプレイする
    3 プレイヤーAの勝ち
    4 プレイヤーBの勝ち
    9 ゲームを終了する
  2. Miyama2 Login を実行するときは、次の行を修正して下さい。
    Miyama2 Class の説明は Miyama2 Classを参照して下さい。
    miyama2_class.php の form_call($id, $msg) 関数を修正して下さい。
    修正前  print("<form action='miyama2.php' method='get'>\n");
    修正後  print("<form action='miyama2_login.php' method='get'>\n");
    
    miyama2_call.php の Link_URL(id) 関数を修正して下さい。
    修正前  str= "miyama2.php?mode=PLAY&id=" + id;
    修正後  str= "miyama2_login.php?mode=LOGIN&id=" + id;
    
  3. サーバー上で定期的に miyama.txt を調べて 'miyama2_login.php' を呼び出す 'miyama2_call.php' を作成します。
    utf-8 でタイプしてアップロードして下さい。
    <html>
    <head>
      <meta charset=utf-8">
      <title>WAIT</title>
    <script type="text/javascript">
    function Link_URL(id)
    {
        str= "miyama2.php?mode=PLAY&id=" + id;
        //str= "miyama2_login.php?mode=LOGIN&id=" + id;
        //window.alert(str);
        location.href = str;
    }
    </script>
    <?php
    function  get()
    {   global $state;
        if (!($fp = fopen("miyama.txt","r")))
        {   exit("Text File Open Error");  }
        $state  = intval(fgets($fp));
        fclose($fp);
    }
    ?>
    
    <body bgcolor=#f4f8ff>
    <h2>Miyama2 WAIT</h2>
    <?php
        $id= $_GET['id'];
        $st= $_GET['st'];
        $state= 0;
        for($i=0; $i<25; $i++)
        {   get();
            if ($state==$st || $state>2) break;
            sleep(1);
        }
        if ($i<25)
        {   print("<script type='text/javascript'>\n");
            print("var id = '" . $id . "';\n");
            print("Link_URL(id)");
            print("</script>\n");
        }
        else    print "$id *time out!*";    
    ?>
    </body>
    </html>
    
  4. 'miyama2_call.php' では1秒ごとに "miyama.txt" を入力して $st と同じ値、または $state>2 になると Link_URL(id) を呼び出します。
        if ($state==$st || $state>2) break;
        sleep(1);
    
  5. miyama2_login.php の呼び出しはパラメータを渡すので JavaScript の関数 Link_URL(id) を使います。
        print("<script type='text/javascript'>\n");
        print("var id = '" . $id . "';\n");
        print("Link_URL(id)");
        print("</script>\n");
    
  6. プレイヤーのログインを管理する miyama2_login.php です。
    miyama2_class.php を組み込んでいます。utf-8 でタイプしてアップロードして下さい。
    <html>
    <head>
      <meta charset=utf-8">
      <title>Miyama2</title>
    <script type="text/javascript">
    // Wait Call
    function Link_URL(id, st)
    {   str= "miyama2_call.php?id=" + id + "&st=" + st;
        //window.alert(str);
        location.href = str;
    }
    </script>
    </head>
    
    <body bgcolor=#f4f8ff>
    <h2>Miyama2 Login</h2>
    <?php
        require_once("miyama2_class.php");
        $game= new miyama2_class();
        $id= $_GET['id'];       //id
        $mode= $_GET['mode'];   //mode
        if ($mode=='RESET')
        {   $game->put_file();
            $game->form_call('none', "Game Reset");
            return;
        }
        if (!isset($id))    $id= '-';
        if ($id=='-')
        {   $game->form_call('none', "ID Please");
            return;
        }
        $game->get_file();
        if ($game->state>0)
        {   require("imgrand.php");
            print "<br><br>Login $id Standby<br>\n";
            return;
        }
        $game->action($id, 0);
        $game->put_file();
        print("<script type='text/javascript'>\n");
        print("var id = '" . $id . "';\n");
        print("Link_URL(id, 2)");
        print("</script>\n");
        return;
    ?>
    
  7. Miyama2 Class の Form から miyama2_login.php を呼び出します。
    最初に RESET を選んで miyama.txt をクリアしてから、プレイヤーがログインします。
        function form_call($id, $msg)
        {   print "$id:$msg<br>\n";
            //print("<form action='miyama2.php' method='get'>\n");
            print("<form action='miyama2_login.php' method='get'>\n");
            print("ID:<input type=text name='id' value=\"$id\"><br><br><br><br>\n");
            print("<input type=submit name='mode' value='LOGIN' /><br>\n");
            print("<input type=submit name='mode' value='RESET' /><br>\n");
            print("</form>");
        }
    
  8. miyama2_login.php が呼び出されると require_once("miyama2_class.php"); で組み込んで、$game= new miyama2_class(); で Class を生成します。
    パラメータで渡された $id, $mode を取得します。
        require_once("miyama2_class.php");
        $game= new miyama2_class();
        $id= $_GET['id'];       //id
        $mode= $_GET['mode'];   //mode
    
  9. $mode=='RESET' のときは miyama.txt を初期化します。
    $id が設定されていないときは、IDをタイプするように促します。
        if ($mode=='RESET')
        {   $game->put_file();
            $game->form_call('none', "Game Reset");
            return;
        }
        if (!isset($id))    $id= '-';
        if ($id=='-')
        {   $game->form_call('none', "ID Please");
            return;
        }
    
  10. get_file(); で miyama.txt から最新データを入力します。
    logn(0, $id); はデバッグ情報の収集です。
    $game->state が0より大きいときは、二人のプレイヤーがログインしたときです。
    require() で画像を並べて描画する "imgrand.php" を呼び出しています。
    imgrand.php の説明は Image Rand を参照して下さい。
        $game->get_file();
    //$game->logn(0, $id);
        if ($game->state>0)
        {   require("imgrand.php");
            return;
        }
    
  11. action($id, 0) でログインして Link_URL() で対戦相手のログインを待ちます。
    Link_URL() は JavaScript の関数です。
        $game->action($id, 0);
        $game->put_file();
        print("<script type='text/javascript'>\n");
        print("var id = '" . $id . "';\n");
        print("Link_URL(id, 2)");
        print("</script>\n");
        return;
    
  12. Link_URL() から起動された miyama2_call.php では miyama.txt を調べて $state が2になると miyama2_login.php を呼び直します。
    2はプレイヤーBの手番ですが、このゲームはプレイヤーBの先手で始まります。
  13. miyama2_call.php から miyama2_login.php が呼び直されたときは、このプログラムの先頭から実行されます。
    今度は $state が0より大きいので "imgrand.php" で画像が描画されます。
        if ($game->state>0)
        {   require("imgrand.php");
            return;
        }
    
    プレイヤーAとプレイヤーBが同時にこのプログラムを起動する場合を考えてみて下さい。

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