示例#1
0
    private void GenerateMap()
    {
        TileBase[] tileBases = new TileBase[size * size];
        labGrid = new LabGrid(size, size, 1f);
        //int row = 0;
        //for (int i = 0; i < tileBases.Length; i++)
        //{
        //    if (i < size || i == size * (row - 1) || i == size * row - 1 || i > size * size - size)
        //    {
        //        tileBases[i] = wallTile;
        //        labGrid.grid[i / size, i - size * row] = 1;
        //    }
        //    else if (i == size * 2 - 2)
        //        tileBases[i] = finishTile;
        //    else if (i == size * size - size * 2 + 1)
        //        tileBases[i] = characterTile;
        //    else
        //        tileBases[i] = pathTile;
        //    if (i == size * row) row++;
        //}

        tileMap.size   = new Vector3Int(size, size, 1);
        tileMap.origin = new Vector3Int(0, 0, 0);
        tileMap.ResizeBounds();
        BoundsInt bounds = tileMap.cellBounds;

        for (int x = 0; x < bounds.size.x; x++)
        {
            for (int y = 0; y < bounds.size.y; y++)
            {
                if (x == 0 || y == 0 || x == size - 1 || y == size - 1)
                {
                    tileBases[x + y * bounds.size.x] = wallTile;
                    labGrid.grid[x, y] = 1;
                }
                else if (x == size - 2 && y == 1)
                {
                    tileBases[x + y * bounds.size.x] = finishTile;
                    labGrid.grid[x, y] = 2;
                }
                else if (x == 1 && y == size - 2)
                {
                    tileBases[x + y * bounds.size.x] = characterTile;
                }
                else
                {
                    tileBases[x + y * bounds.size.x] = pathTile;
                }
            }
        }


        tileMap.SetTilesBlock(tileMap.cellBounds, tileBases);
        DeleteTileMapFlags();
        Camera.main.transform.position = new Vector3(tileMap.size.x / 2, tileMap.size.y / 2, -10);
        Camera.main.orthographicSize   = tileMap.size.x / 2 + tileMap.size.x / 4;
    }
示例#2
0
    public static bool FindPath(LabGrid labGrid, Vector2Int start, Vector2Int finish)
    {
        int[,] grid = labGrid.grid;
        MinHeap nodes     = new MinHeap();
        Node    startNode = new Node(null, start.x, start.y);

        Evaluate(startNode, finish);
        nodes.Insert(startNode);

        int[,] visited = new int[labGrid.width, labGrid.height];
        visited[startNode.x, startNode.y] = 1;

        bool found = false;
        Node node  = new Node();

        while (nodes.list.Count > 0 && !found)
        {
            node = nodes.PullMin();
            if (node.x == finish.x && node.y == finish.y)
            {
                found = true;
                break;
            }
            List <Node> neighbours = new List <Node>();
            PopulateNeighbours(node, neighbours);

            foreach (Node item in neighbours)
            {
                if (item.x >= 0 && item.y >= 0 && item.x < labGrid.width && item.y < labGrid.height && (grid[item.x, item.y] == 0 || grid[item.x, item.y] == 2))
                {
                    if (visited[item.x, item.y] == 0)
                    {
                        Evaluate(item, finish);
                        GiveWeight(item);
                        nodes.Insert(item);
                        visited[item.x, item.y] = 1;
                    }
                }
            }
        }
        if (found)
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }