예제 #1
0
    public void Setup(Grilla <CasillaNodo> grid)
    {
        visualNodeArray = new Transform[grid.GetWidth(), grid.GetHeight()];

        for (int x = 0; x < grid.GetWidth(); x++)
        {
            for (int y = 0; y < grid.GetHeight(); y++)
            {
                Vector3   gridPosition = new Vector3(x, y) * grid.GetCellSize() + Vector3.one * grid.GetCellSize() * .5f;
                Transform visualNode   = CreateVisualNode(gridPosition);
                visualNodeArray[x, y] = visualNode;
                visualNodeList.Add(visualNode);
            }
        }
        HideNodeVisuals();
    }
예제 #2
0
파일: juego.cs 프로젝트: crDTbD/wumpus
    public List <CasillaNodo> EncontrarVecindad(CasillaNodo nodoactual) //retorna la vecindad de la casilla nodoactual
    {
        List <CasillaNodo> ListaDeVecinos = new List <CasillaNodo>();

        // Arriba
        if (nodoactual.y + 1 < grilla.GetHeight())
        {
            ListaDeVecinos.Add(GetNodo(nodoactual.x, nodoactual.y + 1));                                        // si no se sale abajo añada el nodo de abajo a ListaDeVecinos
        }
        //Derecha
        if (nodoactual.x + 1 < grilla.GetWidth())
        {
            ListaDeVecinos.Add(GetNodo(nodoactual.x + 1, nodoactual.y));                                       // si no se sale a la derecha añada el nodo de la derecha a ListaDeVecinos
        }
        // Abajo
        if (nodoactual.y - 1 >= 0)
        {
            ListaDeVecinos.Add(GetNodo(nodoactual.x, nodoactual.y - 1));                        // si no se sale a la arriba añada el nodo de arriba a ListaDeVecinos
        }
        //Izquierda
        if (nodoactual.x - 1 >= 0)
        {
            ListaDeVecinos.Add(GetNodo(nodoactual.x - 1, nodoactual.y));                        // si no se sale a la izquierda añada el nodo de la izquierda a ListaDeVecinos
        }
        return(ListaDeVecinos);
    }
예제 #3
0
    public void TakeSnapshot(Grilla <Nodo> grid, Nodo current, List <Nodo> openList, List <Nodo> closedList)
    {
        GridSnapshotAction gridSnapshotAction = new GridSnapshotAction();

        gridSnapshotAction.AddAction(HideNodeVisuals);

        for (int x = 0; x < grid.GetWidth(); x++)
        {
            for (int y = 0; y < grid.GetHeight(); y++)
            {
                Nodo Nodo = grid.GetGridObject(x, y);

                int     CostoG         = Nodo.CostoG;
                int     CostoH         = Nodo.CostoH;
                int     CostoF         = Nodo.CostoF;
                Vector3 gridPosition   = new Vector3(Nodo.x, Nodo.y) * grid.GetCellSize() + Vector3.one * grid.GetCellSize() * .5f;
                bool    isCurrent      = Nodo == current;
                bool    isInOpenList   = openList.Contains(Nodo);
                bool    isInClosedList = closedList.Contains(Nodo);
                int     tmpX           = x;
                int     tmpY           = y;

                gridSnapshotAction.AddAction(() => {
                    Transform visualNode = visualNodeArray[tmpX, tmpY];
                    SetupVisualNode(visualNode, CostoG, CostoH, CostoF);

                    Color backgroundColor = UtilsClass.GetColorFromString("636363");

                    if (isInClosedList)
                    {
                        backgroundColor = new Color(1, 0, 0);
                    }
                    if (isInOpenList)
                    {
                        backgroundColor = UtilsClass.GetColorFromString("009AFF");
                    }
                    if (isCurrent)
                    {
                        backgroundColor = new Color(0, 1, 0);
                    }

                    visualNode.Find("sprite").GetComponent <SpriteRenderer>().color = backgroundColor;
                });
            }
        }

        gridSnapshotActionList.Add(gridSnapshotAction);
    }
예제 #4
0
    public void TakeSnapshotFinalPath(Grilla <CasillaNodo> grid, List <CasillaNodo> path)
    {
        GridSnapshotAction gridSnapshotAction = new GridSnapshotAction();

        gridSnapshotAction.AddAction(HideNodeVisuals);

        for (int x = 0; x < grid.GetWidth(); x++)
        {
            for (int y = 0; y < grid.GetHeight(); y++)
            {
                CasillaNodo CasillaNodo = grid.GetGridObject(x, y);


                Vector3 gridPosition = new Vector3(CasillaNodo.x, CasillaNodo.y) * grid.GetCellSize() + Vector3.one * grid.GetCellSize() * .5f;
                bool    isInPath     = path.Contains(CasillaNodo);
                int     tmpX         = x;
                int     tmpY         = y;

                gridSnapshotAction.AddAction(() => {
                    Transform visualNode = visualNodeArray[tmpX, tmpY];


                    Color backgroundColor;

                    if (isInPath)
                    {
                        backgroundColor = new Color(0, 1, 0);
                    }
                    else
                    {
                        backgroundColor = UtilsClass.GetColorFromString("636363");
                    }

                    visualNode.Find("sprite").GetComponent <SpriteRenderer>().color = backgroundColor;
                });
            }
        }

        gridSnapshotActionList.Add(gridSnapshotAction);
    }
예제 #5
0
 private void UpdateVisual()
 {
     MeshUtils.CreateEmptyMeshArrays(grid.GetWidth() * grid.GetHeight(), out Vector3[] vertices, out Vector2[] uv, out int[] triangles);
예제 #6
0
    public List <Nodo> EncontrarCamino(int startX, int startY, int endX, int endY, int type)
    {
        Nodo StartNode = grilla.GetGridObject(startX, startY);
        Nodo endNode   = grilla.GetGridObject(endX, endY);

        CaminosPosibles = new List <Nodo> {
            StartNode
        };
        CaminosVisitados = new List <Nodo>();
        for (int x = 0; x < grilla.GetWidth(); x++)
        {
            for (int y = 0; y < grilla.GetHeight(); y++)
            {
                Nodo nodo = grilla.GetGridObject(x, y);
                nodo.CostoG = int.MaxValue;
                nodo.CalcularCostoF();
                nodo.Padre = null;
            }
        }
        StartNode.CostoG = 0;
        StartNode.CostoH = CalcularDistanciaEntre(StartNode, endNode);
        StartNode.CalcularCostoF();

        PathfindingDebugStepVisual.Instance.ClearSnapshots();
        PathfindingDebugStepVisual.Instance.TakeSnapshot(grilla, StartNode, CaminosPosibles, CaminosVisitados);

        while (CaminosPosibles.Count > 0)
        {
            Nodo NodoActual = EncontrarValorMenor(CaminosPosibles, type);
            if (NodoActual == endNode)
            {
                PathfindingDebugStepVisual.Instance.TakeSnapshot(grilla, StartNode, CaminosPosibles, CaminosVisitados);
                PathfindingDebugStepVisual.Instance.TakeSnapshotFinalPath(grilla, CaminoCalculado(endNode));
                return(CaminoCalculado(endNode));
            }
            CaminosPosibles.Remove(NodoActual);
            CaminosVisitados.Add(NodoActual);

            foreach (Nodo nodoVecino in ValorarVecindad(NodoActual))
            {
                if (CaminosVisitados.Contains(nodoVecino))
                {
                    continue;
                }
                if (!nodoVecino.casillaValida)
                {
                    CaminosVisitados.Add(nodoVecino);
                    continue;
                }
                int CostoGIdeal = NodoActual.CostoG + CalcularDistanciaEntre(NodoActual, nodoVecino);
                if (CostoGIdeal < nodoVecino.CostoG)
                {
                    nodoVecino.Padre  = NodoActual;
                    nodoVecino.CostoG = CostoGIdeal;
                    nodoVecino.CostoH = CalcularDistanciaEntre(nodoVecino, endNode);
                    nodoVecino.CalcularCostoF();
                    if (!CaminosPosibles.Contains(nodoVecino))
                    {
                        CaminosPosibles.Add(nodoVecino);
                    }
                }
                PathfindingDebugStepVisual.Instance.TakeSnapshot(grilla, StartNode, CaminosPosibles, CaminosVisitados);
            }
        }

        //una vez se acaben los caminos posibles y no hay solucion
        return(null);
    }