private void NuevaPartida()
        {
            Turno       = 0;
            currentNodo = mainNodo;
            estado      = new int[10] {
                -1, 0, 0, 0, 0, 0, 0, 0, 0, 0
            };

            AsignarCeldas(estado);
        }
        private int CrearArbolJugadas(NodoJuego nodo)
        {
            int nJugadasNivel = 9 - nodo.nivel;
            int celda         = 1;
            int jugador       = nodo.nivel % 2 == 0 ? TipoJugador.Humano : TipoJugador.IA;

            //Thread.Sleep(500);
            while (nJugadasNivel > 0)
            {
                if (nodo.estado[celda] == 0)
                {
                    NodoJuego nodoHijo = new NodoJuego(nodo);
                    nodo.estado.CopyTo(nodoHijo.estado, 0);
                    nodoHijo.nivel         = nodo.nivel + 1;
                    nodoHijo.estado[celda] = jugador;
                    int res = EvaluarEstado(nodoHijo.estado, jugador);
                    if (res == 3)
                    {
                        if (jugador == TipoJugador.Humano)
                        {
                            nodoHijo.valor = 1;
                        }
                        else
                        {
                            nodoHijo.valor = -1;
                        }
                    }
                    nodo.valor += nodoHijo.valor;
                    nodo.nodos.Add(nodoHijo);
                    NumeroNodos++;

                    nJugadasNivel--;
                    CrearArbolJugadas(nodoHijo);
                }
                celda++;
            }
            if (nodo.nivel < 9 && nodo.nodoPadre != null)
            {
                if (jugador == TipoJugador.Humano)
                {
                    nodo.nodoPadre.valor += nodo.nodos.Max(n => n.valor);
                }
                else
                {
                    nodo.nodoPadre.valor += nodo.nodos.Min(n => n.valor);
                }
            }


            return(0);
        }
        public MainWindowViewModel()
        {
            C1Command = new DelegateCommand(ProcesarEstadoMaquina1);
            C2Command = new DelegateCommand(ProcesarEstadoMaquina2);
            C3Command = new DelegateCommand(ProcesarEstadoMaquina3);
            C4Command = new DelegateCommand(ProcesarEstadoMaquina4);
            C5Command = new DelegateCommand(ProcesarEstadoMaquina5);
            C6Command = new DelegateCommand(ProcesarEstadoMaquina6);
            C7Command = new DelegateCommand(ProcesarEstadoMaquina7);
            C8Command = new DelegateCommand(ProcesarEstadoMaquina8);
            C9Command = new DelegateCommand(ProcesarEstadoMaquina9);

            NewCommand = new DelegateCommand(NuevaPartida);



            mainNodo.nivel = 0;
            Task.Run(() => CrearArbolJugadas(mainNodo)).ContinueWith(c => currentNodo = mainNodo);
        }
        private void ProcesarEstadoJuego(int v)
        {
            int jugador = Turno % 2 == 0 ? 1 : 2;

            if (jugador == TipoJugador.Humano) // Humano
            {
                if (estado[v] == 0)
                {
                    estado[v] = jugador;

                    Turno++;
                }
                else
                {
                    return;
                }
                if (Turno == 9)
                {
                    AsignarCeldas(estado);
                    return;
                }
            }
            // IA
            {
                foreach (var nodo in currentNodo.nodos)
                {
                    var c = estado.SequenceEqual(nodo.estado);
                    if (c)
                    {
                        currentNodo = nodo.nodos.OrderBy(n => n.valor).First();
                        currentNodo.estado.CopyTo(estado, 0);
                        break;
                    }
                }
                Turno++;
            }

            AsignarCeldas(estado);
        }
 public NodoJuego(NodoJuego nPadre)
 {
     nodoPadre = nPadre;
     nodos     = new List <NodoJuego>();
 }