diff --git a/main/src/__pycache__/bfs.cpython-38.pyc b/main/src/__pycache__/bfs.cpython-38.pyc new file mode 100644 index 0000000..94d45fc Binary files /dev/null and b/main/src/__pycache__/bfs.cpython-38.pyc differ diff --git a/main/src/__pycache__/bfs.cpython-39.pyc b/main/src/__pycache__/bfs.cpython-39.pyc new file mode 100644 index 0000000..6b65ee1 Binary files /dev/null and b/main/src/__pycache__/bfs.cpython-39.pyc differ diff --git a/main/src/__pycache__/settings.cpython-38.pyc b/main/src/__pycache__/settings.cpython-38.pyc index 174633b..aeffc6f 100644 Binary files a/main/src/__pycache__/settings.cpython-38.pyc and b/main/src/__pycache__/settings.cpython-38.pyc differ diff --git a/main/src/__pycache__/settings.cpython-39.pyc b/main/src/__pycache__/settings.cpython-39.pyc new file mode 100644 index 0000000..753cedf Binary files /dev/null and b/main/src/__pycache__/settings.cpython-39.pyc differ diff --git a/main/src/__pycache__/trash.cpython-38.pyc b/main/src/__pycache__/trash.cpython-38.pyc index 4292d04..69ed6e2 100644 Binary files a/main/src/__pycache__/trash.cpython-38.pyc and b/main/src/__pycache__/trash.cpython-38.pyc differ diff --git a/main/src/__pycache__/trash.cpython-39.pyc b/main/src/__pycache__/trash.cpython-39.pyc new file mode 100644 index 0000000..d706826 Binary files /dev/null and b/main/src/__pycache__/trash.cpython-39.pyc differ diff --git a/main/src/__pycache__/truck1.cpython-38.pyc b/main/src/__pycache__/truck1.cpython-38.pyc index fe5f924..edbf9a2 100644 Binary files a/main/src/__pycache__/truck1.cpython-38.pyc and b/main/src/__pycache__/truck1.cpython-38.pyc differ diff --git a/main/src/__pycache__/truck1.cpython-39.pyc b/main/src/__pycache__/truck1.cpython-39.pyc new file mode 100644 index 0000000..4e95f86 Binary files /dev/null and b/main/src/__pycache__/truck1.cpython-39.pyc differ diff --git a/main/src/__pycache__/walls.cpython-38.pyc b/main/src/__pycache__/walls.cpython-38.pyc index 06678cc..e926528 100644 Binary files a/main/src/__pycache__/walls.cpython-38.pyc and b/main/src/__pycache__/walls.cpython-38.pyc differ diff --git a/main/src/__pycache__/walls.cpython-39.pyc b/main/src/__pycache__/walls.cpython-39.pyc new file mode 100644 index 0000000..d928995 Binary files /dev/null and b/main/src/__pycache__/walls.cpython-39.pyc differ diff --git a/main/src/bfs.py b/main/src/bfs.py new file mode 100644 index 0000000..3a17379 --- /dev/null +++ b/main/src/bfs.py @@ -0,0 +1,75 @@ +import pygame as pg +import sys +from os import path +from collections import deque +from time import sleep + + +def bfs(): + class Map: + def __init__(self, x, y, state): + self.x = x + self.y = y + self.pos = [self.x, self.y] + self.nodes = [] + self.prev = None + self.wall = False if state not in ('b', 'w') else True + self.visited = False + + def add_nodes(self, arr): + if self.x < len(map_raw)-1: + self.nodes.append(arr[self.x+1][self.y]) + if self.x > 0: + self.nodes.append(arr[self.x-1][self.y]) + if self.y < len(map_raw[0])-1: + self.nodes.append(arr[self.x][self.y+1]) + if self.y > 0: + self.nodes.append(arr[self.x][self.y-1]) + + def __str__(self): + return f'{self.x}, {self.y}' + + game_path = path.join(path.dirname(__file__), 'map.txt') + + map_raw = [line.strip() for line in open(game_path, 'rt')] + map_arr = [] + queue = deque() + bfs_path = [] + + truck = [0, 0] + trash = [0, 0] + + for x in range(len(map_raw)): + temp = [] + for y in range(len(map_raw[0])): + temp.append(Map(x, y, map_raw[x][y])) + if map_raw[x][y] == 'P': + truck = temp[-1] + if map_raw[x][y] == 't': + trash = temp[-1] + map_arr.append(temp) + + for x in range(len(map_raw)): + for y in range(len(map_raw[0])): + map_arr[x][y].add_nodes(map_arr) + + queue.append(truck) + + while True: + if len(queue) > 0: + cur_node = queue.popleft() + cur_node.visited = True + if cur_node == trash: + temp = cur_node + while temp.prev: + bfs_path.append(temp.prev) + temp = temp.prev + break + else: + for node in cur_node.nodes: + if not node.visited and not node.wall: + node.visited = True + node.prev = cur_node + queue.append(node) + + return [node.pos for node in bfs_path[:-1]] diff --git a/main/src/img/bg.png b/main/src/img/bg.png new file mode 100644 index 0000000..c5f9eb8 Binary files /dev/null and b/main/src/img/bg.png differ diff --git a/main/src/img/truck — kopia.png b/main/src/img/truck — kopia.png new file mode 100644 index 0000000..7860105 Binary files /dev/null and b/main/src/img/truck — kopia.png differ diff --git a/main/src/img/truck.png b/main/src/img/truck.png index 7860105..317ffa8 100644 Binary files a/main/src/img/truck.png and b/main/src/img/truck.png differ diff --git a/main/src/main.py b/main/src/main.py index 8497f93..d9b6876 100644 --- a/main/src/main.py +++ b/main/src/main.py @@ -6,6 +6,7 @@ from truck1 import * from walls import * from settings import * + class Game: def __init__(self): pg.init() @@ -20,7 +21,8 @@ class Game: self.map_data = [] with open(path.join(game_folder, 'map.txt'), 'rt') as f: for line in f: - self.map_data.append(line) + self.map_data.append(line.strip()) + print(line.strip()) def new(self): self.all_sprites = pg.sprite.Group() @@ -32,7 +34,7 @@ class Game: if tile == 'b': Wall(self, col, row) if tile == 'w': - Wall1(self, col,row) + Wall1(self, col, row) if tile == 'P': garbageTruck(self, col, row) if tile == 't': @@ -55,7 +57,7 @@ class Game: def draw(self): bg = pg.image.load("img\\bg.png") - self.screen.blit(bg,(0,0)) + self.screen.blit(bg, (0, 0)) self.screen.fill(BGCOLOR) self.all_sprites.draw(self.screen) pg.display.flip() @@ -75,10 +77,10 @@ class Game: def show_go_screen(self): pass + g = Game() g.show_start_screen() while True: g.new() g.run() g.show_go_screen() - diff --git a/main/src/map.txt b/main/src/map.txt index a3b6600..379e3fe 100644 --- a/main/src/map.txt +++ b/main/src/map.txt @@ -1,18 +1,18 @@ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbb bbb bbb bb bb b bb -b t w b -b w w b -b wwwwww wwwww bbb -bbb w w w w b -b w t w b -b wwwww wwwwwww t bb -b wwwwww w w b -b t w w www wwww bbbb -b w w w b -b wwwww www www w b -b w P ww w b -b t b +b w b +b w t w b +b wwwwww wwwww bbb +bbb w w w w b +b w w b +b wwwww wwwwwww bb +b wwwwww w w b +b w w www wwww bbbb +b w w w b +b wwwww www www w b +b w ww w b +b P b b w www w www w ww b -b w wwww bb -b bbbb b b bb t b +b w wwww bb +b bbbb b b bb b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb \ No newline at end of file diff --git a/main/src/trash.py b/main/src/trash.py index 888432c..47ac7d6 100644 --- a/main/src/trash.py +++ b/main/src/trash.py @@ -1,6 +1,8 @@ import random import pygame as pg -from settings import * +from settings import TILESIZE + + class Trash(pg.sprite.Sprite): def __init__(self, game, x, y): image = pg.image.load("img\\trash.png") @@ -10,23 +12,24 @@ class Trash(pg.sprite.Sprite): self.game = game self.image = pg.Surface((TILESIZE, TILESIZE)) self.rect = self.image.get_rect() - self.image.blit(image,(0,0)) + self.image.blit(image, (0, 0)) self.x = x self.y = y self.rect.x = x * TILESIZE self.rect.y = y * TILESIZE - self.position = (x,y) + self.position = (x, y) self.randomize_position() def randomize_position(self): - self.position = (random.randint(0, 32-1)*40, random.randint(0, 18-1)*40) + self.position = (random.randint(0, 32-1)*40, + random.randint(0, 18-1)*40) def collected(self): hits = pg.sprite.spritecollide(self, self.game.player, False) if hits: - self.image.blit(image1,(0,0)) - self.x=0 - self.y=0 + self.image.blit(image1, (0, 0)) + self.x = 0 + self.y = 0 def update(self): self.collected() diff --git a/main/src/truck1.py b/main/src/truck1.py index 1c63dcf..62ec9c6 100644 --- a/main/src/truck1.py +++ b/main/src/truck1.py @@ -1,62 +1,63 @@ import pygame as pg -from settings import * +from settings import TILESIZE, TRUCK_SPEED +from bfs import bfs +from time import sleep + + class garbageTruck(pg.sprite.Sprite): def __init__(self, game, x, y): - image = pg.image.load("img\\truck.png") + self.og_image = pg.image.load("img\\truck.png") self.groups = game.all_sprites, game.player pg.sprite.Sprite.__init__(self, self.groups) self.game = game self.image = pg.Surface((TILESIZE, TILESIZE)) - self.image.blit(image,(0,0)) + self.image.blit(self.og_image, (0, 0)) self.rect = self.image.get_rect() - self.vx, self.vy = 0, 0 + self.vx = 0 + self.vy = 0 self.x = x * TILESIZE self.y = y * TILESIZE self.capacity = 0 - self.max_capacity=3000 - self.position=[((self.x),(self.y))] - self.direction=0 + self.max_capacity = 3000 + self.position = [self.x, self.y] + self.directions = [-1, 1, 1, -1] # góra prawo dół lewo + self.d = 1 + self.turned = False + self.bfs_path = bfs() def get_position(self): - return self.position[0] + return [self.x, self.y] - def turn(self): - if self.direction==0: - self.direction=1 - else: - self.direction=0 + def turn(self, d): + self.og_image = pg.transform.rotate( + self.og_image, 90*d*-1) + self.image.blit(self.og_image, (0, 0)) + self.d = (self.d+d) % 4 - def move(self, r): - if self.direction==0: - self.vx=(TRUCK_SPEED*r) + def move(self): + if self.d in [1, 3]: + self.vx = (TRUCK_SPEED*self.directions[self.d]) else: - self.vy=(TRUCK_SPEED*r) + self.vy = (TRUCK_SPEED*self.directions[self.d]) def throw(self): - self.capacity=0 + self.capacity = 0 def get_keys(self): self.vx, self.vy = 0, 0 keys = pg.key.get_pressed() - if keys[pg.K_LEFT] or keys[pg.K_a]: - if self.direction == 0: - self.move(-1) - else: self.turn() - if keys[pg.K_RIGHT] or keys[pg.K_d]: - if self.direction == 0: - self.move(1) - else: self.turn() + if not self.turned and (keys[pg.K_LEFT] or keys[pg.K_a]): + self.turn(-1) + self.turned = True + if not self.turned and (keys[pg.K_RIGHT] or keys[pg.K_d]): + self.turn(1) + self.turned = True + if not (keys[pg.K_RIGHT] or keys[pg.K_d] or keys[pg.K_LEFT] or keys[pg.K_a]) and self.turned: + self.turned = False if keys[pg.K_UP] or keys[pg.K_w]: - if self.direction == 1: - self.move(-1) - else: self.turn() - if keys[pg.K_DOWN] or keys[pg.K_s]: - if self.direction == 1: - self.move(1) - else: self.turn() - if self.vx != 0 and self.vy != 0: - self.vx *= 1 - self.vy *= 1 + self.move() + if keys[pg.K_g] and len(self.bfs_path) != 0: + self.navigate_bfs() def collide_with_walls(self, dir): if dir == 'x': @@ -98,6 +99,33 @@ class garbageTruck(pg.sprite.Sprite): self.vy = 0 self.rect.y = self.y + def auto_drive(self, direction): + while self.d != direction: + self.turn(1) + + if direction in [1, 3]: + self.x += self.directions[self.d] * TILESIZE + else: + self.y += self.directions[self.d] * TILESIZE + + def navigate_bfs(self): + print(self.bfs_path) + dest = self.bfs_path.pop() + dest[0], dest[1] = dest[1]*TILESIZE, dest[0]*TILESIZE + + pos = [int(i) for i in self.get_position()] + print(pos[0] - dest[0], pos[1] - dest[1]) + + if pos[0] - dest[0] < 0: + self.auto_drive(1) + elif pos[0] - dest[0] > 0: + self.auto_drive(3) + + if pos[1] - dest[1] < 0: + self.auto_drive(2) + elif pos[1] - dest[1] > 0: + self.auto_drive(0) + def update(self): self.get_keys() self.x += self.vx * self.game.dt diff --git a/main/src/walls.py b/main/src/walls.py index 968c72f..8293db9 100644 --- a/main/src/walls.py +++ b/main/src/walls.py @@ -1,5 +1,6 @@ import pygame as pg -from settings import * +from settings import TILESIZE + class Wall(pg.sprite.Sprite): def __init__(self, game, x, y): @@ -9,12 +10,13 @@ class Wall(pg.sprite.Sprite): self.game = game self.image = pg.Surface((TILESIZE, TILESIZE)) self.rect = self.image.get_rect() - self.image.blit(image,(0,0)) + self.image.blit(image, (0, 0)) self.x = x self.y = y self.rect.x = x * TILESIZE self.rect.y = y * TILESIZE + class Wall1(pg.sprite.Sprite): def __init__(self, game, x, y): image = pg.image.load("img\\house.png") @@ -23,7 +25,7 @@ class Wall1(pg.sprite.Sprite): self.game = game self.image = pg.Surface((TILESIZE, TILESIZE)) self.rect = self.image.get_rect() - self.image.blit(image,(-1,-1)) + self.image.blit(image, (-1, -1)) self.x = x self.y = y self.rect.x = x * TILESIZE