Exemplo n.º 1
0
    /*PutDisk(void):ターン中処理(盤面の更新、再描画、次のターンに向けた処理)
     * 引数:int[,]boarddata,int turn(手番),int[] index(石を置く位置)
     * 返り値:なし*/
    void PutDisk(int[,] boarddata, int turn_tmp, int[] index)
    {
        ReversiScript rs = Camera.main.GetComponent <ReversiScript>();

        Debug.Log(turn_tmp);
        Debug.Log(index[0] + "," + index[1]);
        //そこに石が置けるか
        if (rs.IsPuttable(boarddata, turn_tmp, new Vector2(index[0], index[1])))
        {
            //盤面の色を戻す
            ChangeColorofPlanestoGreen();
            //石を置いて盤面データを更新
            board = rs.flip(boarddata, turn_tmp, new Vector2(index[0], index[1]));
            //盤面を再描画
            ClearBoard();
            PutDisksfromMatrix(board);
            //次の手番に向けた処理
            //終了判定
            turn = turn * (-1);
            if (rs.IsEnd(board, turn_tmp * (-1)))
            {
                //今石を置いてゲームが終わるとき
                GameEnd(board);
            }
            else
            {
                //ゲームが続くとき
                //置ける場所の色を変える
                ChangeColorofPuttablePlace(board, turn_tmp * (-1));
            }
        }
    }
Exemplo n.º 2
0
    List <Vector2> bestplaces = new List <Vector2>(); //深さごとの最善手を入れるリスト

    public int Alphabeta(int[,] boarddata, int tmpturn, int comturn, int depth, int alpha, int beta)
    {
        //今の局面で選択できる手を求める
        ReversiScript  rs           = Camera.main.GetComponent <ReversiScript>();
        List <Vector2> puttablelist = rs.FindPuttablePlace(boarddata, tmpturn);

        //終端ノード(打てる手がない)or充分な深さで打ち切り
        if (puttablelist.Count() == 0 || depth == 0)
        {
            return(evaluation(boarddata, tmpturn));
        }

        if (tmpturn == comturn)
        {
            //ノードが自分のターンの時
            foreach (Vector2 place in puttablelist)
            {
                //置いた後の盤面を生成
                int[,] newboard = rs.flip(boarddata, tmpturn, place);
                //子ノードの評価値を求める
                int point = Alphabeta(newboard, tmpturn * (-1), comturn, depth - 1, alpha, beta);
                if (point > alpha)
                {
                    //評価値がalphaを上回るときは手とalphaを更新
                    Vector2 tmpvector = place;
                    bestplaces[depth - 1] = tmpvector;
                    alpha = point;
                }
                else
                {
                    //alphaカット
                    break;
                }
            }
            return(alpha);
        }
        else
        {
            //ノードが相手のターンの時
            foreach (Vector2 place in puttablelist)
            {
                //石を置いた後の盤面を生成
                int[,] newboard = rs.flip(boarddata, tmpturn, place);
                //子ノードの評価値を求める
                int point = Alphabeta(newboard, tmpturn * (-1), comturn, depth - 1, alpha, beta);
                if (point < beta)
                {
                    //評価値がbetaを下回るときは手とbetaを更新
                    Vector2 tmpvector = place;

                    bestplaces[depth - 1] = tmpvector;
                    beta = point;
                }
                else
                {
                    //betaカット
                    break;
                }
            }
            return(beta);
        }
    }