Miyama Class

ネット対戦三山くずしゲームで使用する Miyama Class とデータファイルの仕様です。

データファイルの仕様

  1. サーバーを介して二人のプレイヤーが「三山くずしゲーム」をします。
    ネット対戦ゲームでは、ゲームそのものよりもサーバーを介して情報をやり取りする処理が面倒です。
    クライアント間で参照するデータは、当然ながらサーバー上に置いて不規則に更新されます。
    ネット対戦三山くずしゲームでは TEXT 形式のファイル(miyama.txt)をサーバー上に置いて、情報を交換しながらゲームを進めます。
    Miyama Class のベースとなる Class は Login Class を参照して下さい。
  2. TEXT 形式のファイル miyama.txt の仕様です。
    miyama.txt はサーバーにアップロードして、書き込みと読み込み属性を許可して下さい。
    内容は初期化されるので、何でもかまいません。
    名前 説明
    $state ゲームの進行状態
    $id_a プレイヤーAのID
    $id_b プレイヤーBのID
    $ary[3]山の石の数
  3. $state でゲームの進行を管理します。
    $state 説明
    0 二人のプレイヤーが揃うのを待つ
    1 プレイヤーAがプレイする
    2 プレイヤーBがプレイする
    3 プレイヤーAの勝ち
    4 プレイヤーBの勝ち
    9 ゲームを終了する
  4. プレイヤーから渡される $mode の値です。
    LOGINプレイヤーがログイン
    1山から石を取り除く
    RESETゲームをリセット
    9ポーリング

miyama_class

  1. miyama_class で定義されている関数の説明です。
  2. miyama_class.php のソースコードです。
    Shift_JIS でタイプしてアップロードして下さい。
    <?php
    header("Content-Type: text/html; charset=shift_jis");
    class  miyama_class
    {   var $state;         //game state
        var $id_a;          //ID A
        var $id_b;          //ID B
        var $ary= array(0, 0, 0);
    
        // Constructor
        function miyama_class()
        {   $this->state= 0;
            $this->id_a = '-';
            $this->id_b = '-';
            $this->ary= array(13, 14, 15);
        }
        // ファイルの出力
        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);
        }
        // ファイルの入力
        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 に従ってゲームを進行
        function action($id, $num)
        {   switch($this->state)
            {   case 0:     // プレイヤーのログイン
                    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:     // Aの手番
                    if ($this->id_b==$id)   break;
                    if ($this->play($id, $num)==TRUE)   $this->state= 2;
                    break;
                case 2:     // Bの手番
                    if ($this->id_a==$id)   break;
                    if ($this->play($id, $num)==TRUE)   $this->state= 1;
                    break;
                default:
                    print("** action state error : $this->state **<br>\n");
                    exit();
            }
        }
        // 山から石を取り除き、終了を判定する
        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)    // AA の手番
            {   if ($n==0)  $this->state= 4;    // BB の勝ち
                if ($n==1)  $this->state= 3;    // AA の勝ち
            }
            else                    // BB の手番
            {   if ($n==0)  $this->state= 3;    // AA の勝ち
                if ($n==1)  $this->state= 4;    // BB の勝ち
            }
            return FALSE;
        }
        // Form からIDをタイプしてログイン
        function form_call($id, $msg)
        {   print "$id:$msg<br>\n";
    //        print("<form action='miyama.php' method='get'>\n");
            print("<form action='miyama_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 に従ったメッセージを設定する
        function message()
        {   switch($this->state)
            {   case 0: return "二人のプレイヤーがログインして下さい";
                case 1: return "プレイヤーAの手番です";
                case 2: return "プレイヤーBの手番です";
                case 3: return "プレイヤーAの勝ちを確認して終了して下さい";
                case 4: return "プレイヤーBの勝ちを確認して終了して下さい";
                case 9: return "** GAME OVER **";
                default:return "* state error *: $this->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');
        }
    }
    ?>
    

[Next Chapter ↓] ネット対戦三山くずしゲーム
[Previous Chapter ↑] 二人が交互に取る

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