From b1450df77c496170046cf97e1e0661aa77942776 Mon Sep 17 00:00:00 2001 From: s475275 Date: Sun, 26 Mar 2023 19:44:34 +0200 Subject: [PATCH] =?UTF-8?q?Podzia=C5=82=20na=20pliki,=20jednostki=20dom?= =?UTF-8?q?=C3=B3w=20i=20wysypiska,=20klasa=20agenta,=20nowe=20tilesy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/map.txt | 27 +++--- res/tiles.png | Bin 1413 -> 15800 bytes src/agent.py | 6 ++ src/main.py | 196 ++------------------------------------ src/simulation.py | 237 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 263 insertions(+), 203 deletions(-) create mode 100644 src/agent.py create mode 100644 src/simulation.py diff --git a/res/map.txt b/res/map.txt index 795a6cf..232d116 100644 --- a/res/map.txt +++ b/res/map.txt @@ -1,13 +1,14 @@ -LRRRRRRRRRRRRRRRRR---R--- ----R------R------R---RRR- ----R------R------R---R--- -RRRR------RRRRRRRRRRRR--- -R--R-------------R------- -R--RRRRRRRRRRRRRRRH------ -R--R---R---R-----R------- -R--R---R---R-----RRRRRRR- -R--R-------------R------- -R--R-----R----R--R------- -R--R-----R----R--R------- -RRRRRRRRRRRRRRRRRRRRRRR-- -------------------------- \ No newline at end of file +MP------------------------ +ORRRRRRRRRRRRRRRRRR---R--- +SZ--R------R------R---RRR- +----R------R------R---R--- +-RRRR------RRRRRRRRRRRR--- +-R--R-------------R------- +-R--RRRRRRRRRRRRRRRH------ +-R--R---R---RH----R------- +-R--R---R---RH----RRRRRRR- +-R--R-------H-----R------- +-R--R-----R----R--R------- +-R--R-----R----R--R------- +-RRRRRRRRRRRRRRRRRRRRRRR-- +-------------------------- \ No newline at end of file diff --git a/res/tiles.png b/res/tiles.png index bebcfc0011a6d07252ac243042f20fbb62a70aec..8ff64a6750d2528ee5f081b16891a1b99c7f1e43 100644 GIT binary patch literal 15800 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 self.state.world_limits.x: - move_valid = False - if proposed_pos.y < 0 or proposed_pos.y >= self.state.world_limits.y: - move_valid = False - - if move_valid: - self.position = proposed_pos - - -class SimulationState: - def __init__(self): - self.landfill_pos = [] - self.roads_pos = [] - self.houses_pos = [] - - map_path = Path("../res/map.txt") - with open(map_path, "r") as map_file: - map_data = map_file.readlines() - max_x = len(map_data[0].replace('\n', '')) - max_y = len(map_data) - for y in range(0, max_y): - for x in range(0, max_x): - tile = map_data[y].replace('\n', '')[x] - - if tile == "L": - self.landfill_pos.append(pg.Vector2(x, y)) - if tile == "R": - self.roads_pos.append(pg.Vector2(x, y)) - if tile == "H": - self.houses_pos.append(pg.Vector2(x, y)) - self.world_limits = pg.Vector2(max_x, max_y) - - self.entities = [Agent(self, self.landfill_pos[0], pg.Vector2(2, 0))] - - def update(self, move_agent): - for entity in self.entities: - entity.move(move_agent) - - -class Layer: - def __init__(self, sim, texture_file): - self.sim = sim - self.texture_atlas = pg.image.load(texture_file) - - def renderTile(self, surface, position, tile): - # pozycja na ekranie - sprite_pos = position.elementwise() * self.sim.cell_size - - # tekstura - pos_in_atlas = tile.elementwise() * self.sim.cell_size - texture = pg.Rect(int(pos_in_atlas.x), - int(pos_in_atlas.y), - self.sim.cell_size.x, - self.sim.cell_size.y) - - # render - surface.blit(self.texture_atlas, sprite_pos, texture) - - def render(self, surface): - raise NotImplementedError() - - -class EntityLayer(Layer): - def __init__(self, sim, texture_file, simulation_state, entities): - super().__init__(sim, texture_file) - self.simulation_state = simulation_state - self.entities = entities - - def render(self, surface): - for entity in self.entities: - self.renderTile(surface, entity.position, entity.tile) - - -class StructureLayer(Layer): - def __init__(self, sim, texture_file, simulation_state, structures_pos, tile): - super().__init__(sim, texture_file) - self.simulation_state = simulation_state - self.structures_pos = structures_pos - self.tile = tile - - def render(self, surface): - for position in self.structures_pos: - self.renderTile(surface, position, self.tile) - - -class Interface: - def __init__(self): - pg.init() - - # stan symulacji - self.simulation_state = SimulationState() - self.move_agent = pg.Vector2(0, 0) - - # rendering - self.cell_size = pg.Vector2(64, 64) - texture_file = Path("../res/tiles.png") - self.layers = [StructureLayer(self, texture_file, self.simulation_state, self.simulation_state.landfill_pos, pg.Vector2(3, 0)), - StructureLayer(self, texture_file, self.simulation_state, self.simulation_state.roads_pos, pg.Vector2(0, 0)), - StructureLayer(self, texture_file, self.simulation_state, self.simulation_state.houses_pos, pg.Vector2(1, 0)), - EntityLayer(self, texture_file, self.simulation_state, self.simulation_state.entities)] - - # okno - pg.display.set_caption("Inteligentna śmieciarka") - window_size = self.simulation_state.world_limits.elementwise() * self.cell_size - self.window = pg.display.set_mode((int(window_size.x), int(window_size.y))) - self.simulation_state.world_limits.elementwise() * self.cell_size - - # dla pętli - self.clock = pg.time.Clock() - self.run_simulation = True - - self.debug_mode = False - - def processUserInput(self): - self.move_agent = pg.Vector2(0, 0) - - for event in pg.event.get(): - if event.type == pg.QUIT: - self.run_simulation = False - break - elif event.type == pg.KEYDOWN: - if event.key == pg.K_ESCAPE: - self.run_simulation = False - break - if event.key == pg.K_BACKQUOTE: - self.debug_mode = not self.debug_mode - - if self.debug_mode: - if event.key == pg.K_RIGHT: - self.move_agent.x = 1 - if event.key == pg.K_LEFT: - self.move_agent.x = -1 - if event.key == pg.K_DOWN: - self.move_agent.y = 1 - if event.key == pg.K_UP: - self.move_agent.y = -1 - - def processSimulationInput(self): - moves = [pg.Vector2(-1, 0), pg.Vector2(1, 0), pg.Vector2(0, -1), pg.Vector2(0, 1)] - - self.move_agent = moves[randint(0,3)] - - def update(self): - self.simulation_state.update(self.move_agent) - - def render(self): - if not self.debug_mode: - self.window.fill((8, 68, 0)) - else: - self.window.fill((68, 8, 0)) - - for layer in self.layers: - layer.render(self.window) - - pg.display.update() - - def loop(self): - while self.run_simulation: - self.processUserInput() - if not self.debug_mode: - self.processSimulationInput() - self.update() - self.render() - self.clock.tick(24) - pg.quit() - - -simulation = Interface() -simulation.loop() +if __name__ == "__main__": + agent = Agent() + simulation = Interface(agent) + simulation.loop() diff --git a/src/simulation.py b/src/simulation.py new file mode 100644 index 0000000..4318ccf --- /dev/null +++ b/src/simulation.py @@ -0,0 +1,237 @@ +from pathlib import Path +import pygame as pg +from random import randint + +ROAD_SPRITE = pg.Vector2(0, 0) + +HOUSE_WITHOUT_TRASH_SPRITE = pg.Vector2(1, 0) +HOUSE_WITH_TRASH_SPRITE = pg.Vector2(1, 1) +HOUSE_SPRITES = {0: HOUSE_WITHOUT_TRASH_SPRITE, + 1: HOUSE_WITH_TRASH_SPRITE} + +TRUCK_SPRITE = pg.Vector2(2, 0) + +PAPER_DUMP_SPRITE = pg.Vector2(3, 0) +PLASTIC_DUMP_SPRITE = pg.Vector2(3, 1) +GLASS_DUMP_SPRITE = pg.Vector2(3, 2) +MIXED_DUMP_SPRITE = pg.Vector2(3, 3) +DUMP_SPRITES = {'paper': PAPER_DUMP_SPRITE, + 'glass': GLASS_DUMP_SPRITE, + 'plastic': PLASTIC_DUMP_SPRITE, + 'mixed': MIXED_DUMP_SPRITE} + + +class Entity: + def __init__(self, state, position): + self.state = state + self.position = position + + +class TruckEntity(Entity): + def __init__(self, state, position): + super().__init__(state, position) + self.tile = TRUCK_SPRITE + + def move(self, move_vector): + proposed_pos = self.position + move_vector + move_valid = True + + if proposed_pos not in self.state.roads_pos: + move_valid = False + if proposed_pos.x < 0 or proposed_pos.x >= self.state.world_limits.x: + move_valid = False + if proposed_pos.y < 0 or proposed_pos.y >= self.state.world_limits.y: + move_valid = False + + if move_valid: + self.position = proposed_pos + + +class HouseEntity(Entity): + def __init__(self, state, position): + super().__init__(state, position) + self.tile = HOUSE_SPRITES[0] + + +class DumpEntity(Entity): + def __init__(self, state, position, trash_type): + super().__init__(state, position) + self.tile = DUMP_SPRITES[trash_type] + + +class SimulationState: + def __init__(self): + self.roads_pos = [] + self.houses_pos = [] + self.entities = [] + + map_path = Path("../res/map.txt") + with open(map_path, "r") as map_file: + map_data = map_file.readlines() + max_x = len(map_data[0].replace('\n', '')) + max_y = len(map_data) + for y in range(0, max_y): + for x in range(0, max_x): + tile = map_data[y].replace('\n', '')[x] + + if tile == "O": + self.truck_origin = pg.Vector2(x, y) + self.entities.append(TruckEntity(self, self.truck_origin)) + self.roads_pos.append(pg.Vector2(x, y)) + if tile == "R": + self.roads_pos.append(pg.Vector2(x, y)) + if tile == "H": + self.houses_pos.append(pg.Vector2(x, y)) + self.entities.append(HouseEntity(self, pg.Vector2(x, y))) + if tile == "M": + self.paper_dump_pos = pg.Vector2(x, y) + self.entities.append(DumpEntity(self, pg.Vector2(x, y), 'paper')) + if tile == "P": + self.plastic_dump_pos = pg.Vector2(x, y) + self.entities.append(DumpEntity(self, pg.Vector2(x, y), 'plastic')) + if tile == "S": + self.glass_dump_pos = pg.Vector2(x, y) + self.entities.append(DumpEntity(self, pg.Vector2(x, y), 'glass')) + if tile == "Z": + self.mixed_dump_pos = pg.Vector2(x, y) + self.entities.append(DumpEntity(self, pg.Vector2(x, y), 'mixed')) + + self.world_limits = pg.Vector2(max_x, max_y) + + def update(self, move_agent): + for entity in self.entities: + if entity.__class__ is TruckEntity: + entity.move(move_agent) + break + + +class Layer: + def __init__(self, sim, texture_file): + self.sim = sim + self.texture_atlas = pg.image.load(texture_file) + + def renderTile(self, surface, position, tile): + # pozycja na ekranie + sprite_pos = position.elementwise() * self.sim.cell_size + + # tekstura + pos_in_atlas = tile.elementwise() * self.sim.cell_size + texture = pg.Rect(int(pos_in_atlas.x), + int(pos_in_atlas.y), + self.sim.cell_size.x, + self.sim.cell_size.y) + + # render + surface.blit(self.texture_atlas, sprite_pos, texture) + + def render(self, surface): + raise NotImplementedError() + + +class EntityLayer(Layer): + def __init__(self, sim, texture_file, simulation_state, entities): + super().__init__(sim, texture_file) + self.simulation_state = simulation_state + self.entities = entities + + def render(self, surface): + for entity in self.entities: + self.renderTile(surface, entity.position, entity.tile) + + +class StructureLayer(Layer): + def __init__(self, sim, texture_file, simulation_state, structures_pos, tile): + super().__init__(sim, texture_file) + self.simulation_state = simulation_state + self.structures_pos = structures_pos + self.tile = tile + + def render(self, surface): + for position in self.structures_pos: + self.renderTile(surface, position, self.tile) + + +class Interface: + def __init__(self, agent): + pg.init() + + # autonomiczny agent + self.agent = agent + + # stan symulacji + self.simulation_state = SimulationState() + self.move_agent = pg.Vector2(0, 0) + + # rendering + self.cell_size = pg.Vector2(64, 64) + texture_file = Path("../res/tiles.png") + self.layers = [StructureLayer(self, texture_file, self.simulation_state, + self.simulation_state.roads_pos, ROAD_SPRITE), + EntityLayer(self, texture_file, self.simulation_state, + self.simulation_state.entities)] + + # okno + pg.display.set_caption("Inteligentna śmieciarka") + window_size = self.simulation_state.world_limits.elementwise() * self.cell_size + self.window = pg.display.set_mode((int(window_size.x), int(window_size.y))) + self.simulation_state.world_limits.elementwise() * self.cell_size + + # dla pętli + self.clock = pg.time.Clock() + self.run_simulation = True + + self.debug_mode = False + + def processUserInput(self): + self.move_agent = pg.Vector2(0, 0) + + for event in pg.event.get(): + if event.type == pg.QUIT: + self.run_simulation = False + break + elif event.type == pg.KEYDOWN: + if event.key == pg.K_ESCAPE: + self.run_simulation = False + break + if event.key == pg.K_BACKQUOTE: + self.debug_mode = not self.debug_mode + + if self.debug_mode: + if event.key == pg.K_RIGHT: + self.move_agent.x = 1 + if event.key == pg.K_LEFT: + self.move_agent.x = -1 + if event.key == pg.K_DOWN: + self.move_agent.y = 1 + if event.key == pg.K_UP: + self.move_agent.y = -1 + + def processAgentInput(self): + moves = [pg.Vector2(-1, 0), pg.Vector2(1, 0), pg.Vector2(0, -1), pg.Vector2(0, 1)] + + self.move_agent = moves[randint(0, 3)] + + def update(self): + self.simulation_state.update(self.move_agent) + + def render(self): + if not self.debug_mode: + self.window.fill((89, 183, 53)) + else: + self.window.fill((180, 32, 42)) + + for layer in self.layers: + layer.render(self.window) + + pg.display.update() + + def loop(self): + self.agent.inform(set()) + while self.run_simulation: + self.processUserInput() + if not self.debug_mode: + self.processAgentInput() + self.update() + self.render() + self.clock.tick(24) + pg.quit()