新 Miyama2 Class

新ネット対戦三山くずしゲームで使用する Miyama2 Class の説明です。
  1. 対戦型三山くずしα版 では、ポーリングを待ってクライアント側から最新情報を要求していました。
    ネット対戦三山くずしゲームのように交互にプレイするゲームでは、サーバーからの呼び出しを受けてクライアント側が調べるよりも、サーバー側で待ち合せて手番になると通知する方法が適しています。
    また、ビルトインサーバーを使うときは Shift_JIS よりも utf-8 が適しているようです。
    ビルトインサーバーは、サーバーにアップロードしなくてもローカル環境で PHP のテストが出来る機能です。
    詳しい説明は PHP Install から[ビルトインサーバーを使う]を参照して下さい。
    ビルトインサーバーで PHP のソースに全角文字(日本語)を使うと文字化けすることがあります。
    そこで PHP のプログラムでは、全角文字(日本語)のメッセージを避けて utf-8 を使うことにします。
    データファイルの形式や関数の説明は Miyama Class を参照して下さい。
  2. miyama2_class.cpp の form_call() 関数の修正です。
    action= には miyama2_class を組み込んでいる親の名前を設定して下さい。
    例えば、親の名前が miyama2_login.cpp のときは 'miyama2_login.php' に書き換えます。
        print("<form action='miyama2_login.php' method='get'>\n");
        print("<form action='miyama2.php' method='get'>\n");
    
  3. miyama2_class.php のソースコードです。
    utf-8 でタイプしてアップロードして下さい。
    <?php
    header("Content-Type: text/html; charset=utf-8");
    // Miyama2 Class  utf-8 ビルトインサーバー対応版
    class  miyama2_class
    {   var $state;         //game state
        var $id_a;          //ID A
        var $id_b;          //ID B
        var $ary= array(0, 0, 0);
    
        // Constructor
        function miyama2_class()
        {   $this->state= 0;
            $this->id_a = '-';
            $this->id_b = '-';
            $this->ary= array(13, 14, 15);
        }
        // Output miyama.txt
        function  put_file()
        {   if (!($fp = fopen("miyama.txt","w")))
            {   die("miyama.txt Not Found");  }
            flock($fp,LOCK_EX);
            fputs($fp,"$this->state\r\n");
            fputs($fp,"$this->id_a\r\n");
            fputs($fp,"$this->id_b\r\n");
            fputs($fp,"{$this->ary[0]}\r\n"); 
            fputs($fp,"{$this->ary[1]}\r\n"); 
            fputs($fp,"{$this->ary[2]}\r\n"); 
            flock($fp,LOCK_UN);
            fclose($fp);
        }
        // Input miyama.txt
        function  get_file()
        {   if (!($fp = fopen("miyama.txt","r")))
            {   exit("miyama.txt Open Error");  }
            $this->state  = intval(fgets($fp));
            $this->id_a   = fgets($fp);
            $this->id_b   = fgets($fp);
            $this->id_a   = str_replace(array("\r", "\n"), '', $this->id_a);
            $this->id_b   = str_replace(array("\r", "\n"), '', $this->id_b);
            $this->ary[0] = intval(fgets($fp)); 
            $this->ary[1] = intval(fgets($fp)); 
            $this->ary[2] = intval(fgets($fp)); 
            fclose($fp);
        }
        // $this->state -> Play Game
        function action($id, $num)
        {   switch($this->state)
            {   case 0:     // Login
                    if ($this->id_a=='-')    $this->id_a= $id;
                    if ($this->id_a!=$id && $this->id_b=='-') $this->id_b= $id;
                    if ($this->id_a=='-' || $this->id_b=='-') break;
                    $this->state = 2;
                    break;
                case 1:     // Play AA
                    if ($this->id_b==$id)    break;
                    if ($this->play($id, $num)==TRUE)    $this->state= 2;
                    break;
                case 2:     // Play BB
                    if ($this->id_a==$id)    break;
                    if ($this->play($id, $num)==TRUE)    $this->state= 1;
                    break;
            }
        }
        // remove stone
        function play($id, $num)
        {   if ($num<0)  return FALSE;
            $y= intval($num/15);
            $c= $num%15;
            if ($this->ary[$y]<=$c)
            {   print "Play Error $num: $y: $c<br>\n";
                print_r($this->ary);
                return FALSE;
            }
            $this->ary[$y]= $c;
            $n= array_sum($this->ary);
            if ($n>1)    return TRUE;
            if ($this->state==1)    // Play AA
            {   if ($n==0)  $this->state= 4; // BB Win
                if ($n==1)  $this->state= 3; // AA Win
            }
            else                    // Play BB
            {   if ($n==0)  $this->state= 3; // AA Win
                if ($n==1)  $this->state= 4; // BB Win
            }
            return FALSE;
        }
        // Form Input
        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>");
        }
        // $state Message
        function message()
        {   switch($this->state)
            {   case 0: return "Login Player";
                case 1: return "Play AA";
                case 2: return "Play BB";
                case 3: return "AA win";
                case 4: return "BB win";
                case 9: return "** GAME OVER **";
                default:return "* state error *: $this->state";
            }
        }
        // Variable State
        function check($id)
        {   print "<table border='1'>";
            print "<tr><th>ID</th><th>ST</th><th>ID_A</th><th>ID_B</th><th>Y1</th><th>Y2</th><th>Y3</th></tr><tr>";
            print("<td>$id</td>");
            print("<td>$this->state</td>");
            print("<td>$this->id_a</td>");
            print("<td>$this->id_b</td>");
            print("<td>{$this->ary[0]}</td>");
            print("<td>{$this->ary[1]}</td>");
            print("<td>{$this->ary[2]}</td>");
            print("</tr></table>\n");
        }
        function log($id, $mode)
        {   $y0= $this->ary[0];
            $y1= $this->ary[1];
            $y2= $this->ary[2];
            error_log("$id, $mode; $this->state, $this->id_a, $this->id_b, [$y0, $y1, $y2]\n", 3, 'app.log');
        }
        function logn($n, $id)
        {   error_log("$n, $id; $this->state, $this->id_a, $this->id_b\n", 3, 'app.log');
        }
    }
    ?>
    

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