private int NegaMaxKai(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); } } //現在の局面での合法手を生成 var teList = new List <Te>(); teList = k.GenerateLegalMoves(); /* * if (depth == 3) { * if (teList.Count >= 70) { * leaf++; * value = k.evaluate (); * * //先手ならプラス、後手でマイナスの値を返す * if (k.turn % 2 == 1) { * return value; * } else { * return -value; * } * } * } */ node++; if (node == 1) { k.SortTe(ref teList); } value = -100000000; for (int i = 0; i < teList.Count; i++) { Te te = teList [i]; //その手で一手進めた局面を作る // KyokumennArray nextKyokumenn = k.DeepCopyKyokumenn (); k.Move(te); k.turn += 1; Te tempTe = new Te(); int eval = -NegaMax(ref tempTe, k, -beta, -alpha, depth + 1, depthMax); k.Back(te); 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); }