125 lines
4.1 KiB
Python
125 lines
4.1 KiB
Python
import random
|
|
import pygame
|
|
import sys
|
|
import sys
|
|
sys.path.append('./Animals')
|
|
|
|
from animals import create_animals, draw_Animals
|
|
from agent import Agent
|
|
from enclosure import create_enclosures, draw_enclosures, draw_gates
|
|
from spawner import Spawner
|
|
from state_space_search import graphsearch, generate_cost_map
|
|
from terrain_obstacle import create_obstacles, draw_Terrain_Obstacles
|
|
from constants import Constants, init_pygame
|
|
from draw import draw_goal, draw_grid, draw_house
|
|
from season import draw_background, draw_season
|
|
|
|
const = Constants()
|
|
init_pygame(const)
|
|
pygame.display.set_caption("Mini Zoo")
|
|
|
|
obstacles = set()
|
|
animals_position = set()
|
|
terrain_obstacles_position = set()
|
|
|
|
Animals = create_animals()
|
|
Enclosures = create_enclosures()
|
|
Terrain_Obstacles = create_obstacles()
|
|
|
|
def spawn_all_animals():
|
|
for Animal in Animals:
|
|
spawner1 = Spawner(Animal)
|
|
spawner1.spawn_animal(obstacles, animals_position, Enclosures)
|
|
|
|
def spawn_obstacles():
|
|
for terrain_obstacle in Terrain_Obstacles:
|
|
spawner2 = Spawner(terrain_obstacle)
|
|
spawner2.spawn_terrain_obstacles(obstacles, animals_position, terrain_obstacles_position, const.GRID_WIDTH, const.GRID_HEIGHT)
|
|
|
|
def generate_obstacles():
|
|
for en in Enclosures:
|
|
# Pobierz współrzędne bramy
|
|
gate_x, gate_y = en.gate1
|
|
gate_x -= 1
|
|
gate_y -= 1
|
|
|
|
gate_x2, gate_y2 = en.gate2
|
|
gate_x2 -= 1
|
|
gate_y2 -= 1
|
|
|
|
# Dodaj lewy brzeg prostokąta
|
|
for y in range(en.y1, en.y2 + 1):
|
|
if (en.x1, y) != (gate_x, gate_y) and (en.x1, y) != (gate_x2, gate_y2):
|
|
obstacles.add((en.x1, y))
|
|
|
|
# Dodaj prawy brzeg prostokąta
|
|
for y in range(en.y1, en.y2 + 1):
|
|
if (en.x2, y) != (gate_x, gate_y) and (en.x2, y) != (gate_x2, gate_y2):
|
|
obstacles.add((en.x2, y))
|
|
|
|
# Dodaj górny brzeg prostokąta
|
|
for x in range(en.x1+1, en.x2):
|
|
if (x, en.y1) != (gate_x, gate_y) and (x, en.y1) != (gate_x2, gate_y2):
|
|
obstacles.add((x, en.y1))
|
|
|
|
# Dodaj dolny brzeg prostokąta
|
|
for x in range(en.x1+1, en.x2):
|
|
if (x, en.y2) != (gate_x, gate_y) and (x, en.y2) != (gate_x2, gate_y2):
|
|
obstacles.add((x, en.y2))
|
|
|
|
return obstacles
|
|
|
|
def main():
|
|
initial_state = (0, 0, 'S')
|
|
agent = Agent(initial_state, 'images/agent1.png', const.GRID_SIZE)
|
|
|
|
obstacles = generate_obstacles()
|
|
actions = []
|
|
clock = pygame.time.Clock()
|
|
spawned = False
|
|
season = draw_season()
|
|
while True:
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
pygame.quit()
|
|
sys.exit()
|
|
agent.handle_event(event, const.GRID_WIDTH, const.GRID_HEIGHT, Animals, obstacles)
|
|
|
|
draw_background(const, season)
|
|
draw_grid(const)
|
|
draw_enclosures(Enclosures, const)
|
|
draw_gates(Enclosures, const)
|
|
draw_house(const)
|
|
|
|
if not spawned:
|
|
|
|
spawn_all_animals()
|
|
spawn_obstacles()
|
|
cost_map = generate_cost_map(Animals, Terrain_Obstacles)
|
|
for animal in Animals:
|
|
animal._feed = 3
|
|
spawned = True
|
|
|
|
draw_Animals(Animals, const)
|
|
draw_Terrain_Obstacles(Terrain_Obstacles, const)
|
|
agent.draw(const.screen, const.GRID_SIZE)
|
|
pygame.display.flip()
|
|
clock.tick(10)
|
|
|
|
if actions:
|
|
action = actions.pop(0)
|
|
agent.move(action, const.GRID_WIDTH, const.GRID_HEIGHT, obstacles, Animals, goal)
|
|
pygame.time.wait(200)
|
|
else:
|
|
if agent._food != 0:
|
|
animal = random.choice(Animals)
|
|
goal = (animal.x, animal.y)
|
|
draw_goal(const, goal)
|
|
actions = graphsearch(agent.istate, goal, const.GRID_WIDTH, const.GRID_HEIGHT, obstacles, cost_map)
|
|
else:
|
|
goal = (3,1)
|
|
draw_goal(const, goal)
|
|
actions = graphsearch(agent.istate, goal, const.GRID_WIDTH, const.GRID_HEIGHT, obstacles, cost_map)
|
|
|
|
if __name__ == "__main__":
|
|
main() |