private static double recursion(IExplorable node, int depth, double alpha, double beta, bool maximizing, int playCount) { if (depth == 0 || node.IsTerminal()) { return(node.HeuresticValue(playCount)); } if (maximizing) { double v = -inf; foreach (var child in node.Explore()) { v = Math.Max(v, AlphaBeta.recursion(child, depth - 1, alpha, beta, false, playCount + 1)); alpha = Math.Max(alpha, v); if (beta <= alpha) { break; } } return(v); } else { double v = inf; foreach (var child in node.Explore()) { v = Math.Min(v, AlphaBeta.recursion(child, depth - 1, alpha, beta, true, playCount + 1)); beta = Math.Min(beta, v); if (beta <= alpha) { break; } } return(v); } }
public static void Main(string[] args) { Console.WriteLine("Potez je oblika [x/o][a-f][1-6]"); Console.WriteLine("Npr. xd4\n"); var n = new GameTreeNode(new Board()); for (int i = 0; !n.IsTerminal(); i++) { int depth; if (i == 0) { depth = 3; } else if (i < 4) { depth = 4; } else if (i < 15) { depth = 5; } else { depth = 6; } n = AlphaBeta.BestMove(n, depth, true) as GameTreeNode; Console.Write(n); bool success = true; do { try { var move = Console.ReadLine(); var t = move[0] == 'x' ? SquareT.X : SquareT.O; int x = move[1] - 'a'; int y = move[2] - '1'; Console.WriteLine(); n.PlayMove(x, y, t); success = true; } catch { success = false; Console.WriteLine("Error. Try again."); } } while (!success); Console.Write(n); } }
public static IExplorable BestMove(IExplorable node, int depth, bool maximizing) { IExplorable best_child = null; double alpha = -inf, beta = inf; if (maximizing) { double v = -inf; foreach (var child in node.Explore()) { var v2 = AlphaBeta.recursion(child, depth - 1, alpha, beta, false, 1); if (v2 > v) { v = v2; best_child = child; } alpha = Math.Max(alpha, v); if (beta <= alpha) { break; } } return(best_child); } else { double v = inf; foreach (var child in node.Explore()) { var v2 = AlphaBeta.recursion(child, depth - 1, alpha, beta, true, 1); if (v2 < v) { v = v2; best_child = child; } beta = Math.Min(beta, v); if (beta <= alpha) { break; } } return(best_child); } }