Browse Source

Initial commit

master
Noëlle Anthony 7 years ago
commit
ee0aefdfda
2 changed files with 79 additions and 0 deletions
  1. 5
    0
      README.md
  2. 74
    0
      procgen.py

+ 5
- 0
README.md View File

@@ -0,0 +1,5 @@
# Simple procedural generation of "dungeon maps"

Basic proof of concept. No real refinement at this point.

Initial work based on [this tutorial](https://gamedevelopment.tutsplus.com/tutorials/generate-random-cave-levels-using-cellular-automata--gamedev-9664).

+ 74
- 0
procgen.py View File

@@ -0,0 +1,74 @@
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()

Loading…
Cancel
Save