Kõige olulisem abivahend selles töötoas on oskus küsida küsimusi. Küsimusi soovitame julgelt küsida klassis ringi
liikuvate abiõppejõudude käest, kes on valmis vastama kõikidele küsimustele. Kui abiõppejõud ei oska aidata, võid
kasutada ka Dr. Google'it, PyGame dokumentatsiooni või meie
projekti kaustas solutions olevaid
lahendusi. Tunnis kasutatud slaidiesitlust saab järele
vaadata siit!
Oled praktikant ja sinu ülesandeks on anda viimane lihv tulevasele AAAA mängule "Fruit Ninja - init2025 edition"!
Aga oh ei - osa koodi on kogemata kaduma läinud, sest üks töötaja unustas muudatused salvestamata! Õnneks on alles varasemad arendaja juhised dokumentatsioonis, mis aitavad sul mängu taastada ja õigeks ajaks Steami üles laadida!
Mäng on loodud PyGame abil.
Oleme sulle ette valmistanud ülesanded ning juhtnöörid nende lahendamiseks. Kui vajad abi, tõsta julgelt käsi või kasuta Dr. Google'it! Peamine eesmärk on õppida ja lõbutseda! 🎮
Enne programmeerima hakkamist tuleb meil avada kooditöötlusprogramm PyCharm, laadida alla meie kood, ning paigaldada
mängumootor PyGame ja pilditöötlusteek Pillow. Kõik kolm sammu teeme koos tunnis läbi. PyGame ja Pillowi paigaldamiseks
on vajalik avada PyCharmis Terminal (all vasakul, näeb välja nagu >_). Sinna tuleb sisestada käsklus
pip install pygame ning vajutada ENTER. Kui see käsk on edukalt lõpuni jooksnud, siis käivita uus käsk
pip install pillow. Kui tekib mingi probleem, siis tõsta julgelt käsi, kõik abiõppejõud ongi siin selleks, et teid
aidata! Pärast seda saame hakata mängu koodi kallal tööd tegema.
-
Puuviljad peaksid ilmuma juhuslikult ekraani alumisse serva. Kui soovid ükskõik millisel hetkel mängu käima panna, siis ava PyCharmis fail
fruit_ninja.pyning vajuta▶️ play nupule!Alustuseks mine faili
fruit_ninja.pyja otsi sealt üles funktsioondef spawn_fruit().Kui
spawn_fruit()funktsioon käivitatakse, määratakse igale uuele puuviljale tüüp, alguspunkt ja trajektoor.- Puuvilja tüüp valitakse juhuslikult sõnastikust
fruit_images, kasutades selleks funktsioonirandom.choice().- See sõnastik tekitatakse automaatselt kaustas
assets/fruitsolevate pildifailide alusel.
- See sõnastik tekitatakse automaatselt kaustas
- Alguspunkt
xmääratakse vahemikus150kuniSCREEN_WIDTH - 150, et puuviljad ei ilmuks liiga lähedale akna servadele.ykoordinaat seatakse alati väärtuseleSCREEN_HEIGHT, et puuviljad ilmuksid ekraani allservas. - Liikumise trajektoor koosneb horisontaalsest kiirusest, mille väärtus võib olla
-2või2, ning vertikaalsest kiirusest, mis valitakse suvaliselt vahemikust-20kuni-18.
Kui see funktsioon välja kutsutakse, siis tuleks luua uus
Fruitobjekt. Sellele objektile peab argumentidena kaasa andma eelnevalt välja arvutatudfruit_type,x,yjatrajectoryväärtused. Lõpuks tuleb vastloodud Fruit objekt lisadaself.fruitsnimekirja.💡 Kuidas luua uusi muutujaid ja objekte Pythonis?
- Puuvilja tüüp valitakse juhuslikult sõnastikust
# Loome muutuja 'fruit_type' ja määrame selle väärtuseks "apple".
fruit_type = "apple"
x = 200 # määrame koordinaadi x-teljele
y = 600 # määrame koordinaadi y-teljele
trajectory = (-2, -19) # määrame liikumise trajektoori
# Loome 'Fruit' objekti, kasutades eelnevalt määratud muutujaid.
new_fruit = Fruit(fruit_type, x, y, trajectory)
# Lisame objekti nimekirja, et seda saaks mängus kasutada.
fruits.append(new_fruit)-
Puuviljade liikumise arvutamine
Puuviljad peaksid lendama üles, ja seejärel taas gravitatsiooni mõjul alla kukkuma!
Esimesena mine faili
constants.pyja defineeri gravitatsioonikonstant.Loo muutuja (konstant)
GRAVITYja anna sellele väärtuseks0.3, et simuleerida raskusjõudu. Võid muidugi seda väärtust timmida, et mängu huvitavamaks muuta. 😉Otsi üles fail
fruit.py. Selles failis on kirjas kogu puuviljadega seonduv loogika. Nüüd hakkame muutma puuvilja koordinaate, kasutades selleks varem mainitud trajektoori väärtusi!Iga kaader kutsutakse välja
def move()funktsiooni. Sinna alla pead kirjutama puuvilja liikumise koodi!Esimene trajektoorielement (
self.trajectory[0]) näitab puuvilja liikumise kiirust X-telje suhtes. Seega tuleks igal kaadril liitaself.x-ile (puuvilja X-koordinaadile)self.trajectory[0](puuvilja kiirust X-telje suhtes). Teine trajektoorielement (self.trajectory[1]) näitab järelikult puuvilja liikumise kiirust Y-telje suhtes, ning tema väärtus tuleks igal kaadril liitaself.y-ile (puuvilja Y-koordinaadile).Proovi pärast nende muudatuste tegemist mängu käima panna! Ava PyCharmis fail
fruit_ninja.py, vajuta▶️ play nupule, ning näed, et mängu alustades lendavad nüüd ringi puuviljad!Aga nagu tähelepanelik uudistaja kindlasti märkab, siis puuviljad lendavad ekraanil ainult ülespoole. Et seda viga parandada, kasutame varem loodud gravitatsioonikonstanti, et uuendada trajektoori. Muudame igal kaadril trajektoori väärtust nii, et jätame esimese väärtuse (
self.trajectory[0]) samaks, kuid liidame teisele väärtusele (self.trajectory[1]) otsaGRAVITY. Uue trajektoori salvestamiseks saame kasutada koodiridaself.trajectory = (esimene väärtus, teine väärtus).💡 Kuidas luua, liita ja lahutada muutujaid Python-is?
# Loome muutuja 'x', ning seame selle väärtuseks 1. x = 1 x += 5 # muutujale viie liitmine # x on nüüd 1 + 5 = 6 x -= 2 # muutujast kahe lahutamine # x on nüüd 6 - 2 = 4 # saad ka liita mõne muu muutuja võrra teine_muutuja = 5 x += teine_muutuja # x on nüüd 4 + teine_muutuja = 4 + 5 = 9 x = 2 + teine_muutuja # muutujale uue väärtuse määramine teise muutuja abil # x on nüüd 2 + teine_muutuja = 2 + 5 = 7
-
Puuviljade keerlemise arvutamine
Puuviljad peaksid mängus visuaalselt pöörlema. Selleks tuleb igal kaadril nende pöördenurka uuendada.
Mine taaskord faili
fruit.py, ning leia sealt funktsioondef move(), kus toimub puuviljade liikumise määramine.Kuna seda funktsiooni kutsutakse välja igal kaadril, siis puuvilja pöörlema panemiseks piisab sellest, kui siinkohal
self.angleväärtusele (puuvilja praegune pöördenurk) liita juurdeself.rotate_direction(samas failis veidi ülevalpool defineeritud muutuja, mis määrab suvaliselt puuvilja pöörlemise suuna ja kiiruse).
Kui puuvili on pooleks lõigatud, siis peaksime mängijale lisama juurde ühe punkti.
Mine faili fruit_ninja.py ja otsi üles def handle_slicing() funktsioon, mis vastutab puuviljade pooleks lõikamise
loogika eest.
Kui puuvili on pooleks lõigatud, siis lisa self.score väärtusele +1, et arvestada iga lõigatud puuvilja eest mängijale
punkt.
Kui tahad oma mängu huvitavamaks muuta, siis võid siinkohal kasutada ka mingit teistsugust skoorinumbrit!
Kui mängija lõikab pommi, siis kaotab mängija kõik oma elud ja mäng tuleb kohe lõpetada.
Mine uuesti faili fruit_ninja.py ja otsi taaskord üles def handle_slicing() funktsioon, kus pesitseb puuviljade ja
pommide lõikamise loogika.
Kui lõigatud objekt on pomm, siis:
- Seadke mängija elud (
self.lives) nulli. - Määrake mängu oleku (
self.state) väärtuseksSTATE_GAME_OVER, et näidata, et mäng on läbi. - Tühjendage puuviljade nimekiri (
self.fruits), et ei oleks võimalik pärast mängu lõppu enam mängija skoori suurendada.
Praegu oleme määranud, et mäng lõppeb, kui mängija elud saavad otsa või kui lõigatakse pooleks pomm. Pommi poolekslõikamisega tegelesime me eelmises punktis, ent hetkeseisuga pole meil veel süsteemi, mis automaatselt kontrolliks, kas mängija elud on nulli jõudnud, et seejärel mäng lõpetada.
Endiselt toimetame failis fruit_ninja.py. Seekord otsi üles def update() funktsioon.
Kui elud (self.lives) saavad nulli (või jäävad alla nulli, võimalike bugide vältimiseks), siis:
- Määrake mängu oleku (
self.state) väärtuseksSTATE_GAME_OVER, et mäng oleks lõppenud. - Tühjendage puuviljade nimekiri (
self.fruits), et kõik puuviljad kaoksid ekraanilt.
Kui mängija saavutab uue parima skoori, siis tuleb see salvestada faili, et järgmine kord mängu käivitades viimane parim skoor kaduma ei läheks.
Ja taaskord muudame faili fruit_ninja.py. Otsi sealt üles funktsioon def save_highscore(). Siin tuleb teha järgmist:
- Avage fail
"highscore.txt"kirjutamisrežiimis. Selle kohta võib rohkem lugeda näiteks PyDocist. - Kirjutage praegune parim skoor (
self.highscore) faili. Enne kirjutamist tuleb see konverteeridastr()meetodi, abil sõneks (string), kuna faili kirjutamine nõuab sõne andmetüüpi.
Et mängu huvitavamaks muuta, saame lisada erinevaid heliefekte, nagu taustamuusika, pommide lõhkemine ja puuviljade poolekslõikamine. Esiteks peame sisse laadima helifailid, et saaksime neid mängu jooksul mängida.
Ava fail resources.py, ning lisa sinna muutujad kõigi soovitud helide jaoks. Abiks vaata, kuidas on loodud muutuja
flute_sound. Kõik meie poolt loodud helifailid võid leida kaustast "assets/sounds", ning kui soovid kasutada hoopis
enda helifaile, siis paiguta need sinnasamasse kausta!
Failis resources.py võiks sisse laadida järgmised helid:
- Menüü taustamuusika (
soundtrack); - Mängu taustamuusika (
ambience); - Pommi viskamine (
bomb_throw); - Tavaline puuvilja viskamine (
fruit_throw); - Pommi lõhkemine (
explosion_sound); - Puuvilja lõikamine (
fruit_slice); - Puuvilja kaotamine (
miss_sound).
Seejärel mine faili fruit_ninja.py ja lisa need heliefektid õigesse kohta, kus need peaksid mängima. Paljud sobivad
kohad oleme me sinu jaoks juba üles otsinud, ning need on koodis märgitud kommentaariga
# TODO: Play the ... sound here!.
Et heliefekti mängida, pead kutsuma vastava heliefekti muutuja alt välja .play() meetodi.
Näiteks, et mängida flute_sound-i, kirjutasime me mängukoodi, et kui mängija alustab uut mängu, siis ...
flute_sound.play()Taustamuusika võiks jääda end pärast laulu lõppemist kordama. Selleks saame .play() meetodile anda kaasa parameetri,
mis ütleb talle, mitu korda see lugu end kordama peaks. Kui soovime, et lugu jääks end lõpmatult kordama, siis tuleks
selle parameetri väärtuseks panna -1.
soundtrack.play(-1)- 👑 Tee nii, et skoori suurenedes läheks mäng kiiremaks või raskemaks.
- 👑 Lisa mängu uue taustaga level
- 👑 Vaheta välja mõni heliefekt
- 👑 Lisa uusi puuvilju
- 👑 Lisa visuaalseid efekte (näiteks puuviljadele "pooleks minemise" animatsioon või pommile plahvatamise animatsioon)