Added base files for map generation and main loop for random walk generation
This commit is contained in:
		
							
								
								
									
										0
									
								
								dungeonbattle/mapgeneration/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								dungeonbattle/mapgeneration/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										44
									
								
								dungeonbattle/mapgeneration/randomwalk.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								dungeonbattle/mapgeneration/randomwalk.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
from random import choice, random, randint
 | 
			
		||||
from dungeonbattle.interfaces import Map, Tile
 | 
			
		||||
 | 
			
		||||
 class Generator:
 | 
			
		||||
 | 
			
		||||
    def __init__(self, params):
 | 
			
		||||
        self.params = params
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        width, height = self.params["width"], self.params["height"]
 | 
			
		||||
        walkers = [Walker(width//2, height//2)]
 | 
			
		||||
        grid = [[Tile.WALL] * width] * height
 | 
			
		||||
        count = 0
 | 
			
		||||
        while count < self.params["fill"] * width*height:
 | 
			
		||||
            # because we can't add or remove walkers while looping over the pop
 | 
			
		||||
            # we need lists to keep track of what will be the walkers for the
 | 
			
		||||
            # next iteration of the main loop
 | 
			
		||||
            next_walker_pop = []
 | 
			
		||||
 | 
			
		||||
            for walker in walkers:
 | 
			
		||||
                if grid[walker.y][walker.x] == Tile.WALL:
 | 
			
		||||
                    count += 1
 | 
			
		||||
                    grid[walker.y][walker.x] = Tile.EMPTY
 | 
			
		||||
                if random() < self.params["turn_chance"]:
 | 
			
		||||
                    walker.random_turn()
 | 
			
		||||
                walker.move_in_bounds(width, height)
 | 
			
		||||
                if random() > self.params["death_chance"]:
 | 
			
		||||
                    next_walker_pop.append(walker)
 | 
			
		||||
 | 
			
		||||
            # we use a second loop for spliting so we're not bothered by cases 
 | 
			
		||||
            # like a walker not spliting because we hit the population cap even
 | 
			
		||||
            # though the next one would have died and freed a place
 | 
			
		||||
            # not a big if it happened though
 | 
			
		||||
            for walker in walkers:
 | 
			
		||||
                if len(next_walker_pop) < self.params["max_walkers"]:
 | 
			
		||||
                    if random() < self.params["split_chance"]:
 | 
			
		||||
                        next_walker_pop.append(walker.split())
 | 
			
		||||
            walkers = next_walker_pop
 | 
			
		||||
 | 
			
		||||
        start_x, start_y = randint(0, width), randint(0, height)
 | 
			
		||||
        while grid[start_y][start_x] != Tile.EMPTY:
 | 
			
		||||
            start_x, start_y = randint(0, width), randint(0, height)
 | 
			
		||||
 | 
			
		||||
        return Map(width, height, grid, start_x, start_y)
 | 
			
		||||
		Reference in New Issue
	
	Block a user