3bd2d9269f
- Created gameinfo.xml for the Mice! game, detailing its description, release date, developer, and genre. - Added mice.sh script to activate the conda environment and run the game. - Implemented colorize_assets.py as a placeholder for future asset colorization functionality. - Developed convert_audio.py to convert audio files to 8-bit unsigned format at 22100 Hz. - Introduced maze.py for generating mazes using Depth First Search (DFS) with a graphical interface. - Created resize_assets.py to resize PNG assets to 18x18 pixels and center them on a 20x20 canvas.
109 lines
4.0 KiB
Python
109 lines
4.0 KiB
Python
# DFS: Depth First Search
|
|
import random
|
|
import tkinter as tk
|
|
import json
|
|
import time
|
|
|
|
class MazeGenerator:
|
|
def __init__(self, width=10, height=10):
|
|
self.width = width * 2 + 1 # Considera le pareti nel calcolo della larghezza
|
|
self.height = height * 2 + 1 # Considera le pareti nel calcolo dell'altezza
|
|
self.generate_maze()
|
|
self.window = tk.Tk()
|
|
self.window.title("Maze")
|
|
self.canvas = tk.Canvas(self.window, width=self.width*10, height=self.height*10)
|
|
self.canvas.pack()
|
|
self.arrival_point = (self.width - 2, self.height - 2) # Aggiorna il punto di arrivo
|
|
self.backtrack = []
|
|
|
|
def generate_maze(self):
|
|
# Inizializza il labirinto con muri (True)
|
|
self.maze = [[True for _ in range(self.width)] for _ in range(self.height)]
|
|
|
|
# Definisci le direzioni (N, S, E, W)
|
|
self.directions = [(-2, 0), (2, 0), (0, -2), (0, 2)]
|
|
|
|
# Punto di partenza
|
|
start_x, start_y = (1, 1)
|
|
self.maze[start_y][start_x] = False
|
|
self.stack = [(start_x, start_y)]
|
|
|
|
def stack_iteration(self):
|
|
if not self.stack: # Check if the stack is empty
|
|
return
|
|
|
|
current_x, current_y = self.stack[-1]
|
|
|
|
# Function to get the unvisited neighbors
|
|
def get_unvisited_neighbors(x, y):
|
|
time.sleep(0.005)
|
|
neighbors = []
|
|
if not (self.arrival_point == (x,y)):
|
|
for dx, dy in self.directions:
|
|
nx, ny = x + dx, y + dy
|
|
if 1 <= nx < self.width - 1 and 1 <= ny < self.height - 1 and self.maze[ny][nx]:
|
|
neighbors.append((nx, ny))
|
|
return neighbors
|
|
|
|
neighbors = get_unvisited_neighbors(current_x, current_y)
|
|
|
|
if neighbors:
|
|
# Choose a random unvisited neighbor
|
|
chosen_x, chosen_y = random.choice(neighbors)
|
|
|
|
# Remove the wall between the current cell and the chosen cell
|
|
self.maze[(current_y + chosen_y) // 2][(current_x + chosen_x) // 2] = False
|
|
|
|
# Mark the chosen cell as visited
|
|
self.maze[chosen_y][chosen_x] = False
|
|
|
|
# Push the chosen cell to the stack
|
|
self.stack.append((chosen_x, chosen_y))
|
|
else:
|
|
# Backtrack if no unvisited neighbors are found
|
|
self.backtrack.append(self.stack.pop())
|
|
|
|
def update_maze(self):
|
|
self.stack_iteration()
|
|
self.draw_maze()
|
|
if self.stack: # Continue updating only if there are cells left to visit
|
|
self.window.after(10, self.update_maze)
|
|
else:
|
|
self.add_random_passages()
|
|
self.draw_maze()
|
|
with open('maze.json', 'w') as json_file:
|
|
json.dump(self.maze, json_file)
|
|
|
|
def add_random_passages(self):
|
|
# Aggiungi passaggi casuali tra i corridoi
|
|
for _ in range(30):
|
|
x = random.randrange(1, self.width - 1, 2)
|
|
y = random.randrange(1, self.height - 1, 2)
|
|
print(x, y)
|
|
self.maze[y][x] = False
|
|
|
|
def draw_maze(self):
|
|
self.canvas.delete("all")
|
|
for i in range(self.height):
|
|
for j in range(self.width):
|
|
color = "black" if self.maze[i][j] else "white"
|
|
# if (i, j) in self.backtrack:
|
|
# color="yellow"
|
|
if (i, j) == self.arrival_point:
|
|
color = "green" # Color the arrival point green
|
|
elif (i, j) == (1 ,1):
|
|
color = "red" # Color the arrival point green
|
|
elif self.stack and (j, i) == self.stack[-1]:
|
|
color = "blue" # Color the current position blue
|
|
self.canvas.create_rectangle(j*10, i*10, (j+1)*10, (i+1)*10, fill=color)
|
|
|
|
|
|
def run(self):
|
|
self.update_maze()
|
|
|
|
self.window.mainloop()
|
|
|
|
# Crea e avvia il generatore di labirinti
|
|
generator = MazeGenerator(15, 8)
|
|
generator.run()
|