Projekt_Si/classes/agent.py

102 lines
4.4 KiB
Python

import pygame
from collections import deque
import prefs
class Agent:
def __init__(self, x, y, cells, baseScore=0):
self.sprite = pygame.image.load("sprites/BartenderNew64.png").convert_alpha()
self.sprite = pygame.transform.scale(self.sprite, (prefs.CELL_SIZE, prefs.CELL_SIZE))
self.current_cell = cells[x][y]
self.moved=False
self.last_move_time = pygame.time.get_ticks()
self.last_interact_time = pygame.time.get_ticks()
self.last_update_time = pygame.time.get_ticks()
self.cells = cells
self.score = baseScore
self.multiplier = 1
self.x = x
self.y = y
def move_up(self):
if pygame.time.get_ticks()-self.last_move_time > 125 and self.current_cell.Y > 0 and not self.cells[self.current_cell.X][self.current_cell.Y-1].blocking_movement:
self.current_cell = self.cells[self.current_cell.X][self.current_cell.Y-1]
self.moved=True
self.last_move_time=pygame.time.get_ticks()
def move_down(self):
if pygame.time.get_ticks()-self.last_move_time > 125 and self.current_cell.Y < prefs.GRID_SIZE-1 and not self.cells[self.current_cell.X][self.current_cell.Y+1].blocking_movement:
self.current_cell = self.cells[self.current_cell.X][self.current_cell.Y+1]
self.moved=True
self.last_move_time=pygame.time.get_ticks()
def move_left(self):
if pygame.time.get_ticks()-self.last_move_time > 125 and self.current_cell.X > 0 and not self.cells[self.current_cell.X-1][self.current_cell.Y].blocking_movement:
self.current_cell = self.cells[self.current_cell.X-1][self.current_cell.Y]
self.moved=True
self.last_move_time=pygame.time.get_ticks()
def move_right(self):
if pygame.time.get_ticks()-self.last_move_time > 125 and self.current_cell.X < prefs.GRID_SIZE-1 and not self.cells[self.current_cell.X+1][self.current_cell.Y].blocking_movement:
self.current_cell = self.cells[self.current_cell.X+1][self.current_cell.Y]
self.moved=True
self.last_move_time=pygame.time.get_ticks()
def update(self, surface):
surface.blit(self.sprite, (self.current_cell.X * prefs.CELL_SIZE,
self.current_cell.Y * prefs.CELL_SIZE))
current_update_time = pygame.time.get_ticks()
# różnca czasu między wyoływaniami, używa do uniezależnienia od ilości wywołań funkcji
delta_time = ((current_update_time - self.last_update_time)/1000)
self.increase_multiplier(-(1 / 16) * delta_time)
self.last_update_time = current_update_time
def increase_score(self, amount):
self.score += amount * round(self.multiplier,2)
print("Agent score changed from {} to {} (multiplied by {}!)".format(self.score - amount, self.score, round(self.multiplier,2)))
def increase_multiplier(self, amount):
self.multiplier += amount
if self.multiplier > 2:
self.multiplier = 2
print("Agent score changed from {} to {}".format(self.multiplier , self.multiplier + amount if self.multiplier + amount <= 2 else 2))
return
if self.multiplier < 1:
self.multiplier = 1
def shortest_path(grid, start, end):
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
rows, cols = len(grid), len(grid[0])
# Funkcja pomocnicza sprawdzająca, czy dany punkt znajduje się na siatce
def is_valid(x, y):
return 0 <= x < rows and 0 <= y < cols and grid[x][y] == 0
# Inicjalizujemy kolejkę BFS i odwiedzone punkty
queue = deque([(start, 0)]) # (punkt, odległość)
visited = set()
# Rozpoczynamy BFS
while queue:
(x, y), distance = queue.popleft()
# Sprawdzamy, czy osiągnęliśmy punkt docelowy
if (x, y) == end:
return distance
# Sprawdzamy wszystkie możliwe kierunki ruchu
for dx, dy in directions:
nx, ny = x + dx, y + dy
# Sprawdzamy czy nowa pozycja jest ważna i nieodwiedzona
if is_valid(nx, ny) and (nx, ny) not in visited:
visited.add((nx, ny))
queue.append(((nx, ny), distance + 1))
# Jeśli nie udało się osiągnąć punktu docelowego, zwracamy -1
return -1