Exemple #1
0
    def prepare(self):
        self.load_data()

        self.menu.set_base(self)
        self.room.set_base(self)

        self.maze = Maze(8, 8)
Exemple #2
0
    class Generator:
        def __init__(self, n):
            self.n = n
            self.maze = Maze(n)
            self.random = Random()

        def generate(self):
            stack = deque([Vertex(0, 0)])
            visited = set()

            def dive(vtx):
                visited.add(vtx)
                next_candidates = [n for n in self._get_neighbours(vtx) if n not in visited]
                if not next_candidates:
                    return
                nxt = self.random.choice(next_candidates)
                self.maze.add_edge(Edge(vtx, nxt))
                stack.append(nxt)
                dive(nxt)

            while stack:
                dive(stack.pop())

            return self.maze

        def _get_neighbours(self, vtx: Vertex):
            adj = []
            for delta in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
                adj.append(Vertex(vtx.x + delta[0], vtx.y + delta[1]))
                if not self.maze.contains(adj[-1]):
                    del adj[-1]
            return adj
Exemple #3
0
    class MazeGenerator:
        def __init__(self, n, thresh=0.4):
            self.n = n
            self.thresh = thresh
            self.maze = Maze(n)
            self.random = Random()

        def generate(self):
            prev = Eller.PrevRowSummary()
            for i in range(self.n):
                prev = Eller.RowGenerator(self, i, prev).generate()

            self.finalize(prev)

            return self.maze

        def finalize(self, last_row_summary):
            """satisfying last row post-conditions: no isolated regions should be left"""
            row = last_row_summary
            for j in range(1, len(row.vertices)):
                le, ri = row.vertices[j - 1], row.vertices[j]
                if not row.uf.connected(le, ri):
                    row.uf.connect(le, ri)
                    self.maze.add_edge(Edge(le, ri))

        def will_connect(self):
            return self.random.random() > self.thresh
Exemple #4
0
    def render(maze: Maze, solution: Solution = None, filename=None):
        lw = ImageMazeRenderer.line_width
        dlw = 2 * lw

        def convert(maze_coord):
            return dlw * maze_coord + dlw

        img_size = convert(maze.n) + lw
        image = Image.new('RGB', (img_size, img_size), color='black')
        drawer = ImageDraw.Draw(image)

        def as_box(e: Edge):
            xr = {convert(vtx.x) for vtx in e.v}
            yr = {convert(vtx.y) for vtx in e.v}
            return min(xr), min(yr), max(xr) + 1, max(yr) + 1

        def draw(*edges, color='white'):
            for e in edges:
                drawer.rectangle(as_box(e), fill=color)

        entrance = Edge(Vertex(-1, 0), Vertex(0, 0))
        the_exit = Edge(Vertex(maze.n - 1, maze.n - 1),
                        Vertex(maze.n, maze.n - 1))

        draw(*maze.get_all_edges())
        draw(entrance, the_exit)

        if solution:
            solution_color = 'limegreen'
            draw(*solution.edges, color=solution_color)
            draw(entrance, the_exit, color=solution_color)

        image.save(build_output_path('jpg', file_name=filename), 'JPEG')
Exemple #5
0
	def prepare (self):
		self.load_data()

		self.menu.set_base(self)
		self.room.set_base(self)
		
		self.maze = Maze(8, 8)
Exemple #6
0
def convert_from_dict_to_maze(data) -> Maze:
    """
    Convert dict data to maze object\n
    Returns: Maze object
    """
    maze = Maze(
        data["maze"],
        data["width"],
        data["height"],
        data["start_coords"],
        data["end_coords"],
    )
    if "stats" in data:  # if maze has stats, add Stats() object
        maze.Stats = Stats()
        for stat in data["stats"]:
            maze.Stats.solutions.append(stat)
    return maze
Exemple #7
0
    def __init__(self, maze: Maze, hand: Hand):
        position = path.Node(maze.start)
        direction = Direction.EAST
        turn_prio = [hand, lambda d: d, Hand.opposite(hand), turn_back]

        while position.val != maze.end:
            candidates = [turn(direction) for turn in turn_prio]
            neighbours = maze.get_accessible_neighbours(position.val)
            direction = next(c for c in candidates
                             if c(position.val) in neighbours)
            position = position.create_child(direction(position.val))

        self.solution = Solution.from_vertices(list(position.as_path()))
Exemple #8
0
    def render(maze: Maze, filename=None):
        n = 3 * maze.n
        board = [[]] * n
        for i in range(0, n):
            board[i] = [True] * n

        def convert(maze_coord):
            return 1 + 3 * maze_coord

        for edge in maze.get_all_edges():
            xr = {convert(vtx.x) for vtx in edge.v}
            yr = {convert(vtx.y) for vtx in edge.v}
            for x in range(min(xr), max(xr) + 1):
                for y in range(min(yr), max(yr) + 1):
                    board[x][y] = False
        board[0][1] = False
        board[n - 1][n - 2] = False

        with open(build_output_path('txt', file_name=filename), 'w') as f:
            f.write(
                nl.join([
                    ''.join(u"\u2588" if cell else ' ' for cell in row)
                    for row in board
                ]))
Exemple #9
0
class TheRoomsGame(Widget):
    # Set base values for
    # 1 - scales
    xScale = NumericProperty(1.0)
    yScale = NumericProperty(1.0)

    # 2 - font size
    fontSize = NumericProperty(64.0)

    # 3 - current state (0: menu; 1: game; 2: gameover)
    state = NumericProperty(0)

    # 4 - user data store directory
    dataDir = StringProperty('')

    # 4.1 - user data file name
    userData = StringProperty('')

    # 5 - game data
    score = NumericProperty(0)
    name = StringProperty('')
    time = NumericProperty(0)

    # Child widgets
    menu = ObjectProperty(None)
    room = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(TheRoomsGame, self).__init__(**kwargs)

        # Define transitions
        # 1 - Out once
        self.transOut = Animation(opacity=0)
        self.transOut.bind(on_complete=self.remove_child)

        # 2 - In once
        self.transIn = Animation(opacity=1)

        # 3 - Inter rooms
        self.transRoom = Animation(opacity=0, d=1.5) + Animation(opacity=1)
        self.transRoom.bind(on_progress=self.prepare_room)

        # Data filename
        self.userData = 'stat.dat'

        # First screen to see is menu
        self.state = 0

    def prepare(self):
        self.load_data()

        self.menu.set_base(self)
        self.room.set_base(self)

        self.maze = Maze(8, 8)

    def set_data_dir(self, dir):
        self.dataDir = dir + '//'

    def load_data(self):
        with open(self.dataDir + self.userData, 'r') as file:
            data = json.loads(file.readline())
            self.score = data[0]
            self.name = data[1]
            self.time = data[2]

    def save_data(self):
        with open(self.dataDir + self.userData, 'w') as file:
            json.dump([self.score, self.name, self.time], file)

    def remove_child(self, anim, widget):
        widget.parent.remove_widget(widget)

    def prepare_room(self, anim, widget, progress):
        if progress > 0.5 and progress < 0.51:
            self.room.set_room(self.maze.load_curr_room_property())

    def take_scale(self):
        retval = False

        xScale = self.width * 1.0 / self.room.WIDTH
        yScale = self.height * 1.0 / self.room.HEIGHT

        if self.xScale != xScale:
            self.xScale = xScale
            retval = True
        if self.yScale != yScale:
            self.yScale = yScale
            retval = True

        return retval

    def play(self):
        self.transOut.start(self.menu)

        self.state = 1

        self.room.received = False

        self.maze.generate_rooms(8, 8)

        self.transRoom.start(self.room)

    def home(self):
        self.add_widget(self.menu)

        self.state = 0

        self.maze.reset_maze()

        self.transIn.start(self.menu)

    ##
    #  @brief intermethod between input on widget with its logic structure
    #
    #  @param [in] code move direction (0: ahead; 1: right; 2: back; 3: left)
    #  @return none
    #
    def go(self, code):
        self.maze.change_room(code)
        self.transRoom.start(self.room)

    def change_lamp_state(self, code, state):
        self.maze.change_lamp(code, state)

    def update(self, dt):
        self.take_scale()

        self.fontSize = 64.0 * self.yScale * 1.2

        if self.state == 0:
            self.menu.update(self.width, self.height, self.fontSize)

        state = self.maze.game_state()
        if state != 0:
            self.state = 2
        self.room.update(self.xScale, self.yScale, self.fontSize, state)
Exemple #10
0
class TheRoomsGame(Widget):
	# Set base values for
	# 1 - scales
	xScale = NumericProperty(1.0)
	yScale = NumericProperty(1.0)
	
	# 2 - font size
	fontSize = NumericProperty(64.0)
	
	# 3 - current state (0: menu; 1: game; 2: gameover)
	state = NumericProperty(0)

	# 4 - user data store directory
	dataDir = StringProperty('')
	
	# 4.1 - user data file name
	userData = StringProperty('')

	# 5 - game data
	score = NumericProperty(0)
	name = StringProperty('')
	time = NumericProperty(0)

	# Child widgets
	menu = ObjectProperty(None)
	room = ObjectProperty(None)
	
	def __init__(self, **kwargs):
		super(TheRoomsGame, self).__init__(**kwargs)

		# Define transitions
		# 1 - Out once
		self.transOut = Animation(opacity = 0)
		self.transOut.bind(on_complete = self.remove_child)

		# 2 - In once
		self.transIn = Animation(opacity = 1)

		# 3 - Inter rooms
		self.transRoom = Animation(opacity = 0, d = 1.5) + Animation(opacity = 1)
		self.transRoom.bind(on_progress = self.prepare_room)
		
		# Data filename
		self.userData = 'stat.dat'
		
		# First screen to see is menu
		self.state = 0

	def prepare (self):
		self.load_data()

		self.menu.set_base(self)
		self.room.set_base(self)
		
		self.maze = Maze(8, 8)

	def set_data_dir(self, dir):
		self.dataDir = dir + '//'
	
	def load_data(self):
		with open(self.dataDir + self.userData, 'r') as file:
			data = json.loads(file.readline())
			self.score = data[0]
			self.name = data[1]
			self.time = data[2]

	def save_data(self):
		with open(self.dataDir + self.userData, 'w') as file:
			json.dump([self.score, self.name, self.time], file)

	def remove_child(self, anim, widget):
		widget.parent.remove_widget(widget)

	def prepare_room(self, anim, widget, progress):
		if progress > 0.5 and progress < 0.51:
			self.room.set_room(self.maze.load_curr_room_property())

	def take_scale(self):
		retval = False

		xScale = self.width * 1.0 / self.room.WIDTH
		yScale = self.height * 1.0 / self.room.HEIGHT

		if self.xScale != xScale:
			self.xScale = xScale
			retval = True
		if self.yScale != yScale:
			self.yScale = yScale
			retval = True
		
		return retval
	
	def play(self):
		self.transOut.start(self.menu)

		self.state = 1
		
		self.room.received = False
		
		self.maze.generate_rooms(8, 8)
		
		self.transRoom.start(self.room)

	def home(self):
		self.add_widget(self.menu)
		
		self.state = 0
		
		self.maze.reset_maze()
		
		self.transIn.start(self.menu)

	## 
	#  @brief intermethod between input on widget with its logic structure
	#  
	#  @param [in] code move direction (0: ahead; 1: right; 2: back; 3: left)
	#  @return none
	#  
	def go(self, code):
		self.maze.change_room(code)
		self.transRoom.start(self.room)

	def change_lamp_state(self, code, state):
		self.maze.change_lamp(code, state)

	def update(self, dt):
		self.take_scale()
		
		self.fontSize = 64.0 * self.yScale * 1.2
		
		if self.state == 0:
			self.menu.update(self.width, self.height, self.fontSize)
		
		state = self.maze.game_state()
		if state != 0:
			self.state = 2
		self.room.update(self.xScale, self.yScale, self.fontSize, state)
Exemple #11
0
 def __init__(self, n):
     self.n = n
     self.maze = Maze(n)
     self.random = Random()
Exemple #12
0
 def __init__(self, n, thresh=0.4):
     self.n = n
     self.thresh = thresh
     self.maze = Maze(n)
     self.random = Random()