Пример #1
0
    public static void Build(int w, int h, int pathSize = 2, int walkerCount = 5, int steps = 60, int minBeforeTurn = 2, int maxBeforeTurn = 5)
    {
        var param = new WalkParam(MapBuilder.MapMaxWidth / 2, MapBuilder.MapMaxHeight / 2, w, h);

        for (int i = 0; i < walkerCount; ++i)
        {
            param.steps         = steps;
            param.pathSize      = pathSize;
            param.minBeforeTurn = minBeforeTurn;
            param.maxBeforeTurn = maxBeforeTurn;
            DoWalk(param, MapBuilder.MapSource);
        }
    }
Пример #2
0
    static void DoWalk(WalkParam param, byte[,] map)
    {
        while (param.steps > 0)
        {
            (int dirX, int dirY) = GetDirection();
            int len = Random.Range(param.minBeforeTurn, param.maxBeforeTurn);
            for (int i = 0; i < len; ++i)
            {
                map[param.x + 0, param.y + 0] = 1;
                if (param.pathSize > 1)
                {
                    map[param.x + 1, param.y + 0] = 1;
                    map[param.x + 0, param.y + 1] = 1;
                    map[param.x + 1, param.y + 1] = 1;
                }
                if (param.pathSize > 2)
                {
                    map[param.x + 2, param.y + 0] = 1;
                    map[param.x + 2, param.y + 1] = 1;
                    map[param.x + 2, param.y + 2] = 1;
                    map[param.x + 1, param.y + 2] = 1;
                    map[param.x + 0, param.y + 2] = 1;
                }

                if (param.x > param.xMin && param.x < param.xMax - 2)
                {
                    param.x += dirX;
                }
                else
                {
                    dirX = -dirX;
                }

                if (param.y > param.yMin && param.y < param.yMax - 2)
                {
                    param.y += dirY;
                }
                else
                {
                    dirY = -dirY;
                }

                param.steps--;
            }
        }
    }