185 lines
7.2 KiB
Python
185 lines
7.2 KiB
Python
import random
|
|
|
|
from krata import *
|
|
|
|
|
|
class Agent:
|
|
bok = BOK_AGENTA1
|
|
bokWPolach = BOK_AGENTA1_W_POLACH
|
|
|
|
def __init__(self, Krata, poleStartoweGorne, tekstura):
|
|
self.krata = Krata
|
|
self.poleStartoweGorne = poleStartoweGorne
|
|
self.tekstura = tekstura
|
|
self.okreslPolozenie()
|
|
self.obierzNowyKierunek()
|
|
self.okreslDlugoscDrogi()
|
|
Krata.agent = self
|
|
|
|
def ruszSie(self):
|
|
if self.droga <= 0:
|
|
self.obierzNowyKierunek()
|
|
self.okreslDlugoscDrogi()
|
|
self.zrobKrokWMoimKierunku()
|
|
self.droga -= 1
|
|
self.okreslPolozenie()
|
|
if self.wyszedlemPozaKrate() or self.wszedlemWSciane():
|
|
self.cofnijSie()
|
|
self.zawroc()
|
|
self.okreslDlugoscDrogi()
|
|
|
|
def obierzNowyKierunek(self):
|
|
self.kierunek = Kierunek(random.randint(0, 3))
|
|
if self.maxDlugoscDrogiWMoimKierunku() < 1:
|
|
self.obierzNowyKierunek()
|
|
|
|
def okreslDlugoscDrogi(self):
|
|
self.droga = random.randint(1, self.maxDlugoscDrogiWMoimKierunku())
|
|
|
|
def cofnijSie(self):
|
|
self.zrobKrokWOdwrotnymKierunku()
|
|
self.okreslPolozenie()
|
|
|
|
def okreslPolozenie(self):
|
|
self.okreslPoleKoncoweDolne()
|
|
self.okreslHitbox()
|
|
|
|
def okreslHitbox(self):
|
|
self.hitbox = pygame.Rect(self.poleStartoweGorne.start, self.poleStartoweGorne.gora, self.bok, self.bok)
|
|
|
|
def okreslPoleKoncoweDolne(self):
|
|
wiersz = self.poleStartoweGorne.wiersz + self.bokWPolach - 1
|
|
kolumna = self.poleStartoweGorne.kolumna + self.bokWPolach - 1
|
|
self.poleKoncoweDolne = PoleKraty(self.krata, wiersz, kolumna)
|
|
|
|
def wyszedlemPozaKrate(self):
|
|
if self.poleStartoweGorne.wiersz < 0:
|
|
return True
|
|
elif self.poleKoncoweDolne.wiersz > self.krata.liczbaPolPionowo - 1:
|
|
return True
|
|
elif self.poleStartoweGorne.kolumna < 0:
|
|
return True
|
|
elif self.poleKoncoweDolne.kolumna > self.krata.liczbaPolPoziomo - 1:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
# ZROBIC sciany
|
|
def wszedlemWSciane(self):
|
|
for wiersz in range (self.poleStartoweGorne.wiersz,self.poleKoncoweDolne.wiersz+1):
|
|
for kolumna in range(self.poleStartoweGorne.kolumna,self.poleKoncoweDolne.kolumna+1):
|
|
if self.krata.krata[wiersz][kolumna]==ZawartoscPola.SCIANA:
|
|
return True
|
|
return False
|
|
|
|
def zawroc(self):
|
|
if self.kierunek == Kierunek.GORA:
|
|
self.kierunek = Kierunek.DOL
|
|
elif self.kierunek == Kierunek.DOL:
|
|
self.kierunek = Kierunek.GORA
|
|
elif self.kierunek == Kierunek.LEWO:
|
|
self.kierunek = Kierunek.PRAWO
|
|
elif self.kierunek == Kierunek.PRAWO:
|
|
self.kierunek = Kierunek.LEWO
|
|
|
|
def maxDlugoscDrogiWMoimKierunku(self):
|
|
if self.kierunek == Kierunek.GORA:
|
|
return self.poleStartoweGorne.wiersz
|
|
elif self.kierunek == Kierunek.DOL:
|
|
return self.krata.liczbaPolPionowo - self.poleKoncoweDolne.wiersz - 1
|
|
elif self.kierunek == Kierunek.LEWO:
|
|
return self.poleStartoweGorne.kolumna
|
|
elif self.kierunek == Kierunek.PRAWO:
|
|
return self.krata.liczbaPolPoziomo - self.poleKoncoweDolne.kolumna - 1
|
|
|
|
def zrobKrokWMoimKierunku(self):
|
|
if self.kierunek == Kierunek.GORA:
|
|
self.idzWGore()
|
|
elif self.kierunek == Kierunek.DOL:
|
|
self.idzWDol()
|
|
elif self.kierunek == Kierunek.LEWO:
|
|
self.idzWLewo()
|
|
elif self.kierunek == Kierunek.PRAWO:
|
|
self.idzWPrawo()
|
|
|
|
def zrobKrokWOdwrotnymKierunku(self):
|
|
if self.kierunek == Kierunek.GORA:
|
|
self.idzWDol()
|
|
elif self.kierunek == Kierunek.DOL:
|
|
self.idzWGore()
|
|
elif self.kierunek == Kierunek.LEWO:
|
|
self.idzWPrawo()
|
|
elif self.kierunek == Kierunek.PRAWO:
|
|
self.idzWLewo()
|
|
|
|
def idzWGore(self):
|
|
self.poleStartoweGorne.wiersz -= 1
|
|
|
|
def idzWDol(self):
|
|
self.poleStartoweGorne.wiersz += 1
|
|
|
|
def idzWLewo(self):
|
|
self.poleStartoweGorne.kolumna -= 1
|
|
|
|
def idzWPrawo(self):
|
|
self.poleStartoweGorne.kolumna += 1
|
|
|
|
#def bfs(self, start:PoleKraty, cel:PoleKraty):
|
|
# sciezka = [start]
|
|
# wierzcholek_sciezka = [start, sciezka]
|
|
# bfs_kolejka = [wierzcholek_sciezka]
|
|
# odwiedzone = set()
|
|
# while bfs_kolejka:
|
|
# aktualne, sciezka = bfs_kolejka.pop(0)
|
|
# odwiedzone.add(aktualne)
|
|
# for neighbor in graph[aktualne]:
|
|
# if neighbor not in odwiedzone:
|
|
# if neighbor is cel:
|
|
# return sciezka + [neighbor]
|
|
# else:
|
|
# bfs_kolejka.append([neighbor, sciezka + [neighbor]])
|
|
def bfs2(self, start: PoleKraty, cel: PoleKraty):
|
|
#sciezka = []
|
|
wierzcholek_sciezka = [["start",start], [["start",start]]]
|
|
bfs_kolejka = [wierzcholek_sciezka]
|
|
odwiedzone = set()
|
|
while bfs_kolejka:
|
|
#sciezka = []
|
|
elem=bfs_kolejka.pop(0)
|
|
odwA=str(elem[0][1].wiersz)+"/"+str(elem[0][1].kolumna)
|
|
odwiedzone.add(odwA)
|
|
polaObok=self.succ(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(self, poleKraty: PoleKraty):
|
|
polaDostepneObok=list()
|
|
if poleKraty.kolumna-1>=0: #nie poza kratę
|
|
if self.krata.krata[poleKraty.wiersz][poleKraty.kolumna-1]!=ZawartoscPola.SCIANA: #nie szafka (szafka to ściana)
|
|
poleLewe=PoleKraty(self.krata, poleKraty.wiersz, poleKraty.kolumna-1)
|
|
naLewo=["Kierunek.LEWO", poleLewe]
|
|
polaDostepneObok.append(naLewo)
|
|
if poleKraty.wiersz - 1>= 0: # nie poza kratę
|
|
if self.krata.krata[poleKraty.wiersz-1][poleKraty.kolumna] != ZawartoscPola.SCIANA:
|
|
poleGorne = PoleKraty(self.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 self.krata.krata[poleKraty.wiersz][poleKraty.kolumna+1]!=ZawartoscPola.SCIANA:
|
|
polePrawe=PoleKraty(self.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 self.krata.krata[poleKraty.wiersz+1][poleKraty.kolumna] != ZawartoscPola.SCIANA:
|
|
poleDolne = PoleKraty(self.krata, poleKraty.wiersz+1, poleKraty.kolumna)
|
|
naDol = ["Kierunek.DOL", poleDolne]
|
|
polaDostepneObok.append(naDol)
|
|
return polaDostepneObok |