Esempio n. 1
0
 /// <summary>
 /// Crea un mapa a partir de los parametros seleccionados
 /// </summary>
 /// <param name="n">Tamaño</param>
 /// <param name="imgNormal">Tipo de imagen</param>
 public Mapa(int n)
 {
     nivel = new nodonivel[n, n];
     for (int i = 0; i < n; i++)
     {
         for (int j = 0; j < n; j++)
         {
             nivel[i, j] = new nodonivel(i, j, 0);
         }
     }
     size = n;
 }
Esempio n. 2
0
        /// <summary>
        /// Toma un arreglo de potencias de dos, y lo convierte en nodos utlizables
        /// </summary>
        /// <param name="repr">Arreglo de enteros</param>
        public void numerosEnMapa(int[,] repr)
        {
            int n = size;

            nivel = new nodonivel[n, n];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    nivel[i, j] = new nodonivel(i, j, repr[i, j]);
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Retorna arrays con datos para mover los rectangulos con la siguiente forma [xi,yi,xf,yf,vcf], (vcf = valor final celda final)en orden temporal.
        /// </summary>
        /// <param name="dir">Direccion de movimiento 0=abajo CCW</param>
        /// <returns></returns>
        public int[][] Mover(int dir)
        {
            List <int[]> movimientos = new List <int[]>();
            int          lxmap       = nivel.GetLength(0);
            int          lymap       = nivel.GetLength(1);

            for (int p = 0; p < nivel.GetLength(0) * nivel.GetLength(0); p++) //son n pasadas del algoritmo
            {
                if (dir == 0)                                                 //Hacia abajo
                {
                    for (int j = lymap - 1; j > 0; j--)                       //j parte desde abajo y queda en 1 para que no quede "nivel[i,-1]"
                    {
                        for (int i = 0; i < lxmap; i++)                       //Recorrer arreglo por filas
                        {
                            nodonivel nodoactual = nivel[i, j];
                            nodonivel nodocomp   = nivel[i, j - 1]; //el de arriba
                            int       vi         = nodocomp.valor;
                            if (nodocomp.valor == 0)
                            {
                                ;                                                  //no hay movimiento
                            }
                            else if (nodocomp.valor != 0 && nodoactual.valor == 0) //se puede, este esta vacio, y baja aqui
                            {
                                nodoactual.valor = nodocomp.valor;
                                nodocomp.valor   = 0;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == true && nodocomp.sumable == true) //se puede y se suma
                            {
                                nodoactual.valor   = nodoactual.valor + nodocomp.valor;
                                nodocomp.valor     = 0;
                                nodoactual.sumable = false;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                                puntaje += nodoactual.valor;
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == false || nodocomp.sumable == false)
                            {
                                ;                                                                                                      //no se puede...
                            }
                        }
                    }
                } //done
                else if (dir == 1) //hacia la derecha
                {
                    for (int i = lxmap - 1; i > 0; i--) //i parte desde la derecha
                    {
                        for (int j = 0; j < lymap; j++) //Recorrer arreglo por columnas
                        {
                            nodonivel nodoactual = nivel[i, j];
                            nodonivel nodocomp   = nivel[i - 1, j];
                            int       vi         = nodocomp.valor;
                            if (nodocomp.valor == 0)
                            {
                                ;                                                  //no hay movimiento
                            }
                            else if (nodocomp.valor != 0 && nodoactual.valor == 0) //se puede, este esta vacio, y baja aqui
                            {
                                nodoactual.valor = nodocomp.valor;
                                nodocomp.valor   = 0;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == true && nodocomp.sumable == true) //se puede y se suma
                            {
                                nodoactual.valor   = nodoactual.valor + nodocomp.valor;
                                nodocomp.valor     = 0;
                                nodoactual.sumable = false;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                                puntaje += nodoactual.valor;
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == false || nodocomp.sumable == false)
                            {
                                ;                                                                                                      //no se puede...
                            }
                        }
                    }
                }
                else if (dir == 2)                      // hacia arriba
                {
                    for (int j = 0; j < lymap - 1; j++) //j parte desde arriba
                    {
                        for (int i = 0; i < lxmap; i++) //Recorrer arreglo por filas
                        {
                            nodonivel nodoactual = nivel[i, j];
                            nodonivel nodocomp   = nivel[i, j + 1];
                            int       vi         = nodocomp.valor;
                            if (nodocomp.valor == 0)
                            {
                                ;                                                  //no hay movimiento
                            }
                            else if (nodocomp.valor != 0 && nodoactual.valor == 0) //se puede, este esta vacio, y baja aqui
                            {
                                nodoactual.valor = nodocomp.valor;
                                nodocomp.valor   = 0;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == true && nodocomp.sumable == true) //se puede y se suma
                            {
                                nodoactual.valor   = nodoactual.valor + nodocomp.valor;
                                nodocomp.valor     = 0;
                                nodoactual.sumable = false;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                                puntaje += nodoactual.valor;
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == false || nodocomp.sumable == false)
                            {
                                ;                                                                                                      //no se puede...
                            }
                        }
                    }
                }
                else if (dir == 3) //izquierda
                {
                    for (int i = 0; i < lxmap - 1; i++)
                    {
                        for (int j = 0; j < lymap; j++) //Recorrer arreglo por columnas
                        {
                            nodonivel nodoactual = nivel[i, j];
                            nodonivel nodocomp   = nivel[i + 1, j];
                            int       vi         = nodocomp.valor;
                            if (nodocomp.valor == 0)
                            {
                                ;                                                  //no hay movimiento
                            }
                            else if (nodocomp.valor != 0 && nodoactual.valor == 0) //se puede, este esta vacio, y baja aqui
                            {
                                nodoactual.valor = nodocomp.valor;
                                nodocomp.valor   = 0;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == true && nodocomp.sumable == true) //se puede y se suma
                            {
                                nodoactual.valor   = nodoactual.valor + nodocomp.valor;
                                nodocomp.valor     = 0;
                                nodoactual.sumable = false;
                                int[] exp = { nodocomp.px, nodocomp.py, nodoactual.px, nodoactual.py, nodoactual.valor, vi };
                                movimientos.Add(exp);
                                puntaje += nodoactual.valor;
                            }
                            else if (nodocomp.valor == nodoactual.valor && nodoactual.sumable == false || nodocomp.sumable == false)
                            {
                                ;                                                                                                      //no se puede...
                            }
                        }
                    }
                }
            }
            //resetear todo lo que no era sumable
            for (int i = 0; i < nivel.GetLength(0); i++)     //x
            {
                for (int j = 0; j < nivel.GetLength(1); j++) //x
                {
                    nivel[i, j].sumable = true;
                }
            }
            return(movimientos.ToArray());
        }