import pygame import random from constants import Constants from state_space_search import is_border, is_obstacle from night import draw_night from decision_tree import feed_decision from constants import Constants class Agent: def __init__(self, istate, image_path, grid_size): self.istate = istate self.x, self.y, self.direction = istate self.grid_size = grid_size self.image= pygame.image.load(image_path) self.image = pygame.transform.scale(self.image, (grid_size, grid_size)) self._dryfood = 0 self._wetfood = 0 def draw(self, const): # Obróć obrazek zgodnie z kierunkiem if self.direction == 'E': self.image= pygame.image.load('images/agent4.png') elif self.direction == 'S': self.image= pygame.image.load('images/agent1.png') elif self.direction == 'W': self.image= pygame.image.load('images/agent3.png') else: # direction == 'N' self.image= pygame.image.load('images/agent2.png') self.image = pygame.transform.scale(self.image, (const.GRID_SIZE, const.GRID_SIZE)) const.screen.blit(self.image, (self.x * self.grid_size, self.y * self.grid_size)) if const.IS_NIGHT: draw_night(const) def handle_event(self, event, max_x, max_y, animals, obstacles,const): if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: self.move('Go Forward', max_x, max_y, obstacles, animals,const) elif event.key == pygame.K_LEFT: self.move('Turn Left', max_x, max_y, obstacles, animals,const) elif event.key == pygame.K_RIGHT: self.move('Turn Right', max_x, max_y, obstacles, animals,const) def move(self, action, max_x, max_y, obstacles, animals, goal,const): if action == 'Go Forward': new_x, new_y = self.x, self.y if self.direction == 'N': new_y -= 1 elif self.direction == 'E': new_x += 1 elif self.direction == 'S': new_y += 1 elif self.direction == 'W': new_x -= 1 # Sprawdź, czy nowe położenie mieści się w granicach kraty i nie jest przeszkodą if is_border(new_x, new_y, max_x, max_y) and not(is_obstacle(new_x, new_y, obstacles)): self.x, self.y = new_x, new_y elif action == 'Turn Left': self.direction = {'N': 'W', 'W': 'S', 'S': 'E', 'E': 'N'}[self.direction] elif action == 'Turn Right': self.direction = {'N': 'E', 'E': 'S', 'S': 'W', 'W': 'N'}[self.direction] self.istate = (self.x, self.y, self.direction) feed_animal(self, animals, goal,const) take_food(self) def feed_animal(self, animals, goal,const): goal_x, goal_y = goal if self.x == goal_x and self.y == goal_y: for animal in animals: if animal.x == goal_x and animal.y == goal_y: if (animal.activity == 'nocturnal' and const.IS_NIGHT) or (animal.activity == 'diurnal' and not(const.IS_NIGHT)): activity_time = True else: activity_time = False guests = random.randint(1, 15) decision = feed_decision(animal.adult, activity_time, animal.ill, const.season, guests, animal._feed, self._dryfood, self._wetfood) if decision != [1]: if decision == [2]: if animal.getting_hungry(const=Constants()) < self._wetfood : self._wetfood -= animal._feed animal._feed = 0 else: animal._feed -= self._wetfood self._wetfood = 0 print(animal.name, "fed with wet food") else: if animal.getting_hungry(const=Constants()) < self._dryfood : self._dryfood -= animal._feed animal._feed = 0 else: animal._feed -= self._dryfood self._dryfood = 0 print(animal.name, "fed with dry food") print("Current wet food level: ", self._wetfood) print("Current dry food level: ", self._dryfood) else: print(animal.name, " not fed") def take_food(self): house_x = 3 house_y = 1 if self.x == house_x and self.y == house_y: if self._dryfood < 1 or self._wetfood < 1: self._dryfood = 50 self._wetfood = 50 print("Agent took food and current food level is", self._dryfood, self._wetfood)