I'm just playing with Python, trying to refamiliarize myself with it since I haven't used it in a few years. I'm using Python3, but as far as I know it could easily be Python2 with a change to the print statements. What I'm generating is something similar to GitHub's Identicons.
I know of two possible issues, one is that I don't account for an odd width, and the other is that my fill string will be reversed on the symmetric half, so I can't use something like
import random def generateConnectedAvatar(fill="XX", empty=" ", height=10, width=10, fillpercent=0.4): halfwidth = int(width/2) painted = 0 maxPainted = height*halfwidth*fillpercent adjacent = [(-1,-1), (-1,0), (-1,1), (0,1), (0,-1), (1,-1), (1,0), (1,1)] # initialize a blank avatar avatar = [[empty for w in range(halfwidth)] for h in range(height)] # 'paint' a single cell and add it to the stack y, x = random.randint(0,height-1), random.randint(0,halfwidth-1) lst = [(y,x)] while (len(lst) != 0): # Take the first element off the list y, x = lst.pop() # Determine if we should paint it if painted <= maxPainted: avatar[y][x] = fill painted += 1 # Find all available neighbors and add them to the list (in a random order) # shuffle our adjacent positions table random.shuffle(adjacent) for posy, posx in adjacent: tmpy, tmpx = y + posy, x + posx if tmpx >= 0 and tmpx < halfwidth: if tmpy >= 0 and tmpy < height: # Make sure we haven't already painted it if avatar[tmpy][tmpx] is not fill: lst.append((tmpy,tmpx)) # output the result (symmetrically) # (in our case, just printing to console) for h in range(height): half = "" for w in range(halfwidth): half += avatar[h][w] print(half + half[::-1])
The output can be pretty neat looking sometimes, but it's frequently very blocky, so I'll probably want to figure out some sort of spacing algorithm.
Some sample output:
XX XX XXXXXX XXXXXX XXXX XXXX XXXX XXXX XX XX XX XX XXXX XX XX XXXX XXXXXX XXXXXX XXXX XXXX XXXX XXXX XXXX