Compare commits

..

4 Commits
master ... tk

  1. 31
      Effects/.gitignore
  2. BIN
      Effects/__pycache__/animated_gif.cpython-311.pyc
  3. BIN
      Effects/__pycache__/order_click.cpython-311.pyc
  4. 31
      Units/.gitignore
  5. BIN
      Units/__pycache__/knight.cpython-311.pyc
  6. 62
      Units/hound.py
  7. 55
      Units/knight.py
  8. 63
      Units/zombie.py
  9. BIN
      assets/Hound/Idle/Idle_dir1.gif
  10. BIN
      assets/Hound/Idle/Idle_dir2.gif
  11. BIN
      assets/Hound/Idle/Idle_dir3.gif
  12. BIN
      assets/Hound/Idle/Idle_dir4.gif
  13. BIN
      assets/Hound/Idle/Idle_dir5.gif
  14. BIN
      assets/Hound/Idle/Idle_dir6.gif
  15. BIN
      assets/Hound/Idle/Idle_dir7.gif
  16. BIN
      assets/Hound/Idle/Idle_dir8.gif
  17. BIN
      assets/Hound/Walk/Walk_dir1.gif
  18. BIN
      assets/Hound/Walk/Walk_dir2.gif
  19. BIN
      assets/Hound/Walk/Walk_dir3.gif
  20. BIN
      assets/Hound/Walk/Walk_dir4.gif
  21. BIN
      assets/Hound/Walk/Walk_dir5.gif
  22. BIN
      assets/Hound/Walk/Walk_dir6.gif
  23. BIN
      assets/Hound/Walk/Walk_dir7.gif
  24. BIN
      assets/Hound/Walk/Walk_dir8.gif
  25. BIN
      assets/Zombie/Idle/Idle_dir1.gif
  26. BIN
      assets/Zombie/Idle/Idle_dir2.gif
  27. BIN
      assets/Zombie/Idle/Idle_dir3.gif
  28. BIN
      assets/Zombie/Idle/Idle_dir4.gif
  29. BIN
      assets/Zombie/Idle/Idle_dir5.gif
  30. BIN
      assets/Zombie/Idle/Idle_dir6.gif
  31. BIN
      assets/Zombie/Idle/Idle_dir7.gif
  32. BIN
      assets/Zombie/Idle/Idle_dir8.gif
  33. BIN
      assets/Zombie/Walk/Walk_dir1.gif
  34. BIN
      assets/Zombie/Walk/Walk_dir2.gif
  35. BIN
      assets/Zombie/Walk/Walk_dir3.gif
  36. BIN
      assets/Zombie/Walk/Walk_dir4.gif
  37. BIN
      assets/Zombie/Walk/Walk_dir5.gif
  38. BIN
      assets/Zombie/Walk/Walk_dir6.gif
  39. BIN
      assets/Zombie/Walk/Walk_dir7.gif
  40. BIN
      assets/Zombie/Walk/Walk_dir8.gif
  41. BIN
      audio
  42. 1
      booh.json
  43. 147
      main.py
  44. 2
      maze.json
  45. 8
      maze.py
  46. 1
      moh.json
  47. 1
      patan.json
  48. 1
      solver.py

31
Effects/.gitignore vendored

@ -0,0 +1,31 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
dist/
build/
*.egg-info/
# Virtual environments
venv/
env/
.env/
# IDE specific files
.idea/
.vscode/
# Compiled Python files
*.pyc
# Logs
*.log
# OS generated files
.DS_Store
Thumbs.db

BIN
Effects/__pycache__/animated_gif.cpython-311.pyc

Binary file not shown.

BIN
Effects/__pycache__/order_click.cpython-311.pyc

Binary file not shown.

31
Units/.gitignore vendored

@ -0,0 +1,31 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
dist/
build/
*.egg-info/
# Virtual environments
venv/
env/
.env/
# IDE specific files
.idea/
.vscode/
# Compiled Python files
*.pyc
# Logs
*.log
# OS generated files
.DS_Store
Thumbs.db

BIN
Units/__pycache__/knight.cpython-311.pyc

Binary file not shown.

62
Units/hound.py

@ -1,62 +0,0 @@
import tkinter as tk
import os
import glob
import time
import random
from Effects.animated_gif import AnimatedGif
from Effects.order_click import OrderClick
class Unit:
def __init__(self, engine, position=(0,0)):
self.engine = engine
self.position = position
self.target = position
self.destination = position
gifs = glob.glob("assets/Hound/**/*.gif", recursive=True)
self.animation = {os.path.basename(gif): AnimatedGif(gif) for gif in gifs}
self.state = "Walk"
self.speed = .025 # This is now the delay between updates in seconds
self.partial_move = 0
self.direction = 2
self.visited = [self.position]
self.starting_position = (position)
self.already_tried = []
def move(self, target):
pass
def ai(self):
screen_x, screen_y = self.engine.iso_transform(*self.position)
if self.position != self.target:
self.direction = self.engine.get_direction(self.position,self.destination)
if self.partial_move<1:
screen_x_dest, screen_y_dest = self.engine.iso_transform(*self.destination)
self.partial_move += self.speed
screen_x += (screen_x_dest - screen_x) * self.partial_move
screen_y += (screen_y_dest - screen_y) * self.partial_move
else:
screen_x, screen_y = self.engine.iso_transform(*self.destination)
neighbors_list = self.engine.find_neighbors(self.destination) # Get the neighbors of the destination cell
# Remove any neighbors that are not walkable
neighbors_list = [cell for cell in neighbors_list if self.engine.battlefield[cell[1]][cell[0]].walkable]
# Update position and visited list
self.position = self.destination
self.destination = None
self.visited.append(self.position)
self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target)
self.partial_move = 0
else:
self.visited = [self.target]
self.position = self.target
self.starting_position = self.target
self.destination = self.target
self.state = "Idle"
self.partial_move = 1
gif = self.animation.get(f'{self.state}_dir{self.direction}.gif')
return gif, screen_x, screen_y
def move_to(self, target):
self.target = target
self.state = "Walk"

55
Units/knight.py

@ -1,13 +1,10 @@
import tkinter as tk
import os import os
import glob import glob
import time
import random
from Effects.animated_gif import AnimatedGif from Effects.animated_gif import AnimatedGif
from Effects.order_click import OrderClick from Effects.order_click import OrderClick
class Unit: class Knight:
def __init__(self, engine, position=(0,0)): def __init__(self, engine, position=(0,0)):
self.engine = engine self.engine = engine
self.position = position self.position = position
@ -21,42 +18,56 @@ class Unit:
self.direction = 2 self.direction = 2
self.visited = [self.position] self.visited = [self.position]
self.starting_position = (position) self.starting_position = (position)
self.already_tried = []
def move(self, target):
pass
def ai(self): def ai(self):
screen_x, screen_y = self.engine.iso_transform(*self.position) screen_x, screen_y = self.engine.iso_transform(*self.position)
if self.position != self.target: if self.position == self.target:
self.visited = [self.target]
self.position = self.target
self.starting_position = self.target
self.destination = self.target
self.state = "Idle"
self.partial_move = 1
else:
self.direction = self.engine.get_direction(self.position,self.destination) self.direction = self.engine.get_direction(self.position,self.destination)
if self.partial_move<1: if self.partial_move<1:
screen_x_dest, screen_y_dest = self.engine.iso_transform(*self.destination) screen_x_dest, screen_y_dest = self.engine.iso_transform(*self.destination)
self.partial_move += self.speed self.partial_move += self.speed
if self.partial_move > 1:
self.partial_move = 1
screen_x += (screen_x_dest - screen_x) * self.partial_move screen_x += (screen_x_dest - screen_x) * self.partial_move
screen_y += (screen_y_dest - screen_y) * self.partial_move screen_y += (screen_y_dest - screen_y) * self.partial_move
else: else:
screen_x, screen_y = self.engine.iso_transform(*self.destination) screen_x, screen_y = self.engine.iso_transform(*self.destination)
self.visited = self.visited[-4:]
neighbors_list = self.engine.find_neighbors(self.destination) # Get the neighbors of the destination cell neighbors_list = self.engine.find_neighbors(self.destination) # Get the neighbors of the destination cell
neighbors_list = [cell for cell in neighbors_list if cell not in self.visited]
# Remove any neighbors that are not walkable # Remove any neighbors that are not walkable
self.best_next = self.engine.get_closest_neighbor(neighbors_list,self.target)
#if best next is not walkable, find the closest walkable cell to best next
neighbors_list = [cell for cell in neighbors_list if self.engine.battlefield[cell[1]][cell[0]].walkable] neighbors_list = [cell for cell in neighbors_list if self.engine.battlefield[cell[1]][cell[0]].walkable]
# Update position and visited list if self.engine.battlefield[self.best_next[1]][self.best_next[0]].walkable == False:
self.best_next = self.engine.get_closest_neighbor(neighbors_list,self.best_next)
if not self.best_next:
self.target = self.destination
self.best_next = self.destination
self.position = self.destination self.position = self.destination
self.destination = None self.destination = self.best_next
self.visited.append(self.position)
self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target)
self.partial_move = 0 self.partial_move = 0
else: self.visited.append(self.destination)
self.visited = [self.target] print(self.partial_move)
self.position = self.target
self.starting_position = self.target
self.destination = self.target
self.state = "Idle"
self.partial_move = 1
gif = self.animation.get(f'Knight_{self.state}_dir{self.direction}.gif') gif = self.animation.get(f'Knight_{self.state}_dir{self.direction}.gif')
return gif, screen_x, screen_y return gif, screen_x, screen_y
def move_to(self, target): def move_to(self, target):
self.speed = .05
self.target = target self.target = target
self.state = "Walk" self.state = "Walk"
def run_to(self, target):
self.speed = .13
self.target = target
self.state = "Run"

63
Units/zombie.py

@ -1,63 +0,0 @@
import tkinter as tk
import os
import glob
import time
import random
from Effects.animated_gif import AnimatedGif
from Effects.order_click import OrderClick
class Unit:
def __init__(self, engine, position=(0,0)):
self.engine = engine
self.position = position
self.target = position
self.script_name = os.path.basename(__file__).split('.')[0]
self.destination = position
gifs = glob.glob("assets/Zombie/**/*.gif", recursive=True)
self.animation = {os.path.basename(gif): AnimatedGif(gif) for gif in gifs}
self.state = "Walk"
self.speed = .05 # This is now the delay between updates in seconds
self.partial_move = 0
self.direction = 2
self.visited = [self.position]
self.starting_position = (position)
self.already_tried = []
def move(self, target):
pass
def ai(self):
screen_x, screen_y = self.engine.iso_transform(*self.position)
if self.position != self.target:
self.direction = self.engine.get_direction(self.position,self.destination)
if self.partial_move<1:
screen_x_dest, screen_y_dest = self.engine.iso_transform(*self.destination)
self.partial_move += self.speed
screen_x += (screen_x_dest - screen_x) * self.partial_move
screen_y += (screen_y_dest - screen_y) * self.partial_move
else:
screen_x, screen_y = self.engine.iso_transform(*self.destination)
neighbors_list = self.engine.find_neighbors(self.destination) # Get the neighbors of the destination cell
# Remove any neighbors that are not walkable
neighbors_list = [cell for cell in neighbors_list if self.engine.battlefield[cell[1]][cell[0]].walkable]
# Update position and visited list
self.position = self.destination
self.destination = None
self.visited.append(self.position)
self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target)
self.partial_move = 0
else:
self.visited = [self.target]
self.position = self.target
self.starting_position = self.target
self.destination = self.target
self.state = "Idle"
self.partial_move = 1
gif = self.animation.get(f'{self.state}_dir{self.direction}.gif')
return gif, screen_x, screen_y
def move_to(self, target):
self.target = target
self.state = "Walk"

BIN
assets/Hound/Idle/Idle_dir1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

BIN
assets/Hound/Idle/Idle_dir2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

BIN
assets/Hound/Idle/Idle_dir3.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

BIN
assets/Hound/Idle/Idle_dir4.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

BIN
assets/Hound/Idle/Idle_dir5.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

BIN
assets/Hound/Idle/Idle_dir6.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

BIN
assets/Hound/Idle/Idle_dir7.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

BIN
assets/Hound/Idle/Idle_dir8.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

BIN
assets/Hound/Walk/Walk_dir1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

BIN
assets/Hound/Walk/Walk_dir2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

BIN
assets/Hound/Walk/Walk_dir3.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

BIN
assets/Hound/Walk/Walk_dir4.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

BIN
assets/Hound/Walk/Walk_dir5.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

BIN
assets/Hound/Walk/Walk_dir6.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

BIN
assets/Hound/Walk/Walk_dir7.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

BIN
assets/Hound/Walk/Walk_dir8.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

BIN
assets/Zombie/Idle/Idle_dir1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

BIN
assets/Zombie/Idle/Idle_dir2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

BIN
assets/Zombie/Idle/Idle_dir3.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

BIN
assets/Zombie/Idle/Idle_dir4.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

BIN
assets/Zombie/Idle/Idle_dir5.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

BIN
assets/Zombie/Idle/Idle_dir6.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

BIN
assets/Zombie/Idle/Idle_dir7.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

BIN
assets/Zombie/Idle/Idle_dir8.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

BIN
assets/Zombie/Walk/Walk_dir1.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

BIN
assets/Zombie/Walk/Walk_dir2.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

BIN
assets/Zombie/Walk/Walk_dir3.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

BIN
assets/Zombie/Walk/Walk_dir4.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

BIN
assets/Zombie/Walk/Walk_dir5.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

BIN
assets/Zombie/Walk/Walk_dir6.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

BIN
assets/Zombie/Walk/Walk_dir7.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

BIN
assets/Zombie/Walk/Walk_dir8.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

BIN
audio

Binary file not shown.

1
booh.json

File diff suppressed because one or more lines are too long

147
main.py

@ -4,26 +4,44 @@ import glob
import os import os
import json import json
import Units from Units.knight import Knight
from Effects.order_click import OrderClick from Effects.order_click import OrderClick
from tkinter import Menu from tkinter import Menu
from collections import deque import yt_dlp
import os
import Units.hound
import Units.zombie
from pydub import AudioSegment
import subprocess
import threading
import asyncio
import sys
from tkinter import filedialog
class IsometricGame: class IsometricGame:
def load_battlefield(self):
file_path = filedialog.askopenfilename()
if file_path:
with open(file_path, 'r') as file:
data = json.load(file)
width = len(data[0])
height = len(data)
self.battlefield = [[Cell(walkable=not data[y][x], tile=self.tiles["landscapeTiles_067"] if not data[y][x] else self.tiles["landscapeTiles_066"]) for x in range(width)] for y in range(height)]
self.width = width
self.height = height
self.draw_battlefield()
def save_battlefield(self):
filename = filedialog.asksaveasfilename(defaultextension=".json")
with open(filename, 'w') as json_file:
json.dump([[not cell.walkable for cell in row] for row in self.battlefield], json_file)
def __init__(self, width, height, data): def __init__(self, width, height, data):
self.width = width self.width = width
self.height = height self.height = height
self.view_offset_x = 800 self.view_offset_x = 800
self.view_offset_y = 0 self.view_offset_y = 0
self.cell_width = 134 self.cell_width = 132
self.cell_height = 68 self.cell_height = 66
self.cell_selected = (0, 0) self.cell_selected = (0, 0)
self.last_trigger_time = 0 self.last_trigger_time = 0
@ -35,6 +53,8 @@ class IsometricGame:
self.input_lock = False self.input_lock = False
self.window = tk.Tk() self.window = tk.Tk()
self.window.protocol("WM_DELETE_WINDOW", self.on_close)
files = sorted(glob.glob("Tiles/**/*.png", recursive=True)) files = sorted(glob.glob("Tiles/**/*.png", recursive=True))
self.tiles = {os.path.splitext(os.path.basename(file))[0]: tk.PhotoImage(file=file) for file in files} self.tiles = {os.path.splitext(os.path.basename(file))[0]: tk.PhotoImage(file=file) for file in files}
# self.battlefield = [[Cell(walkable = True, tile=self.tiles["landscapeTiles_067"] ) for x in range(self.width)] for y in range(self.height)] # self.battlefield = [[Cell(walkable = True, tile=self.tiles["landscapeTiles_067"] ) for x in range(self.width)] for y in range(self.height)]
@ -50,12 +70,26 @@ class IsometricGame:
self.window.bind('<KeyRelease>', self.on_key_press) self.window.bind('<KeyRelease>', self.on_key_press)
self.canvas.bind('<Button-1>', self.on_canvas_click) self.canvas.bind('<Button-1>', self.on_canvas_click)
self.canvas.bind('<Button-3>', self.on_canvas_rclick) self.canvas.bind('<Button-3>', self.on_canvas_rclick)
self.canvas.bind('<Double-Button-3>', self.on_canvas_double_rclick)
self.canvas.bind('<Motion>', self.calculate_coordinates) self.canvas.bind('<Motion>', self.calculate_coordinates)
menubar = tk.Menu(self.window, tearoff=0)
menubar.add_command(label="Carica campo di battaglia", command=self.load_battlefield)
menubar.add_command(label="Salva campo di battaglia", command=self.save_battlefield)
menubar.add_command(label="Chiudi", command=self.on_close)
self.window.config(menu=menubar)
self.knight = Units.zombie.Unit(self, position=(1, 1)) self.knight = Knight(self, (1,1))
self.draw_battlefield() self.draw_battlefield()
def on_close(self):
print("Chiusura")
self.window.quit() # Chiude la finestra
self.window.destroy() # Distrugge l'oggetto finestra
sys.exit() # Termina l'esecuzione del programma
def calculate_coordinates(self, event): def calculate_coordinates(self, event):
if self.input_lock: if self.input_lock:
return return
@ -77,7 +111,7 @@ class IsometricGame:
elif delta_x == -1 and delta_y == 0: elif delta_x == -1 and delta_y == 0:
return 3 # Ovest return 3 # Ovest
elif delta_x == -1 and delta_y == -1: elif delta_x == -1 and delta_y == -1:
return 4 # Nord-Ovest return 4 # Nord-Ovest
elif delta_x == 0 and delta_y == -1: elif delta_x == 0 and delta_y == -1:
return 5 # Nord return 5 # Nord
elif delta_x == 1 and delta_y == -1: elif delta_x == 1 and delta_y == -1:
@ -146,40 +180,7 @@ class IsometricGame:
x1, y1 = position1 x1, y1 = position1
x2, y2 = position2 x2, y2 = position2
return abs(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5) return abs(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5)
def get_distance_components(self, position1, position2):
x1, y1 = position1
x2, y2 = position2
return abs(x2 - x1), abs(y2 - y1)
#function to check if a cell is near a wall
def near_wall(self, position):
x, y = position
neighbors = self.find_neighbors(position)
for neighbor in neighbors:
if not self.battlefield[neighbor[1]][neighbor[0]].walkable:
return True
def min_steps_to_target(self, start, target):
grid = [[0 for _ in range(self.width)] for _ in range(self.height)]
rows, cols = len(grid), len(grid[0])
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
queue = deque([start])
visited = set([start])
steps = 0
while queue:
for _ in range(len(queue)):
x, y = queue.popleft()
if (x, y) == target:
return steps
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < rows and 0 <= ny < cols and (nx, ny) not in visited:
queue.append((nx, ny))
visited.add((nx, ny))
steps += 1
return -1
def draw_battlefield(self): def draw_battlefield(self):
self.canvas.delete("cell") # Pulisce le celle precedenti prima di ridisegnare self.canvas.delete("cell") # Pulisce le celle precedenti prima di ridisegnare
self.canvas.delete("cell-label") self.canvas.delete("cell-label")
@ -272,12 +273,21 @@ class IsometricGame:
def on_canvas_click(self, event): def on_canvas_click(self, event):
# calculate the clicked cell's coordinates # calculate the clicked cell's coordinates
cell_x, cell_y = self.inv_iso_transform(event.x, event.y) cell_x, cell_y = self.inv_iso_transform(event.x, event.y)
self.battlefield[cell_y][cell_x].walkable ^= True cell=self.battlefield[cell_y][cell_x]
self.battlefield[cell_y][cell_x].tile = self.tiles["landscapeTiles_067"] if self.battlefield[cell_y][cell_x].walkable else self.tiles["landscapeTiles_066"] cell.walkable ^= True
cell.tile = self.tiles["landscapeTiles_067"] if cell.walkable else self.tiles["landscapeTiles_066"]
self.draw_battlefield() self.draw_battlefield()
self.draw_units() self.draw_units()
def on_canvas_double_rclick(self, event):
print("Double right click")
# calculate the clicked cell's coordinates
cell_x, cell_y = self.inv_iso_transform(event.x, event.y)
self.effects.append(OrderClick(self.iso_transform(cell_x, cell_y),color="lightblue"))
if self.knight.target == (cell_x, cell_y) and self.knight.state == "Run":
return
if 0 <= cell_x < self.width and 0 <= cell_y < self.height:
self.knight.run_to((cell_x, cell_y))
def set_tile(self, name, pos): def set_tile(self, name, pos):
# Handle option 1 selection # Handle option 1 selection
@ -292,15 +302,12 @@ class IsometricGame:
def on_canvas_rclick(self, event): def on_canvas_rclick(self, event):
# calculate the clicked cell's coordinates # calculate the clicked cell's coordinates
cell_x, cell_y = self.inv_iso_transform(event.x, event.y) cell_x, cell_y = self.inv_iso_transform(event.x, event.y)
print(f'Cell clicked: ({cell_x}, {cell_y})') self.effects.append(OrderClick(self.iso_transform(cell_x, cell_y),color="lightblue"))
x, y = self.iso_transform(cell_x, cell_y)
self.effects.append(OrderClick((x, y), color="light blue"))
if self.knight.target == (cell_x, cell_y): if self.knight.target == (cell_x, cell_y):
return return
if 0 <= cell_x < self.width and 0 <= cell_y < self.height: if 0 <= cell_x < self.width and 0 <= cell_y < self.height:
self.knight.move_to((cell_x,cell_y)) self.knight.move_to((cell_x, cell_y))
def run(self): def run(self):
self.draw_battlefield() self.draw_battlefield()
self.update() self.update()
@ -310,7 +317,7 @@ class IsometricGame:
#self.draw_battlefield() #self.draw_battlefield()
self.draw_units() self.draw_units()
self.draw_effects() self.draw_effects()
self.window.after(75, self.update) # Call again after 100 ms self.window.after(50, self.update) # Call again after 100 ms
class Cell: class Cell:
def __init__(self, walkable=False, tile=None, elevation=0, offset=0): def __init__(self, walkable=False, tile=None, elevation=0, offset=0):
@ -323,19 +330,25 @@ class Cell:
if __name__ == "__main__": if __name__ == "__main__":
with open('maze.json', 'r') as file: output_filename = "audio"
data = json.load(file)
# Creare una matrice 10x10 piena di False
room = [[True for _ in range(10)] for _ in range(10)]
# Cambiare i valori interni della matrice in True # use ytdb for download audio from youtube video with lower posible quality using output_filename as filename
for i in range(1, 9): ydl_opts = {
for j in range(1, 8): 'format': '140',
room[i][j] = False 'outtmpl': output_filename,
}
# Creare un'apertura di un'unità verso l'esterno
room[0][4] = True # Cambia questo valore per spostare l'apertura if not os.path.exists(output_filename):
data =room with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=-IQZEk-oaYU'])
# play the audio asynchrounously
audio = AudioSegment.from_file(output_filename)
playb = subprocess.Popen(["ffplay", "-nodisp", "-autoexit", output_filename], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
with open('maze.json', 'r') as file:
data = json.load(file)
# data is a boolean matrix, find dmensions # data is a boolean matrix, find dmensions
width = len(data[0]) width = len(data[0])
height = len(data) height = len(data)

2
maze.json

@ -1 +1 @@
[[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, true], [true, true, true, true, false, false, false, true, true, false, false, false, true, false, false, false, true, true, true, false, true], [true, false, false, false, false, false, true, false, false, false, true, false, true, false, true, false, true, false, false, false, true], [true, false, true, false, true, true, true, false, true, true, true, false, true, false, true, false, true, false, true, true, true], [true, false, false, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false, false, false, true], [true, false, true, true, true, false, true, true, true, false, true, false, true, false, true, false, true, true, false, false, true], [true, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, true, false, true], [true, false, true, false, true, false, true, true, true, false, true, false, false, false, false, false, true, false, true, false, true], [true, false, true, false, true, false, false, false, true, false, true, false, true, false, false, false, false, false, true, false, true], [true, false, true, false, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true], [true, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, true, true, false, true, false, true, true, true, true, true, false, false, true, true, false, true], [true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, true, false, false, false, true], [true, false, true, false, true, false, true, false, true, true, false, true, true, false, true, false, true, true, true, true, true], [true, false, false, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, false, false, true], [true, false, true, false, true, true, true, true, true, false, false, false, true, false, true, true, true, true, false, false, true], [true, false, true, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, true], [true, false, true, true, true, true, true, false, true, false, true, true, true, true, true, false, false, false, true, false, true], [true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, true], [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]] [[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, true], [true, false, false, true, true, false, true, true, true, false, true, false, true, true, true, true, true, false, true, true, true], [true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true], [true, false, false, false, true, true, true, true, false, true, true, false, true, false, true, false, true, true, true, false, true], [true, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, true, false, true], [true, false, true, true, true, true, true, false, true, false, true, true, true, false, true, true, true, false, true, false, true], [true, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, true, false, true], [true, false, true, false, true, true, true, false, true, true, false, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, true, false, false, false, false, false, true, false, false, false, true, false, true, false, false, false, true], [true, true, false, false, true, false, true, true, true, false, true, false, false, false, true, false, true, false, true, true, true], [true, false, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true], [true, false, false, true, true, true, true, false, true, true, true, false, true, false, true, true, true, false, true, false, true], [true, false, true, false, false, false, false, false, true, false, false, false, true, false, false, false, true, false, true, false, true], [true, true, false, false, true, true, true, true, true, false, true, false, true, true, true, false, true, false, true, false, true], [true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, true, false, true, false, true], [true, false, false, true, true, false, true, false, true, false, true, false, false, false, true, true, false, true, true, false, true], [true, false, true, false, false, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, true], [true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, false, true, false, true, true, true], [true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true], [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]]

8
maze.py

@ -1,4 +1,5 @@
# DFS: Depth First Search # DFS: Depth First Search
import tkinter.filedialog as fd
import random import random
import tkinter as tk import tkinter as tk
import json import json
@ -74,7 +75,8 @@ class MazeGenerator:
y = random.randint(1, self.height - 2) y = random.randint(1, self.height - 2)
self.maze[x][y] = False self.maze[x][y] = False
self.draw_maze() self.draw_maze()
with open('maze.json', 'w') as json_file: filename = fd.asksaveasfilename(defaultextension=".json")
with open(filename, 'w') as json_file:
json.dump(self.maze, json_file) json.dump(self.maze, json_file)
@ -99,5 +101,7 @@ class MazeGenerator:
self.window.mainloop() self.window.mainloop()
# Crea e avvia il generatore di labirinti # Crea e avvia il generatore di labirinti
generator = MazeGenerator(20, 20) width = input("Inserisci la larghezza del labirinto: ")
height = input("Inserisci l'altezza del labirinto: ")
generator = MazeGenerator(int(width), int(height))
generator.run() generator.run()

1
moh.json

File diff suppressed because one or more lines are too long

1
patan.json

@ -0,0 +1 @@
[[true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], [true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, true, false, true], [true, true, true, false, true, false, true, false, true, false, false, true, true, true, true, false, true, false, true, false, true], [true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, true], [true, false, true, false, true, false, true, true, true, false, true, false, true, true, true, true, true, true, true, false, true], [true, false, true, false, true, false, true, false, false, false, true, false, false, false, true, false, false, false, false, false, true], [true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, false, true], [true, false, false, false, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, false, true], [true, true, true, false, true, true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true], [true, false, false, false, false, false, false, false, true, false, true, false, true, false, true, false, false, false, false, false, true], [true, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true], [true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, true, false, false, true, true, false, true, true, true, false, true], [true, false, true, false, false, false, true, false, true, false, true, false, false, false, true, false, false, false, true, false, true], [true, false, true, false, true, true, false, false, true, false, true, true, true, false, true, true, true, false, true, false, true], [true, false, true, false, true, false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, true], [true, false, true, false, true, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, true], [true, false, true, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, true], [true, false, true, true, true, false, true, false, true, false, false, true, false, true, true, false, true, false, true, false, true], [true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, true], [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]]

1
solver.py

@ -70,6 +70,5 @@ class MazeSolver:
self.window.mainloop() self.window.mainloop()
# Create and run the maze solver # Create and run the maze solver
#Breadth-First Search, BFS
solver = MazeSolver('maze.json') solver = MazeSolver('maze.json')
solver.run() solver.run()
Loading…
Cancel
Save