diff --git a/domain/__init__.py b/domain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/domain/entity.py b/domain/entity.py new file mode 100644 index 0000000..54f0223 --- /dev/null +++ b/domain/entity.py @@ -0,0 +1,5 @@ +class Entity: + def __init__(self, x: int, y: int, type: str): + self.x = x + self.y = y + self.type = type diff --git a/domain/vacuum.py b/domain/vacuum.py new file mode 100644 index 0000000..338f154 --- /dev/null +++ b/domain/vacuum.py @@ -0,0 +1,8 @@ +from domain.entity import Entity + + +class Vacuum(Entity): + def __init__(self, x: int, y: int): + super().__init__(x, y, 'VACUUM') + self.battery = 100 + # TODO add more properties diff --git a/domain/world.py b/domain/world.py new file mode 100644 index 0000000..22f64f7 --- /dev/null +++ b/domain/world.py @@ -0,0 +1,19 @@ +from domain.entity import Entity +from domain.vacuum import Vacuum + + +class World: + def __init__(self, width: int, height: int): + self.width = width + self.height = height + self.grid = [ + [[] for j in range(height)] for i in range(width) + ] + self.entities = [] + + self.cleaner = Vacuum(0, 0) + self.add(self.cleaner) + + def add(self, entity: Entity): + self.entities.append(entity) + self.grid[entity.x][entity.y].append(entity) diff --git a/media/sprites/peel.webp b/media/sprites/peel.webp new file mode 100644 index 0000000..b654972 Binary files /dev/null and b/media/sprites/peel.webp differ diff --git a/media/sprites/tile.jpeg b/media/sprites/tile.jpeg new file mode 100644 index 0000000..b3243aa Binary files /dev/null and b/media/sprites/tile.jpeg differ diff --git a/media/sprites/tile_cropped.jpeg b/media/sprites/tile_cropped.jpeg new file mode 100644 index 0000000..36d67ea Binary files /dev/null and b/media/sprites/tile_cropped.jpeg differ diff --git a/media/sprites/vacuum.png b/media/sprites/vacuum.png new file mode 100644 index 0000000..977e72c Binary files /dev/null and b/media/sprites/vacuum.png differ diff --git a/media/sprites/wall.png b/media/sprites/wall.png new file mode 100644 index 0000000..f9560c6 Binary files /dev/null and b/media/sprites/wall.png differ diff --git a/view/user_interface.py b/view/user_interface.py new file mode 100644 index 0000000..f6a2cc7 --- /dev/null +++ b/view/user_interface.py @@ -0,0 +1,112 @@ +from random import randint + +import pygame +from pygame import Color + +from domain.world import World, Entity + + +class UserInterface: + + def __init__( + self, + width=800, + height=800, + tiles_x=10, + tiles_y=10, + ): + self.width = width + self.height = height + + self.tiles_x = tiles_x + self.tiles_y = tiles_y + + self.tile_width = self.width / self.tiles_x + self.tile_height = self.height / self.tiles_y + + self.world = World(tiles_x, tiles_y) + for _ in range(10): + temp_x = randint(0, tiles_x - 1) + temp_y = randint(0, tiles_y - 1) + self.world.add(Entity(temp_x, temp_y, 'PEEL')) + + pygame.init() + + pygame.display.set_caption('AI Vacuum Cleaner') + self.screen = pygame.display.set_mode((self.width, self.height)) + + self.sprites = { + 'VACUUM': pygame.transform.scale(pygame.image.load('../media/sprites/vacuum.png'), + (self.tile_width, self.tile_height)), + 'WALL': pygame.transform.scale(pygame.image.load('../media/sprites/wall.png'), + (self.tile_width, self.tile_height)), + 'TILE': pygame.transform.scale(pygame.image.load('../media/sprites/tile_cropped.jpeg'), + (self.tile_width, self.tile_height)), + 'PEEL': pygame.transform.scale(pygame.image.load('../media/sprites/peel.webp'), + (self.tile_width, self.tile_height)), + } + + self.clock = pygame.time.Clock() + self.running = True + self.fps = 60 + + def process_input(self): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + self.running = False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT and self.world.cleaner.x > 0: + self.world.cleaner.x -= 1 + if event.key == pygame.K_RIGHT and self.world.cleaner.x < self.tiles_x - 1: + self.world.cleaner.x += 1 + if event.key == pygame.K_UP and self.world.cleaner.y > 0: + self.world.cleaner.y -= 1 + if event.key == pygame.K_DOWN and self.world.cleaner.y < self.tiles_y - 1: + self.world.cleaner.y += 1 + + def update(self): + pass + + def render(self): + self.render_floor() + self.render_board() + for entity in self.world.entities: + self.draw_sprite(entity.x, entity.y, entity.type) + self.draw_sprite(self.world.cleaner.x, self.world.cleaner.y, self.world.cleaner.type) + pygame.display.update() + + def run(self): + while self.running: + self.process_input() + self.update() + self.render() + self.clock.tick(self.fps) + + pygame.quit() + + def line(self, x_1, y_1, x_2, y_2, color=None): + pygame.draw.line(self.screen, color, (x_1, y_1), (x_2, y_2)) + + def render_board(self, color=Color('black')): + for i in range(1, self.tiles_x): + self.line(self.tile_width * i, 0, self.tile_width * i, self.height, color=color) + + for i in range(1, self.tiles_y): + self.line(0, self.tile_height * i, self.width, self.tile_height * i, color=color) + + def draw_sprite(self, x, y, sprite): + self.screen.blit( + self.sprites[sprite], + (x * self.tile_width, y * self.tile_height) + ) + + def fill_grid_with_sprite(self, sprite): + for tile_x in range(self.tiles_x): + for tile_y in range(self.tiles_y): + self.draw_sprite(tile_x, tile_y, sprite) + + def render_floor(self): + self.fill_grid_with_sprite('TILE') + + +UserInterface(800, 800, 10, 10).run()