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)]); }
// 次に移行できるノードを取得する public List <GameTree> GetEnableMoveNodes() { if (enable_move_nodes_ == null) { enable_move_nodes_ = ReversiUtils.GetEnableMoveNodes(this); } return(enable_move_nodes_); }
// 黒と白の相対評価値を返す(黒 - 白) public int GetScoreDiff() { if (score == null) { score = ReversiUtils.CalcScore(Board); } return(score[0] - score[1]); }
// 盤面を更新する 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(); }
// 実際にシミュレーションする 勝ち 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; }
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; }
// 実際にシミュレーションする 勝ち 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; }