Browse Source

Refactor code to improve knight movement and update maze configuration

tk
Matteo Benedetto 2 years ago
parent
commit
91dca9c094
  1. 86
      Units/knight.py
  2. 11
      main.py
  3. 2
      maze.json

86
Units/knight.py

@ -1,8 +1,5 @@
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
@ -24,81 +21,42 @@ class Knight:
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)
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
# Remove any neighbors that are not walkable # Remove any neighbors that are not walkable
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]
old_distance_from_target = self.engine.get_distance(self.destination,self.target)
old_distance_from_start = self.engine.get_distance(self.destination,self.starting_position)
for cell_visited in self.visited:
if cell_visited in neighbors_list:
neighbors_list.remove(cell_visited)
#self.visited = self.visited[-2:]
self.position = self.destination self.position = self.destination
self.visited.append(self.position)
for cell in neighbors_list:
self.engine.effects.append(OrderClick(self.engine.iso_transform(*cell),color="lightblue"))
for cell in self.visited:
self.engine.effects.append(OrderClick(self.engine.iso_transform(*cell),color="red"))
if not neighbors_list:
print("No neighbors")
#neighbors_list.append(self.visited)
#self.target = self.position
self.destination = None
else:
self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target) self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target)
new_distance_from_target = self.engine.get_distance(self.destination,self.target)
new_distance_from_start = self.engine.get_distance(self.destination,self.starting_position)
if new_distance_from_target >= old_distance_from_target or new_distance_from_start < old_distance_from_start:
print(f"{time.time()} - No progress")
new_neighbors_list = []
for neighbor in neighbors_list:
neighbor_neighbors_list = self.engine.find_neighbors(neighbor)
for neighbor_neighbor in neighbor_neighbors_list:
# consider only the neighbors of the neighbors that are walkable
if not self.engine.battlefield[neighbor_neighbor[1]][neighbor_neighbor[0]].walkable:
if neighbor_neighbor not in self.visited:
# if the neighbor of the neighbor is not walkable and has not been visited, add it to the list of visited cells
new_neighbors_list.append(neighbor)
break
# scegli uhn vicino casualmente come destinaziione
self.destination = new_neighbors_list[random.randint(0,len(new_neighbors_list)-1)]
if self.destination:
self.engine.effects.append(OrderClick(self.engine.iso_transform(*self.destination),color="purple"))
self.partial_move = 0 self.partial_move = 0
if self.position != self.target: print(self.partial_move)
self.direction = self.engine.get_direction(self.position,self.destination)
else:
print("No destination")
self.visited = [self.position]
self.destination = self.position
#self.target = self.position
self.engine.effects.append(OrderClick(self.engine.iso_transform(*self.destination),color="brown"))
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'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):
self.speed = .05
self.target = target
self.state = "Walk"
def run_to(self, target):
self.speed = .15
self.target = target
self.state = "Run"

11
main.py

@ -253,16 +253,11 @@ 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.starting_position = self.knight.position self.knight.run_to((cell_x, cell_y))
self.knight.target = (cell_x,cell_y)
self.knight.state = "Walk"
def run(self): def run(self):
self.draw_battlefield() self.draw_battlefield()
@ -273,7 +268,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):

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, true, true, 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]]
Loading…
Cancel
Save