コード例 #1
0
ファイル: Polar.cs プロジェクト: majikat768/maze2d
    void Start()
    {
        rand = new System.Random();
        //Camera.main.orthographicSize = maxRad+2;
        dRad   = (float)maxRad / H;
        dTheta = 2 * Mathf.PI / W;
        cells  = new List <PolarCell>();

        grid = new PolarCell[W, H];
        for (int i = 0; i < W; i++)
        {
            for (int j = 0; j < H; j++)
            {
                grid[i, j] = new PolarCell(i, j);
                cells.Add(grid[i, j]);
            }
        }
        BuildMaze(grid[UnityEngine.Random.Range(0, W - 1), UnityEngine.Random.Range(0, H - 1)]);
        for (int i = 0; i < W; i++)
        {
            grid[i, 0].Walls['S'] = false;
        }
        foreach (PolarCell c in grid)
        {
            DrawCell(c);
        }
    }
コード例 #2
0
ファイル: Polar.cs プロジェクト: majikat768/maze2d
    void DrawCell(PolarCell c)
    {
        float      r     = c.r;
        float      theta = c.theta;
        GameObject cell  = new GameObject(c.x.ToString() + "," + c.y.ToString() + "(n:" + c.Walls['N'].ToString() + ",s:" + c.Walls['S'].ToString() + ",e:" + c.Walls['E'].ToString() + ",w:" + c.Walls['W'].ToString() + ")");

        GameObject n, s, e, w;
        float      eWallTheta = theta - dTheta / 2;
        float      wWallTheta = theta + dTheta / 2;
        float      sWallRad   = r - dRad / 2;
        float      nWallRad   = r + dRad / 2;

        Vector2 s1       = new Vector2(sWallRad * Mathf.Cos(eWallTheta), sWallRad * Mathf.Sin(eWallTheta));
        Vector2 s2       = new Vector2(sWallRad * Mathf.Cos(wWallTheta), sWallRad * Mathf.Sin(wWallTheta));
        Vector2 n1       = new Vector2(nWallRad * Mathf.Cos(eWallTheta), nWallRad * Mathf.Sin(eWallTheta));
        Vector2 n2       = new Vector2(nWallRad * Mathf.Cos(wWallTheta), nWallRad * Mathf.Sin(wWallTheta));
        float   sWallLen = dist(s1, s2);
        float   nWallLen = dist(n1, n2);

        if (c.Walls['E'])
        {
            e = GameObject.Instantiate(wall, new Vector3(r * Mathf.Cos(eWallTheta), r * Mathf.Sin(eWallTheta), 0), Quaternion.Euler(0, 0, (eWallTheta) * Mathf.Rad2Deg), cell.transform);
            e.transform.localScale = new Vector3(dRad, 1, 1);
            e.name = "e";
        }

        if (c.Walls['W'])
        {
            w = GameObject.Instantiate(wall, new Vector3(r * Mathf.Cos(wWallTheta), r * Mathf.Sin(wWallTheta), 0), Quaternion.Euler(0, 0, (wWallTheta) * Mathf.Rad2Deg), cell.transform);
            w.transform.localScale = new Vector3(dRad, 1, 1);
            w.name = "w";
        }


        if (c.Walls['S'])
        {
            s = new GameObject("s");
            s.transform.parent = cell.transform;
            for (float i = eWallTheta; i <= wWallTheta; i += 0.01f)
            {
                GameObject.Instantiate(pix, new Vector3(sWallRad * Mathf.Cos(i), sWallRad * Mathf.Sin(i), 0), Quaternion.identity, s.transform);
            }
        }

        if (c.Walls['N'])
        {
            n = new GameObject("n");
            n.transform.parent = cell.transform;
            for (float i = eWallTheta; i <= wWallTheta; i += 0.01f)
            {
                GameObject.Instantiate(pix, new Vector3(nWallRad * Mathf.Cos(i), nWallRad * Mathf.Sin(i), 0), Quaternion.identity, n.transform);
            }
        }
    }
コード例 #3
0
 public void init(int W, int H)
 {
     this.W = W;
     this.H = H;
     grid   = new PolarCell[W, H];
     for (int i = 0; i < W; i++)
     {
         for (int j = 0; j < H; j++)
         {
             grid[i, j] = new PolarCell(i, j);
         }
     }
 }
コード例 #4
0
ファイル: Polar.cs プロジェクト: majikat768/maze2d
    void BuildMaze(PolarCell c)
    {
        c.Visit();
        int x = c.x;
        int y = c.y;
        int x2;

        while (UnvisitedNeighbors(x, y) > 0)
        {
            foreach (int dir in Enumerable.Range(0, 4).OrderBy(a => rand.Next()))
            {
                switch (dir)
                {
                case 0:     // north
                    if (y < H - 1 && grid[x, y + 1].visited < maxVisits)
                    {
                        grid[x, y].neighbors.Add(grid[x, y + 1]);
                        grid[x, y + 1].neighbors.Add(grid[x, y]);
                        grid[x, y].Walls['N']     = false;
                        grid[x, y + 1].Walls['S'] = false;
                        BuildMaze(grid[x, y + 1]);
                    }
                    break;

                case 1:     // south
                    if (y > 0 && grid[x, y - 1].visited < maxVisits)
                    {
                        grid[x, y].neighbors.Add(grid[x, y - 1]);
                        grid[x, y - 1].neighbors.Add(grid[x, y]);
                        grid[x, y].Walls['S']     = false;
                        grid[x, y - 1].Walls['N'] = false;
                        BuildMaze(grid[x, y - 1]);
                    }
                    break;

                case 2:     // east
                    if (x < W - 1)
                    {
                        x2 = x + 1;
                    }
                    else
                    {
                        x2 = 0;
                    }
                    if (grid[x2, y].visited < maxVisits)
                    {
                        grid[x, y].neighbors.Add(grid[x2, y]);
                        grid[x2, y].neighbors.Add(grid[x, y]);
                        grid[x, y].Walls['W']  = false;
                        grid[x2, y].Walls['E'] = false;
                        BuildMaze(grid[x2, y]);
                    }
                    break;

                case 3:     // west
                    if (x > 0)
                    {
                        x2 = x - 1;
                    }
                    else
                    {
                        x2 = W - 1;
                    }
                    if (grid[x2, y].visited < maxVisits)
                    {
                        grid[x, y].neighbors.Add(grid[x2, y]);
                        grid[x2, y].neighbors.Add(grid[x, y]);
                        grid[x, y].Walls['E']  = false;
                        grid[x2, y].Walls['W'] = false;
                        BuildMaze(grid[x2, y]);
                    }
                    break;

                default:
                    break;
                }
            }
        }
    }