JFO_lab_skrzyzowanie/stan_nastepnik.py

100 lines
3.0 KiB
Python

from krata import *
class Akcja(Enum):
OBROT_W_LEWO = 0
OBROT_W_PRAWO = 1
KROK_W_PRZOD = 2
class Stan:
def __init__(self, kierunek: Kierunek, poleStartoweGorne: PoleKraty):
self.kierunek = kierunek
self.poleStartoweGorne = poleStartoweGorne
def skopiuj(self):
return Stan(self.kierunek, self.poleStartoweGorne.skopiuj())
class Nastepnik:
def __init__(self, akcja: Akcja or None, stan: Stan, poprzednik):
self.akcja = akcja
self.stan = stan
self._poprzednik = poprzednik
def getPoprzednik(self):
return self._poprzednik
def setPoprzednik(self, x):
raise Exception
poprzednik = property(getPoprzednik, setPoprzednik)
def skopiuj(self):
return Nastepnik(self.akcja, self.stan.skopiuj(), self.poprzednik)
def nastepnik_obrotu_w_lewo(nastepnik: Nastepnik):
akcja = Akcja.OBROT_W_LEWO
stan = Stan(nastepnik.stan.kierunek.kierunekNaLewo(), nastepnik.stan.poleStartoweGorne)
return Nastepnik(akcja, stan, nastepnik)
def nastepnik_obrotu_w_prawo(nastepnik: Nastepnik):
akcja = Akcja.OBROT_W_PRAWO
stan = Stan(nastepnik.stan.kierunek.kierunekNaPrawo(), nastepnik.stan.poleStartoweGorne)
return Nastepnik(akcja, stan, nastepnik)
def nastepnik_kroku_w_przod(nastepnik: Nastepnik):
akcja = Akcja.KROK_W_PRZOD
stan = Stan(nastepnik.stan.kierunek, nastepnik.stan.poleStartoweGorne)
if stan.kierunek == Kierunek.POLNOC:
stan.poleStartoweGorne.wiersz -= 1
elif stan.kierunek == Kierunek.POLUDNIE:
stan.poleStartoweGorne.wiersz += 1
elif stan.kierunek == Kierunek.ZACHOD:
stan.poleStartoweGorne.kolumna -= 1
elif stan.kierunek == Kierunek.WSCHOD:
stan.poleStartoweGorne.kolumna += 1
return Nastepnik(akcja, stan, nastepnik)
def pole_w_granicach_kraty(pole: PoleKraty):
if pole.wiersz not in range(0, pole.krata.liczbaPolPionowo):
return False
elif pole.kolumna not in range(0, pole.krata.liczbaPolPoziomo):
return False
else:
return True
def mozna_wjechac_na_pole(pole: PoleKraty):
if pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.SCIANA and pole.krata.krata[pole.wiersz][
pole.kolumna] != ZawartoscPola.SCIANA2 and pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.OSOBA:
return True
else:
return False
def mozna_zrobic_krok_w_przod(nastepnik: Nastepnik):
nastepnik = nastepnik_kroku_w_przod(nastepnik)
if pole_w_granicach_kraty(nastepnik.stan.poleStartoweGorne) and mozna_wjechac_na_pole(
nastepnik.stan.poleStartoweGorne):
return True
else:
return False
def succ(nastepnik: Nastepnik):
wynik = []
pom = nastepnik.skopiuj()
wynik.append(nastepnik_obrotu_w_lewo(pom))
pom = nastepnik.skopiuj()
wynik.append(nastepnik_obrotu_w_prawo(pom))
pom = nastepnik.skopiuj()
if mozna_zrobic_krok_w_przod(pom):
pom = nastepnik.skopiuj()
wynik.append(nastepnik_kroku_w_przod(pom))
return wynik