Ejemplo n.º 1
0
        // Token: 0x060002B5 RID: 693 RVA: 0x0000B630 File Offset: 0x00009A30
        public List <Celda> get_Path(Celda celda_inicio, Celda celda_final, List <Celda> celdas_no_permitidas, bool detener_delante, byte distancia_detener)
        {
            bool         flag = celda_inicio == null || celda_final == null;
            List <Celda> result;

            if (flag)
            {
                result = null;
            }
            else
            {
                List <Celda> list = new List <Celda>
                {
                    celda_inicio
                };
                bool flag2 = celdas_no_permitidas.Contains(celda_final);
                if (flag2)
                {
                    celdas_no_permitidas.Remove(celda_final);
                }
                while (list.Count > 0)
                {
                    int index = 0;
                    for (int i = 1; i < list.Count; i++)
                    {
                        bool flag3 = list[i].coste_f < list[index].coste_f;
                        if (flag3)
                        {
                            index = i;
                        }
                        bool flag4 = list[i].coste_f != list[index].coste_f;
                        if (!flag4)
                        {
                            bool flag5 = list[i].coste_g > list[index].coste_g;
                            if (flag5)
                            {
                                index = i;
                            }
                            bool flag6 = list[i].coste_g == list[index].coste_g;
                            if (flag6)
                            {
                                index = i;
                            }
                            bool flag7 = list[i].coste_g == list[index].coste_g;
                            if (flag7)
                            {
                                index = i;
                            }
                        }
                    }
                    Celda celda = list[index];
                    bool  flag8 = detener_delante && this.get_Distancia_Nodos(celda, celda_final) <= (int)distancia_detener && !celda_final.es_Caminable();
                    if (flag8)
                    {
                        return(this.get_Camino_Retroceso(celda_inicio, celda));
                    }
                    bool flag9 = celda == celda_final;
                    if (flag9)
                    {
                        return(this.get_Camino_Retroceso(celda_inicio, celda_final));
                    }
                    list.Remove(celda);
                    celdas_no_permitidas.Add(celda);
                    foreach (Celda celda2 in this.get_Celdas_Adyecentes(celda))
                    {
                        bool flag10 = celdas_no_permitidas.Contains(celda2) || !celda2.es_Caminable();
                        if (!flag10)
                        {
                            bool flag11 = celda2.es_Teleport() && celda2 != celda_final;
                            if (!flag11)
                            {
                                int  num    = celda.coste_g + this.get_Distancia_Nodos(celda2, celda);
                                bool flag12 = !list.Contains(celda2);
                                if (flag12)
                                {
                                    list.Add(celda2);
                                }
                                else
                                {
                                    bool flag13 = num >= celda2.coste_g;
                                    if (flag13)
                                    {
                                        continue;
                                    }
                                }
                                celda2.coste_g    = num;
                                celda2.coste_h    = this.get_Distancia_Nodos(celda2, celda_final);
                                celda2.coste_f    = celda2.coste_g + celda2.coste_h;
                                celda2.nodo_padre = celda;
                            }
                        }
                    }
                }
                result = null;
            }
            return(result);
        }
Ejemplo n.º 2
0
        public List <short> get_Path(Celda celda_inicio, Celda celda_final, List <Celda> celdas_no_permitidas, bool detener_delante)
        {
            List <Celda> celdas_permitidas = new List <Celda>()
            {
                celda_inicio
            };

            while (celdas_permitidas.Count > 0)
            {
                int index = 0;
                for (int i = 1; i < celdas_permitidas.Count; i++)
                {
                    if (celdas_permitidas[i].coste_f < celdas_permitidas[index].coste_f)
                    {
                        index = i;
                    }

                    if (celdas_permitidas[i].coste_f != celdas_permitidas[index].coste_f)
                    {
                        continue;
                    }
                    if (celdas_permitidas[i].coste_g > celdas_permitidas[index].coste_g)
                    {
                        index = i;
                    }

                    if (celdas_permitidas[i].coste_g == celdas_permitidas[index].coste_g)
                    {
                        index = i;
                    }

                    if (celdas_permitidas[i].coste_g == celdas_permitidas[index].coste_g)
                    {
                        index = i;
                    }
                }

                Celda actual = celdas_permitidas[index];

                if (detener_delante && get_Distancia_Nodos(actual, celda_final) == 1 && !celda_final.es_Caminable())
                {
                    return(get_Camino_Retroceso(celda_inicio, actual));
                }

                if (actual == celda_final)
                {
                    return(get_Camino_Retroceso(celda_inicio, celda_final));
                }

                celdas_permitidas.Remove(actual);
                celdas_no_permitidas.Add(actual);

                foreach (Celda celda_siguiente in get_Celdas_Adyecentes(actual))
                {
                    if (celdas_no_permitidas.Contains(celda_siguiente) || !celda_siguiente.es_Caminable())
                    {
                        continue;
                    }

                    if (celda_siguiente.es_Teleport() && celda_siguiente != celda_final)
                    {
                        continue;
                    }

                    int temporal_g = actual.coste_g + get_Distancia_Nodos(celda_siguiente, actual);

                    if (!celdas_permitidas.Contains(celda_siguiente))
                    {
                        celdas_permitidas.Add(celda_siguiente);
                    }
                    else if (temporal_g >= celda_siguiente.coste_g)
                    {
                        continue;
                    }

                    celda_siguiente.coste_g    = temporal_g;
                    celda_siguiente.coste_h    = get_Distancia_Nodos(celda_siguiente, celda_final);
                    celda_siguiente.coste_f    = celda_siguiente.coste_g + celda_siguiente.coste_h;
                    celda_siguiente.nodo_padre = actual;
                }
            }

            return(null);
        }