From 91dca9c094e5bd58910ddbc31f267c6f9cc37d95 Mon Sep 17 00:00:00 2001 From: test Date: Fri, 16 Feb 2024 15:25:32 +0100 Subject: [PATCH] Refactor code to improve knight movement and update maze configuration --- Units/knight.py | 90 +++++++++++++------------------------------------ main.py | 11 ++---- maze.json | 2 +- 3 files changed, 28 insertions(+), 75 deletions(-) diff --git a/Units/knight.py b/Units/knight.py index d018eb9..58a6fea 100644 --- a/Units/knight.py +++ b/Units/knight.py @@ -1,8 +1,5 @@ -import tkinter as tk import os import glob -import time -import random from Effects.animated_gif import AnimatedGif from Effects.order_click import OrderClick @@ -24,81 +21,42 @@ class Knight: def ai(self): 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) if self.partial_move<1: screen_x_dest, screen_y_dest = self.engine.iso_transform(*self.destination) 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_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] - - 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.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")) + self.destination = self.engine.get_closest_neighbor(neighbors_list,self.target) + self.partial_move = 0 + print(self.partial_move) - 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) - 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 - if self.position != self.target: - 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') - return gif, screen_x, screen_y \ No newline at end of file + 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" \ No newline at end of file diff --git a/main.py b/main.py index 48ac36c..b801d5c 100644 --- a/main.py +++ b/main.py @@ -253,16 +253,11 @@ class IsometricGame: def on_canvas_rclick(self, event): # calculate the clicked cell's coordinates cell_x, cell_y = self.inv_iso_transform(event.x, event.y) - print(f'Cell clicked: ({cell_x}, {cell_y})') - x, y = self.iso_transform(cell_x, cell_y) - self.effects.append(OrderClick((x, y), color="light blue")) + self.effects.append(OrderClick(self.iso_transform(cell_x, cell_y),color="lightblue")) if self.knight.target == (cell_x, cell_y): return - if 0 <= cell_x < self.width and 0 <= cell_y < self.height: - self.knight.starting_position = self.knight.position - self.knight.target = (cell_x,cell_y) - self.knight.state = "Walk" + self.knight.run_to((cell_x, cell_y)) def run(self): self.draw_battlefield() @@ -273,7 +268,7 @@ class IsometricGame: #self.draw_battlefield() self.draw_units() 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: def __init__(self, walkable=False, tile=None, elevation=0, offset=0): diff --git a/maze.json b/maze.json index 7dee101..59b78c5 100644 --- a/maze.json +++ b/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]] \ No newline at end of file +[[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]] \ No newline at end of file