Slalom v d-MOL-u

Odprto: sreda, 4. januar 2023, 00.00
Rok za oddajo: ponedeljek, 16. januar 2023, 08.00

Za zadnjo domačo nalogo bomo končno pokolesarili. Programirali boste tole.

Tehnikalije

Zvočni efekti in slike: v datoteki na dnu strani. Oddate pa samo program. Efekte in slike, pa tudi risarja imamo. :) VENDAR: ko programiraš, naj bodo datoteke s slikami in zvokom v isti mapi kot tvoj program! Riši z risar.slika(x, y, "flower.png") in ne z risar.slika(x, y, "c:/Users/benjamin/faks/programiranje1/dn12/slike/flower.png", sicer te bomo sovražili.)

Testi: tokrat jih ni.

Risanje ovir: v modul risar dodaj (recimo na konec) še tole funkcijo.

@pogojno_obnovi
def pravokotnik(x0, y0, x1, y1, barva=bela, sirina=1, poln=False, zaobljen=0):
    path = QPainterPath()
    if zaobljen:
        path.addRoundedRect(QRectF(0, 0, x1 - x0, y1 - y0), zaobljen, zaobljen)
    else:
        path.addRect(QRectF(0, 0, x1 - x0, y1 - y0))
    rect = QGraphicsPathItem(path)
    rect.setPen(QPen(barva, sirina))
    rect.setBrush(QColor(barva).darker(150))
    rect.setPos(x0, y0)
    widget.scene.addItem(rect)
    return rect

Ta funkcija nariše pravokotnik, katere gornji levi kot je (x0, y0), spodnji desni pa (x1, y1). Če med argumente dodamo poln=True, bo pravokotnik zapolnjen (z malo temnejšo barvo). Če dodamo zaobljen=5, bodo vogali zaobljeni (namesto 5 lahko damo tudi manj ali več).

Spreminjanje besedila: če z b = risar.besedilo(...) izpišete neko besedilo, ga lahko kasneje spreminjajte z b.setPlainText(novo_besedilo).

Uporaba drugih modulov razen risar/Qt: za te stvari bi bil seveda boljši PyGame; Qt je namenjen drugim stvarem. Vendar ne, ker (a) bi lahko bilo programiranje te naloge v kakšnem drugem okolju trivialno in zato čisto nepoučno, (b) bi si morali potem za pregledovanje nalog namestiti vse žive knjižice, ki bi ali pa tudi ne bi delovale na naših računalnikih in vse skupaj bi postalo neobvladljivo.

Ocena 6

Sprogramiraj ovire.

  • Ovire se pojavljajo na vrhu; visoke so 25 in široke med 30 in 80. Vodoravno naj se ovira pojavi kjerkoli, tudi na levem ali desnem robu, ne sme pa štrleti čez. (Nasvet: najprej določite širino in šele nato položaj.)
  • Za risanje ovire uporabiš gornjo funkcijo pravokotnik.
  • Ovire se pomikajo navzdol. (Očitno.) To narediš tako, da pomikaš obstoječe ovire (tako kot smo pri programiranju želve premikali njeno telo in glavo) in ne tako, da rišeš nove. V vsaki iteraciji se premaknejo za 1.
  • Pomikanje ovir teče v neskončni zanki. V tej zanki najprej premakneš vse ovire in nato pokličeš risar.cakaj(0.002). Ne kliči čakanja po vsakem premiku vsake ovire!
  • Ko ovira ni več vidna, pokliči risar.odstrani(ovira), kjer je ovira objekt, ki predstavlja oviro (torej tisto, kar bo vrnila funkcija pravokotnik). Poleg tega jo boš verjetno pobrisal iz nekega seznama ovir, ki ga bo vzdrževal tvoj program, ampak to je tvoja stvar.
  • Ovire se pojavljajo tako: v začetku ni nobene. Program v vsakem koraku (torej pred zanko, ki premika ovire), preveri ali je vidnih ovir manj kot 20. Če je tako, potem z verjetnostjo 2 % (namig: if random.random() < 0.02) dodaš novo oviro. Z drugimi besedami: ovir je največ 20; če jih je manj, se nova pojavi z verjetnostjo 2 % / zanko.

Ocena 7

  • Dodaj kolesarja. Biti mora kakih 40 točk nad spodnjim robom okna.
  • Desno in levo jo pomikamo s smernima tipkama. Funkciji risar.levo() in risar.desno) vrneta True, če je pritisnjena tipka "levo" oz. "desno".
  • Pazi, da kolesar ne uide levo ali desno od okna. :)
  • Ko se kolesar zaleti v oviro, se igra konča. Pri zaletavanju bodi malenkost toleranten (igralec bo samo srečen, če je oplazil oviro in se ni zgodilo nič, ter nezadovoljen, če se je ni dotaknil, vendar je bilo igre konec).

Ocena 8

  • Spremeni igro tako, da kolesar, ko se zaleti, izgubi življenje. Oddelek za gospodarstvo in motorni promet MOL je prepričan, da imajo kolesarji devet življenj. To je seveda popolna neumnost. Kolesarji imamo samo tri življenja. Zato se mora igra končati, ko se kolesar tretjič zaleti v kako oviro (seveda ne v isto :).
  • Število preostalih življenj naj bo izpisano v desnem gornjem kotu.
  • Po izgubi življenja se igra ne resetira, temveč teče od trenutne situacije naprej.

    (Igra v videu ni sprogramirana tako - te je bilo konec že po prvi nesreči.)

Ocena 9

  • Dodaj objekte, za katere kolesar dobi nagrado, če jih pobere (glej video). Skupno število zbranih točk naj bo napisano zgoraj levo (tudi glej video). Nagrade so takšne kot v prejšnjih domačih nalogah, torej
nagrade = [("flowers.png", 1), ("bottle.png", 1), ("stones.png", 2), ("grass.png", 3), ("walker.png", 4),
           ("scooter.png", 2)]

(Nekaj nagradnih objektov, na primer stopnice in avtocesta, je izpuščenih. Ne dodajaj jih, ker oddajaš samo kodo, brez dodatnih slik.)

Ocena 10

Ugotovi, kako dodati zvok in ga dodaj. Pri tem smeš uporabljati samo, kar nudi knjižnica Qt - nobenih dodatnih knjižnic. Prav tako uporabi samo tri datoteke, ki so priložene.

  • En zvok igra med igro; ta se ne neha (ustrezno nastavi "loop").
  • Drug zvok se zasliši ob pobiranju objektov.
  • Tretji zvok se zasliši, ko zadanemo oviro. Če je zaradi tega konec igre, se ob tem - še preden se oglasi ta, tretji zvok - ustavi oni (naporni) stalni zvok.