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); } }
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--; } } }