ネット対戦じゃんけんゲーム

ルールは違いますが、コンピュータと対戦する「じゃんけんゲーム」は じゃんけんゲームβ版 を参照して下さい。

サーバーを介してクライアント同士が、じゃんけんをするゲームです。
<a href="http://maedakobe.rw.xsi.jp/php/jyanken.php" target="_blank">ネット対戦じゃんけんゲーム</a><br>
次のリンクをクリックすると「じゃんけんゲーム」が始まります。
記録をリセットしてから二人のプレイヤーが同時にログインして下さい。
ネット対戦じゃんけんゲーム

★ゲームの手順は「ゲームの進行は $state で管理します。」を参照して下さい。
(1台のパソコンで別のホームページを立ち上げてテストすることも出来ます)

プログラム設計

  1. ネット対戦ゲームでは、ゲームそのものよりもサーバーを介して情報をやり取りする処理が面倒です。
    クライアント間で参照するデータは、当然ながらサーバー上に置いて不規則に更新されます。
    更新された情報をクライアントが取得するには、サーバーに対して送信要求(Polling)を出します。
    Polling の説明は PollingPolling Test を参照して下さい。
    ネット対戦ゲームでは Jyanken Class と jyanken.txt を使用します。
    Jyanken Class の説明は Jyanken Class を参照して下さい。
  2. ゲームの進行は $state で管理します。
    1. リセットを選んで jyanken.txt を初期化する
    2. $state : 0
      プレイヤーAがログインする
      プレイヤーBが別のネット環境(または、別のホームページを立ち上げて)ログインする
    3. $state : 1
      二人のプレイヤーがじゃんけんをする
    4. $state : 2
      勝ち負けを表示して、勝敗の確認をする
    5. $state : 9
      ゲームを終了する
    6. プレイを選択中にポーリングが入ると画面が切り替わる場合があります。
      画面が変わると送信できていないことがあるので、改めて選択して下さい。
      (現在の状況は表で確認することが出来ます)
  3. jyanken_class.php のソースコードは Jyanken Class に掲載しています。
    Shift_JIS でタイプしてアップロードして下さい。
    utf-8 でアップロードすることも出来ますが、コマンドプロンプトでコンパイルすると全角が文字化けします。

jyanken.php

  1. jyanken_class.php を組み込んで、じゃんけんゲームをする jyanken.php です。
    Shift_JIS でタイプしてアップロードして下さい。
    jyanken.php は5秒ごとに呼び出されます。
    <html>
    <head><meta http-equiv="content-type" content="text/html; charset=Shift_JIS"></head>
    
    <body bgcolor=#fafeff>
      <h1>ネット対戦</h1>
    <?php
        require_once("jyanken_class.php");
        $game= new jyanken_class();
        $id= $_GET['id'];       //ID
        $play= $_GET['play'];   //Play
        if ($play==4)
        {   $game->put_file();
            $game->form_call('-', "ゲームをリセットしました");
            return;
        }
        if (!isset($id))
        {   $game->form_call('-', "ID をタイプして下さい");
            return;
        }
        $game->get_file();
        switch($play)
        {   case 5:
                $game->state= 9;
                $game->put_file();
                break;
            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 *";
                break;
        }
        $game->check($id, $play);
        if ($game->state==9)
        {   print("** ゲームを終了します **<br>\n");
            exit();
        }
        $game->form_call($id, $msg);
    ?>
    <script type="text/javascript">
    function update()
    {   var id = "<?php echo $id;?>";
        str = "jyanken.php?play=9&id=" + id;
        location.href = str;
    }
    setTimeout('update()',5000);
    </script>
    </body>
    </html>
    
  2. jyanken.php の説明です。
    jyanken.php は jyanken class の form から id と play をパラメータにして呼び出されます。
    id にはプレイヤーのニックネームが設定されています。
    play の説明は Jyanken Class を参照して下さい。
    jyanken.php は5秒ごとにポーリングでも呼び出されます。
  3. require_once("jyanken_class.php"); で jyanken_class.php を組み込みます。
    $game= new jyanken_class(); で jyanken_class を生成して $id と $play を取得します。
        require_once("jyanken_class.php");
        $game= new jyanken_class();
        $id= $_GET['id'];       //ID
        $play= $_GET['play'];   //Play
    
  4. $play==4 のとき、jyanken.txt を初期化します。
        if ($play==4)
        {   $game->put_file();
            $game->form_call('-', "ゲームをリセットしました");
            return;
        }
    
  5. $game->get_file(); でサーバー(jyanken.txt)から現在(最新)の情報を取得します。
    $play の指示に従ってゲームを進行します。
        $game->get_file();
        switch($play)
        {   case 5:
                $game->state= 9;
                $game->put_file();
                break;
            case 0: case 1: case 2: case 3:
                $game->action($id, $play);
                $msg= $game->message();
                break;
    
  6. $play==9 のときはポーリングの呼び出しです。
    ポーリングのときは $game->message(); でメッセージを取得して表示します。
            case 9:
                $msg= $game->message();
                break;
    
  7. JavaScript で setTimeout を設定して5秒後に update() 関数を呼び出します。
    setTimeout('update()',5000);
    
  8. update() 関数では play を 9 にして "jyanken.php" を再起的にコールします。
    jyanken.php は5秒ごとにポーリングで呼び出されます。
    function update()
    {   var id = "<?php echo $id;?>";
        str = "jyanken.php?play=9&id=" + id;
        location.href = str;
    }
    
  9. このプログラムは Jyanken Login とほとんど同じです。見比べて下さい。
    Jyanken Class でも説明していますが form_call() 関数の後に次のコードを追加すると、じゃんけんの結果を画像で示してくれます。
        function form_call($id, $msg)
        {     ・
              ・
              ・
            print "</form>";
            if ($this->state==2)
            {   print "<img src=\"img/jyanken$this->play_a.gif\">";
                print "<img src=\"img/jyanken$this->play_b.gif\"><br>\n";
            }
        }
    

[Previous Chapter ↑] Jyanken Login

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