Kolesarski poligon
Poligon
Ocena 6 - 7
Sestavi razred Steza z naslednjimi metodami.
- Konstruktor prejme tri argumente: širino in višino kolesarske steze ter seznam s terkami ovir (y, x0, x1). Argument s širino in višino vsebuje številko zadnjega stolpca oz. vrstice kolesarske steze. Dovoljeni stolpci so torej od 1 do (vključno) širina. Vrstice so oštevilčene od zgoraj navzdol.
ovira(x, y): vrne trojko(y, x0, x1)s podatki o oviri, ki zapira to polje. Če je podano polje prosto, vrneNonedodaj_oviro(y, x0, x1)doda oviro v podano vrstico in s podanim začetkom in koncem.odstrani_oviro(y, x0, x1)odstrani oviro. Predpostaviti smeš, da ovira s takšnimi podatki dejansko obstaja.sprosti_polje(x, y)odstrani oviro, ki zapira podano polje. Predpostaviti smeš, da je polje dejansko zaprto. Metoda naj primerno uporabi metodiovirainsprosti_polje!konec(x, y, smer)prejme koordinati nekega polja (na katerem ni ovire) in smer, ki je>,<,vali^. Vrniti mora par, sestavljen iz para in trojke, konkretno:((x, y), (yo, x0, x1)). Tu sta(x, y)koordinati polja, na katerem bi se ustavil kolesar, ki bi s podanega polja peljal v podano smer; ustavi se na polju pred oviro oz. na polju pred robom kolesarske steze.(yo, x0, x1)pa so podatki o oviri, zaradi katere se je ustavil. Če se kolesar ne ustavi zaradi ovire temveč zato, ker je prišel do roba steze, naj namesto zadnje trojke vrnemoNone. (V tem primeru je rezultat torej oblike((x, y), None).)
Ocena 7 - 8
Sestavi razred Kolesar, VestniKolesar in Avtonomni kolesar.
Kolesar
- Konstruktor prejme koordinati
x,yin kolesarsko stezo - objekt razredaSteza. pozicija()vrne trenutni koordinati ((x, y)) kolesarja.premik(smer)premakne kolesarja v podani smeri do polja, ko se mora ustaviti, ker naleti na oviro ali rob kolesarske steze. Če premik v podano smer ni možen, se kolesar ne premakne. Metoda ne vrne ničesar.Predpostavlja se, da bo metoda uporabila metodo
konecpodane steze. Če je ne bo, bodo testi javili napako.
Program (
ovire so seznam ovir kot v prejšnji nalogi)
steza = Steza(17, 18, ovire)
kolesar = Kolesar(12, 1, steza)
kolesar.premik("v")
kolesar.premik(">")
kolesar.premik("v")
kolesar.premik("<")
kolesar.premik("v")
kolesar.premik("<")
kolesar.premik("v")
kolesar.premik(">")
kolesar.premik("v")
kolesar.premik(">")
kolesar.premik("v")
kolesar.premik(">")
kolesar.premik("v")
mora voziti kolesarja, kot kaže slika. Številke kažejo prevožene razdalje.
VestniKolesar
VestniKolesar je izpeljan iz razreda Kolesar in ima metodo korakov, ki vrne število korakov, to je, število klicev metode premik.
Da bo to delovalo, ustrezno dopolni konstruktor in metodo premik. Pri tem naj oba kličeta podedovano metodo (ne ponavljaj kode!) in le dodata, kar je potrebno dodati.
AvtonomniKolesar
AvtonomniKolesar je izpeljan iz VestniKolesar. Njegov konstruktor dobi dodatni argument, ki je niz sestavljen iz znakov, ki predstavljajo smeri, na primer, ">^v>v>". Ta niz predstavlja "program" tega kolesarja. Kolesar ima metodo korak, ki po vrsti izvaja predvidene premike: v gornjem primeru prvi klic korak sproži premik v desno, drugi gor, tretji dol in tako naprej. Ko je načrta konec, se začne ponovno izvajati od začetka.
Kolesar, sestavljen takole, bi prevozil enako pot kot oni na gornji sliki:
steza = Steza(17, 18, ovire)
kolesar = AvtonomniKolesar(12, 1, steza, "v>v<v<v>")
for _ in range(11):
kolesar.korak()
Pazi: načrt je dolg 8, vendar izvedemo 11 korakov, tako da se po osmem ponovijo prvi trije.
Ocena 8 - 9
Sestavi razred MehkaSteza, ki je izpeljan iz razreda Steza. Značilnost te steze je, da klic metode konec "uničuje" ovire. Vsaka ovira zdrži tri trke, po tretjem pa izgine.
- konstruktor, ki pokliče podedovani konstruktor in doda, kar je potrebno (kaj je potrebno, se boš moral odločiti sam),
- metoda
konec, ki pokliče podedovano metodo in potem, če je ta že tretjič (ne nujno tretjič zapored) vrnila isto oviro, le-to odstrani.
Ocena 9 - 10
Sestavi razred UsmerjeniKolesar, ki je izpeljan iz razreda VestniKolesar ali iz razreda AvtonomniKolesar - karkoli ti bo lažje.
- Podobno kot
AvtonomniKolesartudi tu konstruktor prejmenacrt, ki pa vsebuje le zaporedje znakov<in>. Tako kot
AvtonomniKolesarima metodokorak, ki pa se vede malo drugače.- Ko jo pokličemo prvič, se kolesar odpelje dol (če more; če ne more, ne naredi ničesar). Pelje se, kolikor daleč dol se more. (Uporabi podedovano metodo
premik!) - Ko jo pokličemo naslednjič, se odpelje (kolikor daleč se more) v smer, ki jo narekuje prvi korak (= prvi znak) načrta, ki ga je dobil konstruktor.
- Ko jo pokličemo naslednjič, se odpelje dol.
- Ko jo pokličemo naslednjič, se odpelje v smeri drugega koraka (znaka) načrta.
- Ko jo pokličemo naslednjič, se odpelje dol.
- Ko jo pokličemo naslednjič, se odpelje v smeri tretjega koraka načrta.
- ... in tako naprej. Če zmanjka načrta, ga začne ponavljati od začetka.
Z drugimi besedami kolesar se izmenično premika dol in v smeri, ki jo daje načrt.
Če načrta zmanjka, se začne, tako kot pri avtonomnem kolesarju, ponavljati od začetka.
- Ko jo pokličemo prvič, se kolesar odpelje dol (če more; če ne more, ne naredi ničesar). Pelje se, kolikor daleč dol se more. (Uporabi podedovano metodo
Tole pelje kolesarja po poti iz prejšnje slike. Načrt je predolg in se pač ne izvede do konca.
steza = Steza(17, 18, ovire) # kjer so ovire seznam ovir kot v prejšnji nalogi
kolesar = UsmerjeniKolesar(12, 1, steza, "><<>><>")
- 20 maj 2023, 18:18