示例#1
0
    /*ChangeColorofPuttablePlace(void):ある手番で石を置ける場所の盤面の色を変える
     * 引数:int[,]boarddata(盤面),int turn(手番)
     * 返り値:なし*/
    void ChangeColorofPuttablePlace(int[,] boarddata, int turn)
    {
        //石を置ける場所のリストを取得
        ReversiScript  rs           = Camera.main.GetComponent <ReversiScript>();
        List <Vector2> puttablelist = rs.FindPuttablePlace(boarddata, turn);

        //リストから要素を取り出し1箇所ずつ色を変える
        foreach (Vector2 place in puttablelist)
        {
            Planes[(int)place.x, (int)place.y].GetComponent <Renderer>().material.color = new Color(0, 1, 0.87f);
        }
    }
示例#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);
        }
    }