static bool MesmoTabuleiro(ClasseMiniMax a, ClasseMiniMax b, bool comparaPlacarRecursivo)
        {
            if (a == b)
            {
                return(true);
            }
            if (a == null || b == null)
            {
                return(false);
            }
            for (int i = 0; i < a.m_Valores.Length; i++)
            {
                if (a.m_Valores[i] != b.m_Valores[i])
                {
                    return(false);
                }
            }

            if (a.m_Placar != b.m_Placar)
            {
                return(false);
            }
            if (comparaPlacarRecursivo && Math.Abs(a.PlacarRecursivo) != Math.Abs(b.PlacarRecursivo))
            {
                return(false);
            }
            return(true);
        }
        public ClasseMiniMax EncontraProximoMovimento(int profundidade)
        {
            ClasseMiniMax ret01 = null;

            MiniMax(profundidade, m_TurnoJogadorX, int.MinValue + 1, int.MaxValue - 1, out ret01);
            return(ret01);
        }
        public void ObtemProximoMovimentoDoUsuario()
        {
            if (Atual.noFinal())
            {
                return;
            }

            while (true)
            {
                try
                {
                    Console.WriteLine("O tabuleiro atual é:\n{0}\n Informe valor em x:[0-1-2]", Atual);
                    int x = int.Parse(Console.ReadLine());
                    Console.WriteLine("Informe valor em y:[0-1-2]");
                    int y = int.Parse(Console.ReadLine());
                    Console.WriteLine("x={0},y={1}", x, y);
                    Atual = Atual.ObtemFilhoNaPosicao(x, y);
                    Console.WriteLine(Atual);
                    return;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        public void MovimentoDoComputador(int profundidade)
        {
            ClasseMiniMax proximo = Atual.EncontraProximoMovimento(profundidade);

            if (proximo != null)
            {
                Atual = proximo;
            }
        }
 public static bool TabuleiroSimilar(ClasseMiniMax a, ClasseMiniMax b)
 {
     if (MesmoTabuleiro(a, b, false))
     {
         return(true);
     }
     foreach (Transforma t in Transforma.s_Transforma)
     {
         ClasseMiniMax novoB = b.TransformaTabuleiro(t);
         if (MesmoTabuleiro(a, novoB, false))
         {
             return(true);
         }
     }
     return(false);
 }
 public int MiniMax(int profundidade, bool precisaMax, int alpha, int beta, out ClasseMiniMax filhoComMax)
 {
     filhoComMax = null;
     System.Diagnostics.Debug.Assert(m_TurnoJogadorX == precisaMax);
     if (profundidade == 0 || noFinal())
     {
         PlacarRecursivo = m_Placar;
         return(m_Placar);
     }
     foreach (ClasseMiniMax cur in ObtemFilho())
     {
         ClasseMiniMax burro;
         int           placar = cur.MiniMax(profundidade - 1, !precisaMax, alpha, beta, out burro);
         if (!precisaMax)
         {
             if (beta > placar)
             {
                 beta        = placar;
                 filhoComMax = cur;
                 if (alpha >= beta)
                 {
                     break;
                 }
             }
         }
         else
         {
             if (alpha < placar)
             {
                 alpha       = placar;
                 filhoComMax = cur;
                 if (alpha >= beta)
                 {
                     break;
                 }
             }
         }
     }
     PlacarRecursivo = precisaMax ? alpha : beta;
     return(PlacarRecursivo);
 }
 public JogoDaVelha()
 {
     EntradaGrade[] valores = Enumerable.Repeat(EntradaGrade.Vazio, 9).ToArray();
     inicia = new ClasseMiniMax(valores, true);
     Atual  = inicia;
 }