|
|
|
|
|
|
|
|
|
|
|
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() |