<?php

main();
exit();

function main()
{
    $player1 = new Player(1);
    $player2 = new Player(2);
    $field = new Field();
    if (!(is_object($player1) && is_object($player2) && is_object($field)))
        return false;
    
    $field->reset_field();
    $winCount = array("win" => 0, "lose" => 0, "draw" => 0);
    
    while (array_sum($winCount) <= 100000) {
        if (!($player1->set_mark($field)))
            return false;
        $check = $field->check_winner($player1->senko);
        if ($check == -1) {
            return false;
        } else if ($check == 1) {
            $winCount["win"]++;
        } else if ($check == 2) {
            $winCount["draw"]++;
        }
        if ($check > 0) {
            $field->reset_field();
            continue;
        }
        
        if (!($player2->set_mark($field)))
            return false;
        $check = $field->check_winner($player2->senko);
        if ($check == -1) {
            return false;
        } else if ($check == 1) {
            $winCount["lose"]++;
            $field->reset_field();
        }
    }
    
    print "win:{$winCount['win']} lose:{$winCount['lose']} draw:{$winCount['draw']}";
    return;
}

//盤面クラス
class Field
{
    //盤面情報
    protected $field;
    
    //盤面リセット
    function reset_field()
    {
        $this->field = array(array(0,0,0),array(0,0,0),array(0,0,0));
    }
    
    /*
     * 盤面取得
     */
    function get_field()
    {
        return $this->field;
    }
    
    /*
     * 勝者チェック
     * @param integer $player 1->先攻 2->後攻
     * @return integer -1->失敗 0->未勝利 1->勝利 2->引き分け
     */
    function check_winner($player)
    {
        if (!($player == 1 || $player == 2))
            return -1;
        
        //縦横
        for ($i = 0; $i < 2; $i++) {
            if (($this->field[$i][0] == $player &&
                 $this->field[$i][1] == $player &&
                 $this->field[$i][2] == $player) ||
                ($this->field[0][$i] == $player &&
                 $this->field[1][$i] == $player &&
                 $this->field[2][$i] == $player)) {
                return 1;
            }
        }
        
        //斜め
        if ($this->field[1][1] == $player &&
            ($this->field[0][0] == $player &&
             $this->field[2][2] == $player) ||
            ($this->field[0][2] == $player &&
             $this->field[2][0] == $player)) {
            return 1;
        }
        
        //引き分け
        $draw = true;
        for ($i = 0; $i < 3; $i++) {
            for ($j = 0; $j < 3; $j++) {
                if ($this->field[$i][$j] == 0)
                    $draw = false;
            }
        }
        if ($draw)
            return 2;
        
        return 0;
    }
    
    /*
     * マークをつける
     * @return boolean
     * @param integer $player 1->先攻 2->後攻
     * @param integer $x x座標
     * @param integer $y y座標
     */
    function set_mark($player, $x, $y)
    {
        if (!($player == 1 || $player == 2))
            return false;
        
        if (!(0 <= $x && $x <= 2))
            return false;
        
        if (!(0 <= $y && $y <= 2))
            return false;
        
        if ($this->field[$y][$x] != 0)
            return false;
        
        $this->field[$y][$x] = $player;
        
        return true;
    }
}

//プレイヤー
class Player
{
    //先攻後攻 1->先攻 2->後攻
    public $senko;
    
    /*
     * コンストラクタ
     * @param integer $senko
     */
    function __construct($senko)
    {
        if (!($senko == 1 || $senko == 2))
            return false;
        
        $this->senko = $senko;
    }
    
    /*
     * 打つ
     * @param Field $field
     * @return boolean
     */
    function set_mark(&$field)
    {
        $point = $this->search_field($field->get_field());
        if (count($point) != 2)
            return false;
        
        if (!$field->set_mark($this->senko, $point["x"], $point["y"]))
            return false;
        
        return true;
    }
    
    /*
     * 打つ場所を決める
     * @param array[3][3] $field フィールド情報
     * @return array 失敗時->array() 成功時->array(x, y)
     */
    function search_field($field)
    {
        if (!(is_array($field) && count($field) == 3))
            return array();
        
        for ($i = 0; $i < 3; $i++) {
            if (!(is_array($field[$i]) && count($field[$i]) == 3))
                return array();
        }
        
        $able = array();
        for ($i = 0; $i < 3; $i++) {
            for ($j = 0; $j < 3; $j++) {
                if ($field[$i][$j] == 0) {
                    $able[] = array("x" => $j, "y" => $i);
                }
            }
        }
        
        $count = count($able);
        if ($count == 0)
            return array();
        
        return $able[mt_rand() % $count];
        //return $able[rand() % $count];
    }
}