Пример #1
0
        public override GameTree Play(GameTree tree)
        {
            // 最大の取得数の中からランダムにする
            Dictionary <int, List <GameTree> > dict = new Dictionary <int, List <GameTree> >();
            int max_value = -1;

            foreach (var node in tree.GetEnableMoveNodes())
            {
                int value = ReversiUtils.GetObtainStones(tree.Board, node.PrevPos, tree.StoneType).Count;

                if (value > max_value)
                {
                    dict.Add(value, new List <GameTree>());
                    max_value = value;
                }

                if (value == max_value)
                {
                    dict[value].Add(node);
                }
            }

            int n = dict[max_value].Count;

            return(dict[max_value][Random.Range(0, n)]);
        }
Пример #2
0
 // 次に移行できるノードを取得する
 public List <GameTree> GetEnableMoveNodes()
 {
     if (enable_move_nodes_ == null)
     {
         enable_move_nodes_ = ReversiUtils.GetEnableMoveNodes(this);
     }
     return(enable_move_nodes_);
 }
Пример #3
0
 // 黒と白の相対評価値を返す(黒 - 白)
 public int GetScoreDiff()
 {
     if (score == null)
     {
         score = ReversiUtils.CalcScore(Board);
     }
     return(score[0] - score[1]);
 }
Пример #4
0
        // 盤面を更新する
        public void ProcBoard(GameTree tree)
        {
            black_cnt_ = 0;
            white_cnt_ = 0;

            // 石の色を変える
            for (int y = 0; y < 8; ++y)
            {
                for (int x = 0; x < 8; ++x)
                {
                    int index = y * 8 + x;

                    switch (tree.Board[x, y])
                    {
                    case eStoneType.None:
                        stones_[index].gameObject.SetActive(false);
                        break;

                    case eStoneType.Black:
                        ++black_cnt_;
                        stones_[index].gameObject.SetActive(true);
                        stones_[index].color = front_color_;
                        break;

                    case eStoneType.White:
                        ++white_cnt_;
                        stones_[index].gameObject.SetActive(true);
                        stones_[index].color = back_color_;
                        break;

                    default:
                        break;
                    }
                }
            }

            // 次に選択できるマスを半透明で載せる
            var enable_pos = ReversiUtils.GetEnableHands(tree.Board, tree.StoneType);

            foreach (var pos in enable_pos)
            {
                stones_[pos].gameObject.SetActive(true);
                Color color = front_color_;
                color.a = 0.4f;
                if (tree.StoneType == eStoneType.White)
                {
                    color   = back_color_;
                    color.a = 0.55f;
                }
                stones_[pos].color = color;
            }

            // 石のテキストを更新
            black_text_.text = black_cnt_.ToString();
            white_text_.text = white_cnt_.ToString();
        }
Пример #5
0
        // 実際にシミュレーションする 勝ち 1 引き分け 0.5 負け 0
        // 自分相手の手はランダム
        public float SimulateRandomPlay(eStoneType player)
        {
            GameTree node = GameTree;
            int n = node.GetEnableMoveNodes().Count;
            while (n != 0)
            {
                node = new GameTree(node.GetEnableMoveNodes()[Random.Range(0, n)]);
                n = node.GetEnableMoveNodes().Count;
            }

            int ret = ReversiUtils.JudgeResult(node.Board);
            if (player == eStoneType.White) ret *= -1;
            return ret / 2f + 0.5f;
        }
Пример #6
0
        private int SimulateRandomPlay(GameTree tree, eStoneType player)
        {
            GameTree node = tree;
            int n = node.GetEnableMoveNodes().Count;
            // ゲームが終了するまでやる
            while(n != 0)
            {
                node = new GameTree(node.GetEnableMoveNodes()[Random.Range(0, n)]);
                n = node.GetEnableMoveNodes().Count;
            }

            int ret = ReversiUtils.JudgeResult(node.Board);
            if (player == eStoneType.White) ret *= -1;
            return ret;
        }
Пример #7
0
        // 実際にシミュレーションする 勝ち 1 引き分け 0.5 負け 0
        // 相手の手法を引数で渡す
        public float SimulateSelectedPlay(eStoneType player, BasePlayer opponent)
        {
            GameTree node = GameTree;
            int n = node.GetEnableMoveNodes().Count;
            while(n != 0)
            {
                // 自分の番ならランダムに 相手の番なら指定した手法を用いて考える
                if(node.StoneType == player) node = new GameTree(node.GetEnableMoveNodes()[Random.Range(0, n)]);
                else node = opponent.Play(node);
                n = node.GetEnableMoveNodes().Count;
            }

            int ret = ReversiUtils.JudgeResult(node.Board);
            if (player == eStoneType.White) ret *= -1;
            return ret / 2f + 0.5f;
        }