Created
March 26, 2013 16:43
-
-
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'.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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