115 lines
3.1 KiB
Python
115 lines
3.1 KiB
Python
import sys
|
|
import functools
|
|
import random
|
|
from noise import pnoise2
|
|
from termcolor import colored
|
|
|
|
def addition(a, b):
|
|
return a + b
|
|
|
|
seed = 0
|
|
seed_codes = sys.argv[1].encode("utf-8")
|
|
if seed_codes:
|
|
seed = functools.reduce(addition, seed_codes)
|
|
|
|
scale = 25.0
|
|
world_w, world_h = 16, 16
|
|
|
|
water_deepest = -0.3
|
|
water_deep = -0.2
|
|
water = -0.1
|
|
grass = 0.3
|
|
grass_high = 0.6
|
|
mountains = 1
|
|
block = "█"
|
|
block = block + block
|
|
|
|
def generate_world(seed):
|
|
try:
|
|
print("Seed: " + str(seed))
|
|
random.seed(seed)
|
|
world = []
|
|
for y in range(1, world_h + 1):
|
|
row = []
|
|
for x in range(1, world_w + 1):
|
|
row_noise = pnoise2(
|
|
x / scale,
|
|
y / scale,
|
|
octaves=10,
|
|
persistence=0.5,
|
|
lacunarity=2.0,
|
|
base=seed
|
|
)
|
|
row.append(row_noise)
|
|
world.append(row)
|
|
return world
|
|
except Exception as e:
|
|
print(e)
|
|
|
|
def add_home(world):
|
|
print("Choosing home location")
|
|
home = (0, 0)
|
|
|
|
# build only on "grass"
|
|
valid_locations = []
|
|
for y in range(world_h):
|
|
if y > 0 and y < world_h - 1:
|
|
for x in range(world_w):
|
|
if x > 0 and x < world_w - 1:
|
|
cell = world[y][x]
|
|
if cell > water and cell <= grass:
|
|
valid_locations.append((x, y))
|
|
|
|
location = random.randrange(len(valid_locations))
|
|
home = valid_locations[location]
|
|
print(home)
|
|
return home
|
|
|
|
def add_dock(world, home):
|
|
print("Adding a dock")
|
|
# find the closest bit of water to the house?
|
|
# find the biggest body of water
|
|
|
|
|
|
def percentage_of_land(world):
|
|
total = world_w * world_h
|
|
above_land = 0
|
|
for y in range(world_h):
|
|
for x in range(world_w):
|
|
cell = world[y][x]
|
|
if cell > water:
|
|
above_land = above_land + 1
|
|
return above_land / total
|
|
|
|
def print_map(world, home):
|
|
for y in range(world_h):
|
|
for x in range(world_w):
|
|
cell = world[y][x]
|
|
if home[0] == x and home[1] == y:
|
|
print(colored(block, "magenta"), end="", flush=True)
|
|
elif cell <= water_deepest:
|
|
print(colored(block, "grey"), end="", flush=True)
|
|
elif cell <= water_deep:
|
|
print(colored(block, "blue", attrs=["dark"]), end="", flush=True)
|
|
elif cell <= water:
|
|
print(colored(block, "blue"), end="", flush=True)
|
|
elif cell <= grass:
|
|
print(colored(block, "green"), end="", flush=True)
|
|
elif cell <= grass_high:
|
|
print(colored(block, "green", attrs=["dark"]), end="", flush=True)
|
|
else:
|
|
print(colored(block, "white"), end="", flush=True)
|
|
print("")
|
|
|
|
world = generate_world(seed)
|
|
i = 1
|
|
while (percentage_of_land(world) < 0.25 or 1 - percentage_of_land(world) < 0.25):
|
|
world = generate_world(seed + i)
|
|
i = i + 1
|
|
|
|
print(str(i - 1) + " seed iterations")
|
|
|
|
home = add_home(world)
|
|
dock = add_dock(world, home)
|
|
print_map(world, home)
|