algorytm bfs z funkcją następnika, dodatkowo zmieniono wielkość i ilość pól kraty

This commit is contained in:
s464931 2022-04-04 16:28:25 +02:00
parent e4a0f19301
commit ccbb743403
4 changed files with 69 additions and 17 deletions

45
bfs.py Normal file
View File

@ -0,0 +1,45 @@
from krata import *
def bfs(Krata: Krata, start: PoleKraty, cel: PoleKraty):
wierzcholek_sciezka = [["start", start], [["start", start]]]
bfs_kolejka = [wierzcholek_sciezka]
odwiedzone = set()
while bfs_kolejka:
elem = bfs_kolejka.pop(0)
odwNowe = str(elem[0][1].wiersz) + "/" + str(elem[0][1].kolumna)
odwiedzone.add(odwNowe)
polaObok = succ(Krata,elem[0][1])
for neighbor in polaObok:
sciezka = elem[1].copy()
sprOdw = str(neighbor[1].wiersz) + "/" + str(neighbor[1].kolumna)
if sprOdw not in odwiedzone:
if neighbor[1].wiersz == cel.wiersz and neighbor[1].kolumna == cel.kolumna:
sciezka.append(neighbor)
return sciezka
else:
sciezka.append([neighbor])
bfs_kolejka.append([neighbor, sciezka])
def succ(Krata: Krata, poleKraty: PoleKraty):
polaDostepneObok = list()
if poleKraty.kolumna - 1 >= 0: # nie poza kratę
if Krata.krata[poleKraty.wiersz][poleKraty.kolumna - 1] != ZawartoscPola.SCIANA: # nie szafka (szafka to ściana)
poleLewe = PoleKraty(Krata, poleKraty.wiersz, poleKraty.kolumna - 1)
naLewo = ["Kierunek.LEWO", poleLewe]
polaDostepneObok.append(naLewo)
if poleKraty.wiersz - 1 >= 0: # nie poza kratę
if Krata.krata[poleKraty.wiersz - 1][poleKraty.kolumna] != ZawartoscPola.SCIANA:
poleGorne = PoleKraty(Krata, poleKraty.wiersz - 1, poleKraty.kolumna)
naGore = ["Kierunek.GORA", poleGorne]
polaDostepneObok.append(naGore)
if poleKraty.kolumna + 1 < LICZBA_POL_W_POZIOMIE: # nie poza kratę
if Krata.krata[poleKraty.wiersz][poleKraty.kolumna + 1] != ZawartoscPola.SCIANA:
polePrawe = PoleKraty(Krata, poleKraty.wiersz, poleKraty.kolumna + 1)
naPrawo = ["Kierunek.PRAWO", polePrawe]
polaDostepneObok.append(naPrawo)
if poleKraty.wiersz + 1 < LICZBA_POL_W_PIONIE: # nie poza kratę
if Krata.krata[poleKraty.wiersz + 1][poleKraty.kolumna] != ZawartoscPola.SCIANA:
poleDolne = PoleKraty(Krata, poleKraty.wiersz + 1, poleKraty.kolumna)
naDol = ["Kierunek.DOL", poleDolne]
polaDostepneObok.append(naDol)
return polaDostepneObok

29
main.py
View File

@ -3,11 +3,10 @@ import ctypes
from agent import * from agent import *
from ramy_czyli_wiedza_agenta import * from ramy_czyli_wiedza_agenta import *
from bfs import *
#aby działalo w oknie + rozdzielczość ekranu #aby działalo w oknie + rozdzielczość ekranu
ctypes.windll.shcore.SetProcessDpiAwareness(1) #ctypes.windll.shcore.SetProcessDpiAwareness(1)
Okno = pygame.display.set_mode((SZEROKOSC_OKNA, WYSOKOSC_OKNA)) Okno = pygame.display.set_mode((SZEROKOSC_OKNA, WYSOKOSC_OKNA))
pygame.display.set_caption("Okno1") pygame.display.set_caption("Okno1")
@ -29,15 +28,23 @@ def dodaj_szafke(numerSzafki, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, po
Pomieszczenie.dodajSzafke(szafka) Pomieszczenie.dodajSzafke(szafka)
def main(): def main():
dodaj_szafke("A", 2, 10, "L", 0, 20) #przykładowe wartości dla szafek dodaj_szafke("A", 2, 7, "P", 0, 0)
dodaj_szafke("B", 2, 10, "P", 0, 24) dodaj_szafke("B", 2, 7, "L", 0, 3)
dodaj_szafke("C", 2, 10, "L", 0, 40) dodaj_szafke("C", 2, 7, "P", 0, 4)
dodaj_szafke("D", 2, 10, "P", 0, 44) dodaj_szafke("D", 2, 7, "L", 0, 7)
dodaj_szafke("E", 2, 10, "L", 0, 60) dodaj_szafke("E", 2, 7, "P", 0, 8)
dodaj_szafke("F", 2, 10, "P", 0, 64) dodaj_szafke("F", 2, 7, "L", 0, 11)
dodaj_szafke("G", 2, 10, "L", 0, 80) dodaj_szafke("G", 2, 7, "P", 0, 12)
dodaj_szafke("H", 2, 10, "P", 0, 84) dodaj_szafke("H", 2, 7, "L", 0, 15)
dodaj_szafke("I", 2, 7, "P", 0, 16)
dodaj_szafke("J", 2, 7, "L", 0, 19)
dodaj_agenta() dodaj_agenta()
# cel to pole kraty gdzie ma stać agent, aby położyć paczkę na półkę, w obiekcie klasy Miejsce jest to artybut dostęp
cel = PoleKraty(Krata, 1, 14)
# start to pole startowe agenta, == pole_lewe_gorne
start = PoleKraty(Krata, LICZBA_POL_W_PIONIE-BOK_AGENTA1_W_POLACH, int(LICZBA_POL_W_POZIOMIE/2))
bfsList = bfs(Krata, start, cel)
klatkaz = pygame.time.Clock() klatkaz = pygame.time.Clock()
warunek_dzialania = True warunek_dzialania = True
while warunek_dzialania: while warunek_dzialania:

View File

@ -86,7 +86,7 @@ class Szafka:
miejsce = Miejsce(numerMiejsca,wymiar_miejsca, 0, 0) miejsce = Miejsce(numerMiejsca,wymiar_miejsca, 0, 0)
#wypełnianie pól "zajmowane miejsca" i "dostęp" #wypełnianie pól "zajmowane miejsca" i "dostęp"
for m in range(DUZA_SZAFA): # wiersz for m in range(DUZA_SZAFA): # wiersz
poczatek_wiersz = poczatek_wiersz1 + j * 3 + m poczatek_wiersz = poczatek_wiersz1 + j * DUZA_SZAFA + m
for n in range(DUZA_SZAFA): # kolumna for n in range(DUZA_SZAFA): # kolumna
Krata.krata[poczatek_wiersz][poczatek_kolumna + n] = ZawartoscPola.SCIANA Krata.krata[poczatek_wiersz][poczatek_kolumna + n] = ZawartoscPola.SCIANA
pole = PoleKraty(Krata, poczatek_wiersz, poczatek_kolumna+n) pole = PoleKraty(Krata, poczatek_wiersz, poczatek_kolumna+n)

View File

@ -3,17 +3,17 @@ FPS = 5
# SZEROKOSC_OKNA = 1500 # SZEROKOSC_OKNA = 1500
# WYSOKOSC_OKNA = 750 # WYSOKOSC_OKNA = 750
# #
LICZBA_POL_W_POZIOMIE = 90 LICZBA_POL_W_POZIOMIE = 20
LICZBA_POL_W_PIONIE = 50 LICZBA_POL_W_PIONIE = 12
BOK_POLA = 15 BOK_POLA = 45
ODSTEP_MIEDZY_POLAMI = 1 ODSTEP_MIEDZY_POLAMI = 1
SZEROKOSC_OKNA = LICZBA_POL_W_POZIOMIE * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) + ODSTEP_MIEDZY_POLAMI SZEROKOSC_OKNA = LICZBA_POL_W_POZIOMIE * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) + ODSTEP_MIEDZY_POLAMI
WYSOKOSC_OKNA = LICZBA_POL_W_PIONIE * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) + ODSTEP_MIEDZY_POLAMI WYSOKOSC_OKNA = LICZBA_POL_W_PIONIE * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) + ODSTEP_MIEDZY_POLAMI
# #
BOK_AGENTA1_W_POLACH = 3 BOK_AGENTA1_W_POLACH = 1
BOK_AGENTA1 = BOK_AGENTA1_W_POLACH * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) - ODSTEP_MIEDZY_POLAMI BOK_AGENTA1 = BOK_AGENTA1_W_POLACH * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) - ODSTEP_MIEDZY_POLAMI
# #
DUZA_SZAFA=3 DUZA_SZAFA=1
# #
BIALY = (255, 255, 255) BIALY = (255, 255, 255)
JASNOSZARY1 = (200, 200, 200) JASNOSZARY1 = (200, 200, 200)