対戦型三山くずしα版

ネット対戦型「三山くずしゲームα版」です。
サーバーを介してクライアント同士が、三山くずしゲームで対戦します。
対戦型三山くずしゲームα版の呼び出し方です。
<a href="http://maedakobe.rw.xsi.jp/php/miyama.php" target="_blank">三山くずしゲーム</a>

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

プログラムの説明

  1. ネット対戦ゲームは、ゲームそのものよりもクライアントのマッチングとその制御が面倒です。
    三山くずしゲームのルールは 三山くずしゲームガイド を参照して下さい。
    対戦型三山くずしゲームでは Miyama Class と miyama.txt を使用します。
    Miyama Class の説明は Miyama Classを参照して下さい。
    山から石を取り除く処理は JavaScript の MouseClick() で行います。
    詳細は 二人が交互に取る を参照して下さい。
  2. miyama_class.php を組み込んで、ゲームを実行する miyama.php です。
    Shift_JIS でタイプしてアップロードして下さい。
    <html>
    <head>
      <meta http-equiv="content-type" content="text/html; charset=shift_jis">
    <script type="text/javascript">
    history.forward();
    function MouseClick(id, num)
    {   str= "miyama.php?mode=1&id=" + id + "&num=" + num;
        location.href = str;
    }
    </script>
    <?php
    // 三つの山に石を並べる
    function stone_disp($id, $ary)
    {   $w= "'" . $id . "'";
        for($i=0; $i<3; $i++)
        {   $n= $i*15;
            for($j=0; $j<$ary[$i]; $j++)
            {   print "<img src=\"img/jewel.gif\" onClick=\"MouseClick($w, $n)\">\n";
                $n++;
            }
            print "<br><br>\r\n";
        }
    }
    ?>
    </head>
    
    <body bgcolor=#f4f8ff>
    <h2>三山くずしゲーム</h2>
      <?php
        require_once("miyama_class.php");
        $game= new miyama_class();
        $id= $_GET['id'];       //id
        $mode= $_GET['mode'];   //mode
        $num= $_GET['num'];     //num
        if ($mode=='RESET')
        {   $game->state= 0;
            $game->put_file();
            $game->form_call('-', "ゲームをリセットしました");
            return;
        }
        if (!isset($id))    $id= '-';
        if ($id=='-')
        {   $game->form_call('-', "ID をタイプして下さい");
            return;
        }
        $game->get_file();
        if ($game->state>2)
        {   stone_disp($id, $game->ary);
            $msg= $game->message();
            print "<br><br>$msg<br>\r\n";
            return;
        }
        switch($mode)
        {   case 'LOGIN':
            case 1:         // $state==1 石を取り除く
                $game->action($id, $num);
                $game->put_file();       //現在の値を書き出す
                $msg= $game->message();
                break;
            case 9:
                $msg= $game->message();
                break;
            default:
                $msg = "** mode error : $mode<br>\n";
                break;
        }
        $game->check($id);
        if ($game->state==0) $game->form_call($id, $msg);
        else
        {   stone_disp($id, $game->ary);
            print("<br><br>$msg<br>\r\n");
        }
    ?>
    <script type="text/javascript">
    function update()
    {   var id = "<?php echo $id;?>";
        str= "miyama.php?mode=9&id=" + id;
        location.href= str;
    }
    setTimeout('update()',3000);
    </script>
    </body>
    </html>
    

miyama.php の説明

  1. Miyama Class の Form から miyama.php を呼び出します。
    最初に RESET を選んで miyama.txt をリセットしてから、プレイヤーがログインします。
        function form_call($id, $msg)
        {   print "$id:$msg<br>\n";
            print("<form action='miyama.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>");
        }
    
  2. 山から石を取り除く処理は JavaScript でマウスのクリックを検出します。
    img で石の画像を並べるときに onClick を設定して MouseClick() を呼び出します。
    MouseClick() を呼び出すときにIDとクリックされた画像の番号を渡します。
    function stone_disp($id, $ary)
    {   $w= "'" . $id . "'";
        for($i=0; $i<3; $i++)
        {   $n= $i*15;
            for($j=0; $j<$ary[$i]; $j++)
            {   print "<img src=\"img/jewel.gif\" onClick=\"MouseClick($w, $n)\">\n";
                $n++;
            }
            print "<br><br>\r\n";
        }
    }
    
  3. MouseClick() から miyama.php を再起的に呼び出します。
    id はプレイヤーのIDで num はクリックされた画像の番号です。
    function MouseClick(id, num)
    {   str= "miyama.php?mode=1&id=" + id + "&num=" + num;
        location.href = str;
    }
    
  4. miyama.php が呼び出されると require_once("miyama_class.php"); で組み込んで、$game= new miyama_class(); で Class を生成します。
    パラメータで渡された $id, $mode, $num を取得します。
        require_once("miyama_class.php");
        $game= new miyama_class();
        $id= $_GET['id'];       //id
        $mode= $_GET['mode'];   //mode
        $num= $_GET['num'];     //num
    
  5. $mode=='RESET' のときは miyama.txt を初期化します。
    $id が設定されていないときは、メッセージを表示します。
        if ($mode=='RESET')
        {   $game->state= 0;
            $game->put_file();
            $game->form_call('-', "ゲームをリセットしました");
            return;
        }
        if (!isset($id))    $id= '-';
        if ($id=='-')
        {   $game->form_call('-', "ID をタイプして下さい");
            return;
        }
    
  6. get_file(); で miyama.txt から最新データを入力します。
    state>2 の時はゲームオーバーです。
        $game->get_file();
        if ($game->state>2)
        {   stone_disp($id, $game->ary);
            $msg= $game->message();
            print "<br><br>$msg<br>\r\n";
            return;
        }
    
  7. $mode の値に従ってゲームを進めます。
    ゲームに進展があったときに put_file() で miyama.txt を更新します。
        switch($mode)
        {   case 'LOGIN':
            case 1:         // $state==1 石を取り除く
                $game->action($id, $num);
                $game->put_file();   //現在の値を書き出す
                $msg= $game->message();
                break;
            case 9:
                $msg= $game->message();
                break;
            default:
                $msg = "** play error : $play<br>\n";
                break;
        }
    
  8. ログイン中のときは form_call() を呼び出します。
    山から石を取り除いている時は stone_disp() を呼び出します。
        $game->check($id);
        if ($game->state==0) $game->form_call($id, $msg);
        else
        {   stone_disp($id, $game->ary);
            print("<br><br>$msg<br>\r\n");
        }
    
  9. JavaScript の update() 関数から3秒ごとにポーリングします。
    ポーリングとかち合うとクリックが効かないことがあります。
    そのときは再度クリックして下さい。
    function update()
    {   var id = "<?php echo $id;?>";
        str= "miyama.php?mode=9&id=" + id;
        location.href= str;
    }
    setTimeout('update()',3000);
    

[Previous Chapter ↑] Miyama Class

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