/*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); } }
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); } }