modified the bfs search - prints path

This commit is contained in:
s473561 2023-04-20 23:16:34 +02:00
parent ea49df80bd
commit 2a3e6b006a
10 changed files with 72 additions and 74 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

109
main.py
View File

@ -3,7 +3,8 @@ import pygame
import regal import regal
import paczka import paczka
from wozek import Wozek from wozek import Wozek
import wyszukiwanie from wyszukiwanie import wyszukiwanie_bfs, Stan, SearchSpace
pygame.init() pygame.init()
screen = pygame.display.set_mode((980, 980)) screen = pygame.display.set_mode((980, 980))
@ -22,75 +23,65 @@ def main():
sys.exit(0) sys.exit(0)
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
sys.exit(0) sys.exit(0)
grid = SearchSpace()
# create start and goal states
start_state = Stan(x=0, y=0, kierunek=0) # for example
goal_state = Stan(x=0, y=1, kierunek=0) # for example
if event.type == pygame.MOUSEBUTTONDOWN: # perform BFS search
# lewy przycisk myszy path = wyszukiwanie_bfs(start_state, goal_state, grid)
if event.button == 1:
x = pygame.mouse.get_pos()[0]
y = pygame.mouse.get_pos()[1]
docelowy_stan = wyszukiwanie.Stan(x, y, 0) # print the path, if found
# print(f'{docelowy_stan.x} + {docelowy_stan.y}') if path:
wyszukiwanie.wyszukiwanie_bfs(wozek.obecnyStan, docelowy_stan) for p in path:
print(p.x, p.y)
print("Path found:", path)
else:
print("No path found.")
if event.type == pygame.KEYDOWN: for state in path:
if event.key == pygame.K_DOWN: pygame.time.delay(200)
wozek.y_change = 1 wozek.x = state.x
if event.key == pygame.K_UP: wozek.y = state.y
wozek.y_change = -1 for event in pygame.event.get():
if event.key == pygame.K_RIGHT: if event.type == pygame.QUIT:
wozek.x_change = 1 sys.exit(0)
if event.key == pygame.K_LEFT: if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
wozek.x_change = -1 sys.exit(0)
if event.type == pygame.KEYUP:
if event.key == pygame.K_DOWN or event.key == pygame.K_UP:
wozek.y_change = 0
if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
wozek.x_change = 0
wozek.x += wozek.x_change # Drawing
wozek.y += wozek.y_change screen.fill((51,51,51)) # removes object trail
screen.blit(miejsce, (430, 400))
if wozek.x <= 0: # idRegału, Długość regału podana w kratkach, Współrzędne od których ma być tworzony regał (wiersz,kolumna) - poziomo
wozek.x = 0 # Współrzędne od (1,1) do (10,10)
elif wozek.x >= 916: regal.Regal(1, 1, 2, 2)
wozek.x = 916 regal.Regal(2, 1, 2, 3)
if wozek.y <= 0: regal.Regal(3, 1, 3, 2)
wozek.y = 0 regal.Regal(4, 1, 3, 3)
elif wozek.x >= 916:
wozek.x = 916 regal.Regal(5, 1, 8, 2)
regal.Regal(6, 1, 8, 3)
regal.Regal(7, 1, 9, 2)
regal.Regal(8, 1, 9, 3)
# Drawing regal.Regal(9, 1, 2, 8)
screen.fill((51, 51, 51)) # removes object trail regal.Regal(10, 1, 2, 9)
screen.blit(miejsce, (430, 400)) regal.Regal(11, 1, 3, 8)
regal.Regal(12, 1, 3, 9)
# idRegału, Długość regału podana w kratkach, Współrzędne od których ma być tworzony regał (wiersz,kolumna) - poziomo regal.Regal(13, 1, 8, 8)
# Współrzędne od (1,1) do (10,10) regal.Regal(14, 1, 8, 9)
regal.Regal(1, 1, 2, 2) regal.Regal(15, 1, 9, 8)
regal.Regal(2, 1, 2, 3) regal.Regal(16, 1, 9, 9)
regal.Regal(3, 1, 3, 2)
regal.Regal(4, 1, 3, 3)
regal.Regal(5, 1, 8, 2) wozek.draw()
regal.Regal(6, 1, 8, 3)
regal.Regal(7, 1, 9, 2)
regal.Regal(8, 1, 9, 3)
regal.Regal(9, 1, 2, 8) pygame.display.flip() # updating frames
regal.Regal(10, 1, 2, 9)
regal.Regal(11, 1, 3, 8)
regal.Regal(12, 1, 3, 9)
regal.Regal(13, 1, 8, 8)
regal.Regal(14, 1, 8, 9)
regal.Regal(15, 1, 9, 8)
regal.Regal(16, 1, 9, 9)
wozek.draw()
pygame.display.flip() # updating frames
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -1,7 +1,5 @@
import pygame import pygame
# screen nie działa # screen nie działa
class Wozek(): class Wozek():
@ -51,7 +49,8 @@ class Wozek():
def __zainicjuj_stan_poczatkowy(self): def __zainicjuj_stan_poczatkowy(self):
from wyszukiwanie import Stan from wyszukiwanie import Stan
self.obecnyStan = Stan(55, 55, 3) # self.obecnyStan = Stan(55, 55, 3)
self.obecnyStan = Stan(0, 0, 3)
# def ustaw_wozek_w_kierunku(self, kierunek): # def ustaw_wozek_w_kierunku(self, kierunek):
# TODO # TODO

View File

@ -1,17 +1,25 @@
class SearchSpace:
def __init__(self):
self.grid = [['1']*10 for _ in range(10)] # create a 10x10 grid of cells
for r, c in [(2,2), (2,3), (3,2), (3,3), (8,2), (8,3), (9,2), (9,3),
(2,8), (2,9), (3,8), (3,9), (8,8), (8,9), (9,8), (9,9)]:
self.grid[r][c] = 'X' # set the cells with a shelf to not passable
def is_passable(self, x, y):
return 0 <= x < 10 and 0 <= y < 10 and self.grid[y][x] != 'X'
class Stan: class Stan:
def __init__(self, x, y, kierunek): def __init__(self, x, y, kierunek):
self.x = x self.x = x
self.y = y self.y = y
self.kierunek = kierunek self.kierunek = kierunek
class Wezel: class Wezel:
def __init__(self, stan): def __init__(self, stan):
self.stan = stan self.stan = stan
def poprzednik(wezel, search_space):
def poprzednik(wezel): # gora -> prawo -> dol -> lewo | obrot w prawo
# gora -> prawo -> dol -> lewo | obrot w prawo
# gora -> lewo -> dol -> prawo | obrot w lewo # gora -> lewo -> dol -> prawo | obrot w lewo
# 0 gora 1 prawo 2 dol 3 lewo # 0 gora 1 prawo 2 dol 3 lewo
y = wezel.stan.x y = wezel.stan.x
@ -37,23 +45,23 @@ def poprzednik(wezel):
return wezly return wezly
def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy, search_space):
def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy):
pierwszy_wezel = Wezel(stan_poczatkowy) pierwszy_wezel = Wezel(stan_poczatkowy)
fringe = [pierwszy_wezel] fringe = [pierwszy_wezel]
odwiedzone = list() odwiedzone = set()
while fringe: while fringe:
# kolejka
wezel = fringe.pop(0) wezel = fringe.pop(0)
if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y: if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y:
return odwiedzone return odwiedzone
odwiedzone.append(wezel) odwiedzone.add(wezel.stan)
for stan in poprzednik(wezel): for stan in poprzednik(wezel, search_space):
if wezel not in fringe and stan not in odwiedzone: if stan not in odwiedzone:
nowy_wezel = Wezel(stan) nowy_wezel = Wezel(stan)
fringe.append(nowy_wezel) fringe.append(nowy_wezel)
odwiedzone.add(stan)
return odwiedzone