/* ******************************************************* * Obtengo todos los posibles movimientos de una ficha. * Se recibe la ficha a la que desea saber los posibles movimientos. * Se permiten movimientos laterales y diagonales. * Agrega a la lista de buscados. *********************************************************/ public void obtenerAliadosDiagonal(Ficha posActual) { Ficha meta = this.campoJuego.getMeta(); int x = posActual.getX() - 1; int y = posActual.getY() - 1; for (int posX = x; posX < (x + 3); posX++) { for (int posY = y; posY < (y + 3); posY++) { // Si no se sale del tablero y además no se evalua la misma ficha. if ((posX >= 0 && posX < this.rows) && (posY >= 0 && posY < this.cols) && (posActual.getX() != posX || posActual.getY() != posY)) { // Si es un movimiento válido (No es un enemigo y no lo había hecho previamente). if (movimientoValido(posActual, posX, posY)) { Blanco nuevaFicha = new Blanco(posX, posY, posActual); nuevaFicha.setCostoManhattan(meta); // Si es diagonal me muevo en diagonal. En caso contrario me muevo en línea Recta. moverFicha(posX, posY, posActual, nuevaFicha); listaBuscados.insert(nuevaFicha); // Se inserta la nueva ficha. } } } } }
/* ******************************************************* * Obtengo todos los posibles movimientos de una ficha. * Se recibe la ficha a la que desea saber los posibles movimientos. * Solo se permiten movimientos laterales (arriba, abajo, derecha e izquierda). * Agrega a la lista de buscados. *********************************************************/ public void obtenerAliadosLaterales(Ficha posActual) { Ficha meta = this.campoJuego.getMeta(); int x = posActual.getX(); int y = posActual.getY(); int[,] positions = new int[4, 2] { { x - 1, y }, { x + 1, y }, { x, y - 1 }, { x, y + 1 } }; // Realice cuatro veces por las diagonales de las fichas. for (int pos = 0; pos < 4; pos++) { int posX = positions[pos, 0]; int posY = positions[pos, 1]; // Si no se sale del tablero y además no se evalua la misma ficha. if ((posX >= 0 && posX < this.rows) && (posY >= 0 && posY < this.cols) && (posActual.getX() != posX || posActual.getY() != posY)) { // Compare tablero[i, j]; if (movimientoValido(posActual, posX, posY)) { Blanco nuevaFicha = new Blanco(posX, posY, posActual); nuevaFicha.setCostoManhattan(meta); // Si es diagonal me muevo en diagonal. En caso contrario me muevo en línea Recta. moverFicha(posX, posY, posActual, nuevaFicha); listaBuscados.insert(nuevaFicha); // Se inserta la nueva ficha. } } } }
/* Obtenga la ficha en su posición 0. */ public Blanco getFicha() { if (this.listaBuscados.Count > 0) { Blanco ficha = this.listaBuscados[0]; this.listaBuscados.Remove(ficha); return(ficha); } return(null); }
/* Se crea el tablero. */ public void crearTablero() { for (int i = 0; i < this.filas; i++) { for (int j = 0; j < this.columnas; j++) { tablero[i, j] = new Blanco(i, j); } } }
/* Mueve la ficha dependiendo de las posiciones X y Y. */ public void moverFicha(int posX, int posY, Ficha posActual, Blanco nuevaFicha) { // Si es diagonal me muevo en diagonal. En caso contrario me muevo en línea Recta. if (posX == posActual.getX() || posY == posActual.getY()) { nuevaFicha.advanceNormal(campoJuego.getCostoLateral()); } else { nuevaFicha.advanceDiagonal(campoJuego.getCostoDiagonal()); } }
/* Inserta una ficha dependiendo de su costo (menores primero). */ private void insertElement(Blanco ficha) { for (int i = 0; i < this.listaBuscados.Count; i++) { Blanco fichaActual = this.listaBuscados[i]; // Si la nueva ficha tiene un costo menor. if (fichaActual.getCostoCompleto() >= ficha.getCostoCompleto()) { this.listaBuscados.Insert(i, ficha); return; } } this.listaBuscados.Add(ficha); // Agreguela al final. }
/* Inseta un elemento, primero revise si ya se insertó en la lista de búsqueda previamente. */ public void insert(Blanco ficha) { for (int i = 0; i < this.listaBuscados.Count; i++) { Blanco fichaTemp = listaBuscados[i]; // Si las dos fichas tienen la misma posición. if (ficha.compararFicha(fichaTemp)) { // Si su costo es menor a la previa. if (ficha.getCostoCompleto() < fichaTemp.getCostoCompleto()) { cambiosRealizados++; listaBuscados.Remove(fichaTemp); this.insertElement(ficha); // Inserte si su costo es menor. } return; } } this.insertElement(ficha); // Inserte si no tiene coincidencias. }