Potniki

Podan je razred Potnik.

class Potnik: def __init__(self, energija): self.x = self.y = 0 self.__energija = energija def pojdi(self, smer, razdalja): x0, y0 = self.x, self.y self.premik(smer, razdalja) self.__energija += 5 * (x0 * self.x < 0) + (y0 * self.y < 0) def porabi(self, energija): if self.__energija < energija: return False self.__energija -= energija return True

Potniki začenjajo svojo pot na koordinatah (0, 0) in imajo določeno količino energije. Nato hodijo naokrog tako, da kličemo metodo pojdi, ki ji kot argument podamo smer in razdaljo; na kakšen način ju podajamo, boste videli spodaj. Vsaka prehojena enota razdalje potniku vzame eno enoto energije; vsakič ko prečka os x ali os y, dobi 5 enot energije. (Koti in koordinate so obrnjene tako kot v matematiki - pi/2 kaže navzgor, to je, v smeri osi y).

Metoda pojdi deluje tako, da pokliče metodo premik(smer, razdalja). Ta še ni napisana - napisati jo boste morali sami. Poleg tega pojdi preveri, ali je potnik ob tem premiku prečkal os x ali y in poveča energijo.

Metoda porabi preveri, ali ima potnik še dovolj energije, da prehodi določeno razdaljo. Če je nima, vrne False; če jo ima, vrne True in zmanjša potnikovo energijo. Potnik mora imeti pred odhodom na pot dovolj energije za celo pot; če bi na poti slučajno dobil energijo, ker bo prestopil os, to ne šteje.

Razreda Potnik ne smete spreminjati.

Iz razreda Potnik boste izpeljali tri razrede. Vsi trije bodo imeli (poleg podedovanih) le eno metodo, namreč premik. Metoda premik mora primerno klicati Potnikovo metodo porabi.

Vaša metoda premik mora sprejeti argumente v primerni obliki, izračunati razdaljo, ki naj bi jo potnik prehodil, s klicem metod porabi odšteti energijo in, če porabi ne vrne False (kar bi pomenilo, da potnik nima dovolj energije), potnika dejansko prestaviti na nove koordinate, tako da spremeni self.x in self.y.

Vaša metoda premik naj ne uporablja (direktno) atributa __energija (dva podčrtaja na začetku sta dogovorjeni znak za "pusti pri miru!"), temveč naj z energijo dela le prek metode porabi.

Orto se premika le orgotonalno, se pravi, na jug, sever, vzhod in zahod. Njegova metoda premik(smer, razdalja) naj pričakuje, da bo smer eden izmed nizov "S", "J", "V" ali "Z", razdalja pa pač razdalja, ki naj jo prehodi v tej smeri.

OrtoPlus pozna poleg tega še smeri "SV", "SZ", "JV" in "JZ". Pomen argumenta razdalja je takšen: če pokličemo pojdi("SV", 1), bo šel potnik za eno enoto na sever in za eno na vzhod - potuje naravnost, torej po diagonali. Skupaj bo torej prepotoval (približno) 1.41 enote, torej ga bo to stalo tudi toliko energije.

Liberalec dobi smer podano kot kot (v radianih), razdalja pa je razdalja, ki jo bo naredil v tej smeri.

Dodatna naloga

Razrede v obvezni nalogi smo zastavili nekoliko nerodno. Kot ste najbrž opazili, ste v vseh metodah premik pisali podobne stvari. Tule je boljši osnovni razred; poimenovali smo ga Potnik2. Napiši razrede Orto2, OrtoPlus2, Liberalec2, ki so izpeljani iz razreda Potnik2, vedejo pa se enako kot njihovi soimenjaki brez dvojk.

Kako deluje lepše zasnovani Potnik2 in kaj mora početi njihova metoda premik, pa razberi sam(a) - tudi to je del naloge.

class Potnik2: def __init__(self, energija): self.x = self.y = 0 self.__energija = energija def pojdi(self, smer, razdalja): dx, dy = self.premik(smer, razdalja) if not self.porabi(sqrt(dx ** 2 + dy ** 2)): return x0, y0 = self.x, self.y self.x += dx self.y += dy self.__energija += 5 * (x0 * self.x < 0) + (y0 * self.y < 0) def porabi(self, energija): if self.__energija < energija: return False self.__energija -= energija return True
Zadnja sprememba: sreda, 31 maj 2023, 09:42