コード例 #1
0
        /* *******************************************************
        * 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.
                        }
                    }
                }
            }
        }
コード例 #2
0
        /* *******************************************************
        * 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.
                    }
                }
            }
        }
コード例 #3
0
        /* Se configura el costo de Manhattan basado con respecto al punto final. */
        public void setCostoManhattan(Ficha puntoFinal)
        {
            int cost1 = Math.Abs(puntoFinal.getX() - this.x);
            int cost2 = Math.Abs(puntoFinal.getY() - this.y);

            this.costoManhattan = cost1 + cost2;
        }
コード例 #4
0
        /* *******************************************************
        * Se selecciona el jugador por primera vez.
        * No se deben haber generado enemigos.
        *********************************************************/
        public void seleccionarInicio()
        {
            Ficha fichaTemp = obtenerficha();

            // Si la ficha del jugador no está en el mismo lugar que la meta.
            while (fichaTemp.compararFicha(this.meta))
            {
                fichaTemp = obtenerficha();
            }
            this.jugador = new Jugador("Temp", fichaTemp.getX(), fichaTemp.getY());
        }
コード例 #5
0
        /* *******************************************************
        * Se selecciona la meta a seguir.
        * No se deben haber generado enemigos.
        *********************************************************/
        public void seleccionarMeta()
        {
            Ficha fichaTemp = obtenerficha();

            // Si la ficha de la meta no está en el mismo lugar que el jugador.
            while (fichaTemp.compararFicha(this.jugador))
            {
                fichaTemp = obtenerficha();
            }
            this.meta = new Meta(fichaTemp.getX(), fichaTemp.getY());
        }
コード例 #6
0
 /* 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());
     }
 }
コード例 #7
0
ファイル: Ficha.cs プロジェクト: starclip/Algoritmo-Estrella
        /* Compare si las coordenadas entre las fichas son equivalentes. */
        public Boolean compararFicha(Ficha f)
        {
            if (f == null)
            {
                return(false);
            }

            if (this.x == f.getX() && this.y == f.getY())
            {
                return(true);
            }
            return(false);
        }
コード例 #8
0
        /* *******************************************************
        * Se seleccionan las posiciones para asignar los enemigos.
        * Se deben haber seleccionado previamente la meta y el inicio.
        *********************************************************/
        public void seleccionarEnemigos(int numeroEnemigos)
        {
            this.enemigos = new Enemigo[numeroEnemigos];

            // Creo N número de enemigos.
            for (int i = 0; i < numeroEnemigos; i++)
            {
                Ficha fichaTemp = obtenerficha();
                // La ficha no puede ser la meta o el jugador.
                while (fichaTemp.compararFicha(this.meta) || fichaTemp.compararFicha(this.jugador) ||
                       fichaTemp.compararMuchasFichas(this.enemigos))
                {
                    fichaTemp = obtenerficha();
                }
                this.enemigos[i] = new Enemigo(fichaTemp.getX(), fichaTemp.getY()); // Agregué el nuevo enemigo.
            }
        }
コード例 #9
0
        /* Realiza el algoritmo Estrella. */
        public Boolean accion(Boolean Diagonales)
        {
            Ficha jugador = this.campoJuego.getJugador();

            listaInsertados.Insert(0, jugador);

            DateTime tiempoInicial = DateTime.Now;

            /* Compare si llegue a la meta. O sea ¿Inicio == Final? */
            while (compararMeta(jugador.getX(), jugador.getY()) == false)
            {
                if (Diagonales)   // Se permiten diagonales
                {
                    obtenerAliadosDiagonal(jugador);
                }
                else              // No se permiten diagonales
                {
                    obtenerAliadosLaterales(jugador);
                }

                jugador = listaBuscados.getFicha(); // Retorna el posible movimiento con el costo más bajo.
                listaInsertados.Insert(0, jugador);

                // Si no hay rutas óptimas.
                if (jugador == null)
                {
                    return(false);
                }
            }
            DateTime tiempoFinal = DateTime.Now;

            tiempoAlgoritmo = new TimeSpan(tiempoFinal.Ticks - tiempoInicial.Ticks);

            this.distanciaRecorrida = jugador.getCostoTotal();
            seleccionarRutaOptima(jugador); // Inicializo la ruta óptima con la meta hasta el punto inicial.

            return(true);
        }