import random as r def createDungeon(x=None, y=None, seed=None): """ Initializes an x by y grid. x is width, y is height seed is the chance that a given cell will be "live" and should be an integer between 1-99. If True is equivalent to "walkable", then lower seeds make more walls. """ x = 10 if x == None else int(x) y = 10 if y == None else int(y) seed = 45 if seed == None else int(seed) new_map = [] for j in range(y): new_row = [] for i in range(x): new_row.append(False if r.randint(1,99) > seed else True) new_map.append(new_row) return new_map def refineDungeon(d_map, d_lmt=None, a_lmt=None): """ Refines the grid. """ d_lmt = 3 if d_lmt == None else int(d_lmt) a_lmt = 4 if a_lmt == None else int(a_lmt) new_map = [] for j in range(len(d_map)): new_line = [] for i in range(len(d_map[j])): x, y = i, j n_count = countAliveNeighbors(d_map, x, y) if d_map[y][x]: if n_count <= d_lmt: new_line.append(False) else: new_line.append(True) else: if n_count >= a_lmt: new_line.append(True) else: new_line.append(False) new_map.append(new_line) return new_map def countAliveNeighbors(d_map, x, y): count = 0 for j in range(-1,2): for i in range(-1,2): n_x, n_y = x+i, y+j if i == 0 and j == 0: continue if n_x < 0 or n_x >= len(d_map[j]) or n_y == 0 or n_y >= len(d_map): count += 1 elif d_map[n_y][n_x]: count += 1 return count def printDungeon(d_map, wall=None, path=None): wall = "II" if wall == None else wall path = " " if path == None else path for line in d_map: print("".join([wall if x == True else path for x in line])) print() def main(): my_map = createDungeon(20,20) printDungeon(my_map) my_map = refineDungeon(my_map, 4, 4) printDungeon(my_map) my_map = refineDungeon(my_map, 4, 4) printDungeon(my_map) if __name__ == "__main__": main()