Making some generative ASCII-art. | | | | | | o-O-o o-O--o|O---o--O-||| |o--O-o | | | | | || | -O-| | o---O| | | | ||| | |||-O| | | | | | | || o--- | | | || | | |-O-o| | ||| |--O------o o--O-| || | | | | |o-O----| | |o------O--o| | | o----O---o |O | |---O---o | || | | |-O--o | |o-O---o | | | || | | | |---OO--o| | | o----O----o-O-| | | | o----O------o| | ---o | | | |O-| | | | | | | | | | || | | |o-O--- o-O---o | o-O---o--O-| | | | o-O-| | | ||O--o o-O| | | | | | | |-O--| | | | | o-O--o | |O--o-----O-----o|---------O--o -| |---O-o-O-o | | | | o---O--o | | |O--o| | | o--O-----o | |o-O--- The Source Jump head if it seems to you like some kind of foreign poetry. Or you can try to read it anyway. #!/usr/bin/env python3 from random import choice import sys w = 80 h = 40 if len(sys.argv) > 1: depth = int(sys.argv[1]) else: depth = 100 modular = True x0 = w // 2 y0 = h // 2 start = "o" # { node: { direction: [successor nodes]}} rules = { "|": { "n": ["|", "|", "O"], "s": ["|", "|", "O"], }, "O": { "w": ["-"], "e": ["-"], }, "-": { "w": ["-", "-", "o"], "e": ["-", "-", "o"], }, "o": { "n": ["|"], "s": ["|"], }, } def display(world): "Show the world" print("\n".join("".join(row) for row in world)) def put(world, node, x, y): "Position a node" if modular: x %= w y %= h world = world.copy() if x in range(w) and y in range(h): world[y][x] = node return world def move(x, y, d): "Change x and y according to direction d" if d == "n": y -= 1 elif d == "s": y += 1 elif d == "e": x += 1 elif d == "w": x -= 1 elif d == "ne": x += 1 y -= 1 elif d == "nw": x -= 1 y -= 1 elif d == "se": x += 1 y += 1 elif d == "sw": x -= 1 y += 1 return x, y def possible_directions(node): "Given a node return possible directions" return list(rules[node].keys()) def possible_successors(node, d): "Given a node and a direction return possible successors" return rules[node][d] def is_empty(world, x, y): "Is a cell empty?" if modular: x %= w y %= h if x in range(w) and y in range(h): return world[y][x] == " " else: return False def is_valid_direction(world, d, x, y): "Is the given direction valid?" return is_empty(world, *move(x, y, d)) def grow(world, node, x, y, depth): "Grow a node" if depth: directions = possible_directions(node) # Filter valid directions directions = [d for d in directions if is_valid_direction(world, d, x, y)] if directions: for d in directions: if is_valid_direction(world, d, x, y): new_x, new_y = move(x, y, d) new_node = choice(possible_successors(node, d)) world = put(world, new_node, new_x, new_y) world = grow(world, new_node, new_x, new_y, depth-1) return world def main(): "Main function" world = [[" "] * w for i in range(h)] world = put(world, start, x0, y0) world = grow(world, start, x0, y0, depth) display(world) if __name__ == "__main__": main() Outputs With depth = 200: --o-O| || | | |O-o| | | | | o-O----|| | | | |-O-o|-O-o o-O-o--O- |--O--o | | | || | | | | | | || | | | o-O-|| | ||| | | | | | | o--O| o-O--o-O-| | |o-O------o | | |o---O-----o| | | | | | | | | o------O| | | o---O--o | | o-O| | |o-O--| -----O--| o----O---|-O-o | |O-----o | | | |-------O--oO----|| | o- || || | || | | | | | | | -O- | | |-O-o | || o--O--o | || |o-O--o-O-o---O-o | | | | | | -O- | | |-O-|--Oo--O--o | | |o-O-|| | | | | | | | | o------O---o | o-O-o | | | | | | | | o| | || o--O-o-O-o | | | | | | | | | | | | | | |O-o--O-O---- || | |O-| || | | |-O-- | | | o---O----o || | | | | || | | || | | | || o-O---| | | | | o | | | || |-O-o o---O| | | O--o | | ||----O--| o--------O-o | | | | | || | | | o-O| | o---- | |--O---o| |--O--o | O | | | | | | ||O-| | | | || | | | | o----O--| | | o-O| | | | | o---O----o|||-----O---oo------O-o | -O-| | | | | o---O-| | || | o-O--o | | |||O----o || ---O-o | |-O-o | | |O--| |-O--oo---O-------|-O--- | ||o--O--|----O| | | -o | | | | | || | | | || o-O----| | | ||| | | | | o-O |-O-o | | | || o-O-o -O- | | |-O-o--O-o--O||| |--O-o | | | --O-o| |O-|--O-----o-O| ||| | | | | | | | | || o--O-|-O----O--- | o | || || | | || ||O---o--O-| | o---O--o-O--o o-O-| || | | | o-O-| And 20: | -O-| | | | o--O--o | | | | | | | | | | | o--O-o-O--o | | | | | o------O--|-O-o o--O| | || -O- | o| | | | || | | | || o-O---- | | || | | o----------O---------o | | | | o-O---o | --O-- | | | | O | |