コード例 #1
0
ファイル: AlphaBeta.cs プロジェクト: SandiCat/OrderAndChaos
 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);
     }
 }
コード例 #2
0
ファイル: Program.cs プロジェクト: SandiCat/OrderAndChaos
        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);
            }
        }
コード例 #3
0
ファイル: AlphaBeta.cs プロジェクト: SandiCat/OrderAndChaos
        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);
            }
        }