Skip to content

Instantly share code, notes, and snippets.

Created March 26, 2013 16:43
Show Gist options
  • Save anonymous/5246955 to your computer and use it in GitHub Desktop.
Save anonymous/5246955 to your computer and use it in GitHub Desktop.
Generates longwinded street-like patterns with a few T-junctions and rarely a deadend. Not fixed for unconnected, circular roads. Let's just pretend they're 'gated communities'.
#!/usr/bin/env python
"""
ASCII wang tile generator
written by @paniq (2011/3/26)
Generates longwinded street-like patterns with a few T-junctions and rarely
a deadend. Not fixed for unconnected, circular roads. Let's just pretend they're
'gated communities'.
Example output:
%XX%XX%XX%XX% %XX% %XX%XX% %XX% %XX%XX% %XX% %XX% %
X X X X X X X X X X X X X X X
X X X X X X X X X X X X X X X
%XX%XX% %XX% % % % %XX% % %XX% %XX% % %XX% % %
X X X X X X X X X X X X
X X X X X X X X X X X X
%XX% % % %XX% % % % %XX% %XX% %XX% % %XX%XX% %
X X X X X X X X X X X X X X
X X X X X X X X X X X X X X
% %XX% %XX% %XX% %XX% %XX%XX% %XX% % %XX% %XX%XX%
X X X X X X X X
X X X X X X X X
%XX% %XX% %XX% %XX%XX% %XX%XX%XX% % % %XX% %XX% %
X X X X X X X X X X X X
X X X X X X X X X X X X
%XX% % % %XX%XX% %XX%XX% %XX% %XX% % % %XX% %XX%
X X X X X X X X X X X
X X X X X X X X X X X
% %XX% % %XX% %XX% %XX% %XX% %XX% % %XX% %XX%XX%
X X X X X X X X X X X X
X X X X X X X X X X X X
%XX%XX% %XX% % %XX% % %XX%XX% % %XX% %XX% % %XX%
X X X X X X X X X X
X X X X X X X X X X
%XX%XX% %XX%XX% %XX% %XX% %XX% %XX%XX%XX%XX% %XX% %
X X X X X X X X
X X X X X X X X
%XX%XX%XX% %XX%XX%XX%XX%XX% %XX%XX%XX%XX%XX%XX%XX%XX% %
"""
import random
# map dimension
NX,NY = 20,10
class Tile:
#edge order:
# +X +Y -X -Y
edges = list('****')
pattern = None
@classmethod
def generate(cls, in_edges):
pattern = [' ']*9
walls = set()
edges = ['f']*4
def add_wall(i):
if i in walls:
return
x,w = {
0 : (5,'X'),
1 : (1,'X'),
2 : (3,'X'),
3 : (7,'X'),
}[i]
edges[i] = 'w'
pattern[x] = w
walls.add(i)
choices = set()
for i,e in enumerate(in_edges):
if e == 'w':
add_wall(i)
elif e == '*':
choices.add(i)
rand = random.random()
if rand < 0.05: # 5% chance for T-junction
c = 3
elif rand < 0.01: # 1% change for deadend
c = 1
else:
# simple connection
c = 2
while len(walls) < c and choices:
i = random.choice(list(choices))
choices.discard(i)
add_wall(i)
if walls:
pattern[4] = '%'
tile = cls()
tile.pattern = pattern
tile.edges = edges
return tile
class Map(dict):
def get_tile(self, key):
x,y = key
if x < 0 or x >= NX or y < 0 or y >= NY:
tile = Tile()
tile.edges = list('ffff')
return tile
return self.get(key, None) or Tile()
def get_edges(self, x,y):
return self.get_tile((x,y)).edges
@classmethod
def generate(cls):
map = cls()
for y in range(NY):
for x in range(NX):
map[(x,y)] = Tile.generate([
map.get_edges(x+1,y)[2],
map.get_edges(x,y-1)[3],
map.get_edges(x-1,y)[0],
map.get_edges(x,y+1)[1]
])
return map
def __str__(self):
output = ''
for y in range(NY):
rows = ['','','']
for x in range(NX):
tile = self.get_tile((x,y))
for l in range(3):
rows[l] += ''.join(tile.pattern[l*3:l*3+3])
output += '\n'.join(rows) + '\n'
return output
if __name__ == '__main__':
print(Map.generate())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment