/// <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; }
/// <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]); } } }
/// <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()); }