2023-05-06 18:06:30 +02:00
|
|
|
from grid import GridCellType
|
2023-04-26 18:59:38 +02:00
|
|
|
|
2023-04-20 20:54:58 +02:00
|
|
|
class Stan:
|
|
|
|
def __init__(self, x, y, kierunek):
|
|
|
|
self.x = x
|
|
|
|
self.y = y
|
|
|
|
self.kierunek = kierunek
|
|
|
|
|
2023-04-26 18:59:38 +02:00
|
|
|
|
2023-04-20 20:54:58 +02:00
|
|
|
class Wezel:
|
2023-05-06 13:53:01 +02:00
|
|
|
def __init__(self, stan, rodzic):
|
2023-04-20 20:54:58 +02:00
|
|
|
self.stan = stan
|
2023-05-06 13:53:01 +02:00
|
|
|
self.rodzic = rodzic
|
2023-04-20 20:54:58 +02:00
|
|
|
|
2023-05-06 18:06:30 +02:00
|
|
|
def nastepnik(wezel, licznik, search_grid):
|
2023-04-26 18:59:38 +02:00
|
|
|
# gora -> prawo -> dol -> lewo | obrot w prawo
|
2023-04-20 20:54:58 +02:00
|
|
|
# gora -> lewo -> dol -> prawo | obrot w lewo
|
|
|
|
# 0 gora 1 prawo 2 dol 3 lewo
|
2023-05-06 13:53:01 +02:00
|
|
|
x = wezel.stan.x
|
|
|
|
y = wezel.stan.y
|
|
|
|
obrot_w_prawo = Wezel(Stan(x, y, (wezel.stan.kierunek + 1) % 4), licznik)
|
|
|
|
obrot_w_lewo = Wezel(Stan(x, y, 3 if wezel.stan.kierunek == 0 else wezel.stan.kierunek - 1), licznik)
|
2023-04-20 20:54:58 +02:00
|
|
|
|
|
|
|
if wezel.stan.kierunek == 0:
|
2023-05-06 13:53:01 +02:00
|
|
|
y -= 70
|
2023-04-20 20:54:58 +02:00
|
|
|
elif wezel.stan.kierunek == 1:
|
2023-05-06 13:53:01 +02:00
|
|
|
x += 70
|
2023-04-20 20:54:58 +02:00
|
|
|
elif wezel.stan.kierunek == 2:
|
2023-05-06 13:53:01 +02:00
|
|
|
y += 70
|
2023-04-20 20:54:58 +02:00
|
|
|
elif wezel.stan.kierunek == 3:
|
2023-05-06 13:53:01 +02:00
|
|
|
x -= 70
|
2023-04-20 20:54:58 +02:00
|
|
|
|
|
|
|
wezly = [obrot_w_prawo, obrot_w_lewo]
|
2023-05-06 13:53:01 +02:00
|
|
|
ruch_w_przod = Wezel(Stan(x, y, wezel.stan.kierunek), licznik)
|
2023-04-20 20:54:58 +02:00
|
|
|
|
|
|
|
# sprawdzenie czy nie wyjdzie poza plansze
|
2023-05-06 13:53:01 +02:00
|
|
|
if 0 <= x <= 910 and 0 <= y <= 910:
|
2023-05-06 18:06:30 +02:00
|
|
|
x1 = x / 70
|
|
|
|
y1 = y / 70
|
|
|
|
if search_grid.grid[(x1,y1)] is GridCellType.FREE:
|
|
|
|
wezly.append(ruch_w_przod)
|
2023-04-20 20:54:58 +02:00
|
|
|
|
|
|
|
return wezly
|
|
|
|
|
2023-05-06 18:06:30 +02:00
|
|
|
def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy, search_grid):
|
2023-05-06 13:53:01 +02:00
|
|
|
pierwszy_wezel = Wezel(stan_poczatkowy, 0)
|
2023-04-20 20:54:58 +02:00
|
|
|
fringe = [pierwszy_wezel]
|
2023-05-06 13:53:01 +02:00
|
|
|
odwiedzone = [pierwszy_wezel]
|
|
|
|
licznik = 0
|
|
|
|
global mapa
|
|
|
|
mapa = dict()
|
2023-04-20 20:54:58 +02:00
|
|
|
while fringe:
|
|
|
|
wezel = fringe.pop(0)
|
2023-05-06 13:53:01 +02:00
|
|
|
licznik = licznik + 1
|
|
|
|
mapa[licznik] = wezel
|
2023-04-20 20:54:58 +02:00
|
|
|
if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y:
|
2023-05-06 13:53:01 +02:00
|
|
|
return wezel
|
2023-05-06 18:06:30 +02:00
|
|
|
lista1 = nastepnik(wezel, licznik, search_grid)
|
2023-05-06 13:53:01 +02:00
|
|
|
for obecny_wezel in lista1:
|
|
|
|
flag_juz_odwiedzony = 0
|
|
|
|
for odwiedzony_wezel in odwiedzone:
|
|
|
|
# sprawdzenie czy odwiedzilismy juz ten stan
|
|
|
|
if odwiedzony_wezel.stan.x == obecny_wezel.stan.x and odwiedzony_wezel.stan.y == obecny_wezel.stan.y\
|
|
|
|
and odwiedzony_wezel.stan.kierunek == obecny_wezel.stan.kierunek:
|
|
|
|
flag_juz_odwiedzony = 1
|
2023-04-26 18:59:38 +02:00
|
|
|
break
|
2023-05-06 13:53:01 +02:00
|
|
|
if flag_juz_odwiedzony == 1:
|
2023-04-26 18:59:38 +02:00
|
|
|
continue
|
|
|
|
else:
|
2023-05-06 13:53:01 +02:00
|
|
|
fringe.append(obecny_wezel)
|
|
|
|
odwiedzone.append(obecny_wezel)
|
|
|
|
return pierwszy_wezel
|
|
|
|
def znajdz_sciezke(wezel):
|
|
|
|
sciezka = [wezel]
|
|
|
|
index = wezel.rodzic
|
|
|
|
while index != 0:
|
|
|
|
wezel = mapa[index]
|
|
|
|
sciezka.append(wezel)
|
|
|
|
index = wezel.rodzic
|
|
|
|
sc = list(reversed(sciezka))
|
|
|
|
return sc
|