Esempio n. 1
0
    public void back()
    {
        if (kk.turn - 2 >= 0)
        {
            Te teLast = kihu [kk.turn - 2];
            kihu.RemoveAt(kk.turn - 2);


            kk.Back(teLast);
            kk.turn -= 1;



            //ボタンを有効にし、駒を正しく
            for (int i = 1; i <= 81; i++)
            {
                Masu [i - 1].GetComponent <Button> ().interactable = true;
                Masu [i - 1].GetComponent <Image>().sprite         = komaPicture[kk.banKoma[i]];
            }


            for (int koma = 1; koma < 8; koma++)
            {
                hand[koma].GetComponent <Text>().text     = kk.hand [1] [koma].ToString();
                hand[koma + 8].GetComponent <Text>().text = kk.hand [0] [koma + 16].ToString();
            }
        }
    }
Esempio n. 2
0
//	float countTime;

    /*
     * public void Update () {
     *      countTime += Time.deltaTime;
     *      Debug.Log ("(●・▽・●)");
     * }
     */

    private int NegaMax(ref Te t, Kyokumenn k, int alpha, int beta, int depth, int depthMax)
    {
        int value = new int();

        //深さが最大に達していたら評価値を返して終了
        if (depth >= depthMax)
        {
            leaf++;
            value = k.evaluate();

            //先手ならプラス、後手でマイナスの値を返す
            if (k.turn % 2 == 1)
            {
                return(value);
            }
            else
            {
                return(-value);
            }
        }

        node++;

        //現在の局面での合法手を生成
        var teList = new List <Te>();

        teList = k.GenerateLegalMoves();

        value = -100000000;

        for (int i = 0; i < teList.Count; i++)
        {
            Te te = teList [i];

            //その手で一手進めた局面を作る
            //		KyokumennArray nextKyokumenn = k.DeepCopyKyokumenn ();
            k.Move(te.DeepCopy());
            k.turn += 1;

            Te tempTe = new Te();

            int eval = -NegaMax(ref tempTe, k, -beta, -alpha, depth + 1, depthMax);
            k.Back(te.DeepCopy());
            k.turn -= 1;

            //大きかったら
            if (eval > value)
            {
                value = eval;

                //αの値も更新
                if (eval > alpha)
                {
                    alpha = eval;
                }
                //最善手を更新
                best [depth, depth] = te;
                t.koma    = te.koma;
                t.from    = te.from;
                t.to      = te.to;
                t.promote = te.promote;
                t.capture = k.banKoma [te.to];

                for (int j = depth + 1; j < depthMax; j++)
                {
                    best [depth, j] = best [depth + 1, j];
                }
                //βカットの条件を満たしていたらループ終了
                if (eval >= beta)
                {
                    break;
                }
            }
        }
        return(value);
    }