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