4. Harjoitus: Lopunajan moduulit¶
Nämä ovat kurssin viimeiset harjoitukset. Miettikääpä sitä! Mieluiten kuitenkin vasta sen jälkeen kun olette miettineet itse tehtäviä. Tällä kertaa käsitellään tiedostoja ja tutustustaan hieman Pythonin moduuleihin. Viikon aihetehtävät tarjoavat myös varsin lihavia eväitä lopputyötä varten.
Osaamistavoitteet¶
Tämän harjoituksen jälkeen tiedostojen kanssa pläräämisen pitäisi olla jollain tapaa tuttua. Lisäksi moduulien käyttöönotto tulee entistä tutummaksi, samoin oman koodin kirjoittaminen moduulikelpoiseksi. Tutuksi tulee myös lopputyöhön suunniteltu kirjasto (tai kirjastot).
Esimerkki¶
Kuten materiaalissa luvattiin, tämän kerran esimerkissä tutustutaan hieman kurssia varten tehdyn haravasto-
kirjaston
käytöön. Esimerkki keskittyy pääasiassa siihen miten käsittelijäfunktiot
käyttäytyvät. Esimerkki on myös jatkoa parille aiemmalle harjoitustehtävälle - nyt viimein nähdään miten suuntavektoria käyttävä liikkuminen toteutuu ruudulla.Esimerkin ajaminen vaatii pyglet-kirjaston, jonka voi asentaa komentamalla
pip install pyglet
Jos esimerkki ei tämänkään jälkeen toimi ja saat jonkinlaisen GLException-poikkeuksen, asenna Pygletistä vanhempi versio:
pip install "pyglet<2.0.0"
Tehtävän asettelu¶
Hauska olisi tehdä kokonainen peliprototyyppi, mutta siinä jouduttaisiin menemään aika paljon asioihin, joita ei ole tarpeen käydä tällä kurssilla. Tehdään siis vain yksittäinen ohjattava peliobjekti. Tavoitteena vois olla vaikka itsestään liikkuva ja animoitu pelihahmo, joka vaihtaa suuntaa kun pelaaja klikkaa pelialuetta. Sovitaan vielä, että hahmo ei liiku tasaisella nopeudella, vaan kiihtyy aina nollasta ylöspäin kun kohdepiste vaihtuu.
Ratkaisu¶
Aivan ensimmäinen vaihe olisi saada jotain näkymään ruudulle. Tässä asiassa haravasto tulee avuksi. Toimintaperiaate on pääasiassa sama kuin materiaalissa käytetyssä ikkunastossa, eli ohjelman pääsilmukka pyörii Jossain Muualla (tm), ja varsinainen pelilogiikan käsittely tapahtuu käsittelijäfunktioissa. Tällä kertaa meillä ei kuitenkaan ole käyttöliittymäelementtejä joihin käsittelijät kiinnitetään. Jos tarkastellaan haravastoa, se tarjoaa mahdollisuuden kytkeä neljä erilaista käsittelijää:
- hiiren käsittelijä, joka käsittelee hiiren klikkaukset
- näppäimistön käsittelijä, joka käsittelee näppäinpainallukset
- piirtokäsittelijä, joka käsittelee piirtotapahtuman
- toistuva käsittelijä, johon voidaan asettaa toistuvasti kutsuttava funktio
Minimissään pelissä on oltava piirtokäsittelijä, jotta mitään saadaan näkyviin. Siinä missä ikkunaston kanssa kirjasto vastasi asioiden piirtämisestä ruudulle, tällä kertaa meidän pitää tehdä se itse. Pääero on siinä, että haravasto ei määrittele valmiita peliobjekteja samalla tavalla kuin ikkunasto määritteli käyttöliittymäkomponentit. Piirtofunktion tulee lähinnä piirtää kukin peliobjekti siihen kohtaan ruutua, jossa se on pelilogiikan mukaan menossa. Ennen kuin päästään piirtämään mitään, pitäisi grafiikat kuitenkin ladata. Tätä operaatiota ei tarvi tehdä itse miinoja haravoidessa, koska haravasto sisältää funktion, joka lataa mukana tulevat miinantallausgrafiikat. Myöskään pygletiä ei tarvitse ottaa käyttöön omassa koodissa, ja harjoitustehtävissä tätä ei edes saa tehdä. Tätä esimerkkiä varten tehdään kuitenkin oma latausfunktio, joka lataa alla olevat kaksi kuvaa annetusta
kansiosta
.import pyglet
import haravasto
LEVEYS = 800
KORKEUS = 600
def lataa_kuvat(polku):
pyglet.resource.path = [polku]
kuvat = {
"0": pyglet.resource.image("plus_1.png"),
"1": pyglet.resource.image("plus_2.png")
}
haravasto.grafiikka["kuvat"] = kuvat
Kuvien
avaimia
ei ole valittu sattumalta - syy valintoihin selviää myöhemmin. Lisäksi tarvitaan varsinainen piirtokäsittelijä, jossa seurataan haravaston omaa esimerkkiä - koko prosessi on selitetty varsin kattavasti haravaston dokumenttimerkkijonoissa
. Piirretään kuva kohtaan 100, 100. Haravasto puhuu ruuduista, koska se ajattelee piirtävänsä miinaharavaa, mutta ei anneta sen häiritä.def piirra_peli():
haravasto.tyhjaa_ikkuna()
haravasto.piirra_tausta()
haravasto.aloita_ruutujen_piirto()
haravasto.lisaa_piirrettava_ruutu("0", 100, 100)
haravasto.piirra_ruudut()
Kun nämä kaksi funktiota laitetaan käyttöön pelin alustuksessa ja pääohjelmassa, saadaan ruudulle kaunis plus-merkki. Käsittelijöitä ei nyt siis kytketkä käyttöliittymäelementteihin, vaan suoraan itse haravastoon erikseen tätä varten luoduilla funktioilla.
def aloita_peli():
haravasto.luo_ikkuna(LEVEYS, KORKEUS)
haravasto.aseta_piirto_kasittelija(piirra_peli)
haravasto.aloita()
if __name__ == "__main__":
lataa_kuvat("spritet")
aloita_peli()
Seuraava askel olisi luoda vuorovaikutusta. Aloitetaan siitä, että peli osaa tunnistaa käyttäjän klikkaukset, ja reagoi niihin teleporttaamalla hahmon suoraan määrättyyn kohtaan. Tässä vaiheessa otetaan käyttöön tutun näköinen
sanakirja
. Käsittelijäfunktioilla
on edelleen sama ongelma kuin materiaalissa, eli emme voi vaikuttaa siihen mitä argumentteja
niille annetaan. Samoin kuin materiaalissa, pelin tila kannattaa siis laittaa pääohjelmatason sanakirjaan. Annetaan sanakirjalle nimeksi tila, ja sijoitetaan pelihahmoa kuvaava sanakirja sen "pelaaja"-avaimeen
.tila = {
"pelaaja": {
"x": 0,
"y": 0,
"suunta": 0,
"nopeus": 0
}
}
Sanakirjassa näkyvät tyhjiä arvoja vastaavat nollat - tarkoitus on jälleen näyttää koodin lukijalle mitä ominaisuuksia pelaajan hahmolla on. Varsinainen arvojen asettaminen (satunnaiseen kohtaan ruudulla) tehdään luo_pelaaja-funktiossa:
def luo_pelaaja():
tila["pelaaja"] = {
"x": random.randint(0, LEVEYS - 1),
"y": random.randint(0, KORKEUS - 1),
"suunta": 0,
"nopeus": 0
}
Nyt kun meillä on objekti, jonka sijaintia voidaan ylläpitää, voidaan tehdä hiiren käsittelijä, joka muuttaa sijaintia. Käsittelijällä on neljä
parametria
, joista tarvitsemme tällä kertaa vain klikkauksen x- ja y-koordinaatit. Idea on edelleen hyvin samanlainen kuin aiemmin, eli käsittelijä muuttaa tila-sanakirjassa olevan "pelaaja"-avaimeen liitetyn hahmoa kuvaavan sanakirjan arvoja, jolloin muutokset näkyvät kaikkialla ohjelmassa.def kasittele_hiiri(x, y, nappi, muokkausnapit):
tila["pelaaja"]["x"] = x
tila["pelaaja"]["y"] = y
Muutetaan myös piirtokäsittelijä piirtämään hahmo siihen, missä se pelin tilan mukaan sijaitsee:
def piirra_peli():
haravasto.tyhjaa_ikkuna()
haravasto.piirra_tausta()
haravasto.aloita_ruutujen_piirto()
haravasto.lisaa_piirrettava_ruutu("0", tila["pelaaja"]["x"], tila["pelaaja"]["y"])
haravasto.piirra_ruudut()
Ja lopulta liitetään uudet funktiot pelin aloittamiseen:
def aloita_peli():
luo_pelaaja()
haravasto.luo_ikkuna(LEVEYS, KORKEUS)
haravasto.aseta_piirto_kasittelija(piirra_peli)
haravasto.aseta_hiiri_kasittelija(kasittele_hiiri)
haravasto.aloita()
Periaatteessa näillä tiedoilla käsittelijöistä pystyy tekemään miinaharavan. Pääosa pelin logiikasta tulee hiiren käsittelyfunktioon sekä funktioihin, joita kutsutaan sieltä käsin. Tämä esimerkki ei kuitenkaan ihan vielä vastaa tehtävänantoa, joten jatketaan hieman eteenpäin. Haluttiin siis, että teleporttaamisen sijaan pelihahmo alkaisi kiihdyttää kohti klikattua pistettä. Koska pelihahmolla on jo ominaisuudet nopeus ja suunta, tarvitaan klikkauksen käsittelijä, joka muuttaa suuntaa ja asettaa nopeuden nollaan. Pelihahmolle pitää myös lisätä kiihtyvyys-ominaisuus.
Varsinainen hiiren käsittelijä muuttuu tässä vaiheessa muotoon:
def kasittele_hiiri(x, y, nappi, muokkausnapit):
aseta_suunta(tila["pelaaja"], x, y)
tila["pelaaja"]["nopeus"] = 0
Suunnan asetuksesta kannattaa tehdä oma funktionsa, koska funktio, joka määrittää kulman hahmon ja annetun pisteen välillä kuulostaa kohtalaisen yleishyödylliseltä. Ties vaikka peliin ilmestyisi joskus muitakin objekteja, jotka liikkuvat määritettyä pistettä kohti. Tässä vaiheessa tarvitaan hieman trigonometrian muistelua: jos tiedetään kanta ja korkeus, kulma saadaan arkustangentilla, johon on math-moduulissa funktio. Tosin pelkkä atan ei ole hyvä, koska se ei kästtele x:n ja y:n etumerkkejä erikseen - tämän tekee atan2.
def aseta_suunta(hahmo, kohde_x, kohde_y):
etaisyys_x = kohde_x - hahmo["x"]
etaisyys_y = kohde_y - hahmo["y"]
hahmo["suunta"] = math.degrees(math.atan2(etaisyys_y, etaisyys_x))
Periaatteessa kulmia on vähän turha muuttaa asteiksi, kun niitä ei missään vaiheessa näytetä käyttäjälle. Asteet tekevät kuitenkin koodista helpommin lähetyttävää. Varsinkin jos toimintaa pitää jossain vaiheessa debugata ja tarkastella eri objektien suuntakulmia, asteet ovat huomattavasti miellyttävämpiä. Nyt pelaajalla on mahdollisuus ohjata pelihahmoa. Enää pitäisi toteuttaa se varsinainen liikkuminen. Tätä varten asetetaan uusi käsittelijä, jonka tehtävä on päivittää pelin tilaa jatkuvasti, eli noin 60 kertaa sekunnissa. Haravaston dokumentaatiosta selviää, että tällainen funktio saa yhden argumentin, joka on kulunut aika siitä, kun sitä kutsuttiin edellisen kerran.
def paivita_peli(kulunut_aika):
tila["pelaaja"]["nopeus"] += tila["pelaaja"]["kiihtyvyys"]
paivita_sijainti(tila["pelaaja"])
Kutsutun paivita_sijainti-funktion saat vaikka omasta harjoitustehtäväkoodistasi. Tällä toteutuksella luotetaan siihen, että peli todella pyörii koko ajan halutut 60 sykliä sekunnissa. Nyt jos peli ei pyöri tätä vauhtia, logiikka hidastuu. Oikeampi ratkaisu olisi käyttää hyödyksi funktion parametria siten, että kaikki ajasta riippuvat muutokset kerrotaan arvolla
kulunut_aika * 60
(josta tulee tasan 1 jos peli pyörii halutulla tahdilla). Jätetään kuitenkin koodi nykyiseen muotoon, koska se on selkeämpi lukea. Kun nämä käsittelijät rekisteröidään aloita_peli-funktiossa, saadaan aikaan ohjattavaa liikettä.def aloita_peli():
luo_pelaaja()
haravasto.luo_ikkuna(LEVEYS, KORKEUS)
haravasto.aseta_piirto_kasittelija(piirra_peli)
haravasto.aseta_hiiri_kasittelija(kasittele_hiiri)
haravasto.aseta_toistuva_kasittelija(paivita_peli)
haravasto.aloita()
Viimeisenä kuriositeettina toteutetaan kahden kuvan animaatio. Tätä varten hahmosanakirjaan pitää lisätä tieto siitä mikä sen nykyinen kuva on. Kuvien avaimet ladatessa olivat "0" ja "1", joten tämä avain on aina numero väliltä [0,2). Määritetään lisäksi vakio, joka säätää animaation nopeutta - 60 kertaa sekunnissa vaihtuva kuva on aivan liian rasittava silmille. Arvolla 0.1 kuva vaihtuu 6 kertaa sekunnissa.
ANIMAATIONOPEUS = 0.1
tila = {
"pelaaja": {
"x": 0,
"y": 0,
"suunta": 0,
"nopeus": 0,
"kiihtyvyys": 0,
"kuva": 0
},
}
Koska kaukaa viisaasti kuville valittiin nimiksi "0" ja "1", kuvan vaihto onnistuu kätevästi matemagiikalla. Tämä lisätään paivita_peli-funktioon. Jokaisella päivityksellä kasvatetaan kuvan arvoa animaationopeuden verran, jolloin sillä menee 10 sykliä muuttua nollasta ykköseen, ja toiset 10 sykliä ykkösestä kakkoseen. Koska animaatio loppuu kuvaan numero 1, laskenta voidaan palauttaa alkuun ottamalla jakojäännös 2:lla.
def paivita_peli(kulunut_aika):
tila["pelaaja"]["nopeus"] += tila["pelaaja"]["kiihtyvyys"]
tila["pelaaja"]["kuva"] = (tila["pelaaja"]["kuva"] + ANIMAATIONOPEUS) % 2
paivita_sijainti(tila["pelaaja"])
Todettakoon, että jälleen jos haluttaisiin vakaammin toimiva peli, pitäisi animaationopeus kertoa samalla arvolla
kulunut_aika * 60
. Piirtofunktio vaatii myös muutoksen, jossa piirretään hahmosanakirjan "kuva"-avainta vastaava kuva. Koska tuo arvo on liukuluku väliltä [0,2), se pitää muuntaa kokonaisluvuksi. Grafiikkasanakirjan avaimet ovat merkkijonoja
, mutta jos kurkistetaan haravaston sisälle, muunnos merkkijonoksi tehdään siellä - argumentti voi siis olla kokonaisluku. Näin saadaan aikaiseksi kaunis(?) animaatio. Lopputulosta voi ihmetellä lataamalla valmiin ohjelmankoodin alta.Yhteiset tehtävät¶
Tuttuun tapaan nämä pitäisi kaikkien tehdä.
Lämmittelytehtävä¶
{'slug': 'oa-spiraali-suoraan-tiedostosta', 'content': [('heading', "Spiraali suoraan tiedostosta¶
\n", 0, 1), ('paragraph', 'Tämä tehtävä on edellisen viikon spiraalitehtävän jatkokehittelyä. Ohjelmaan lisätään uusi ominaisuus: se osaa piirtää tiedostossa olevien ohjeiden avulla kuvan, joka muodostuu useista spiraaleista. Tiedostossa yksi rivi kuvaa yhden spiraalin parametrit.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Tehtävässä kerrataan tiedostojen lukemista ja opetellaan parsimaan tiedoston sisältö muuttujiksi.
\n', 4, 1), ('paragraph', 'Tavoite: Toteuttaa ohjelma, joka lukee piirto-ohjeet tekstitiedostosta ja piirtää niitä sekä aiemmin luotua funktiota käyttäen kuvioita ruudulle.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Tarvitset viime viikon spiraalitehtävässä tehdyn piirra_spiraali-funktion. Kopioi siis tämän funktion määrittely koodiin.
\n', 12, 1), ('separator', '\n', 14, 1), ('paragraph', '
Toteutettava funktio:
\n', 16, 1), ('list', 'piirra_tiedostosta
; - Parametrit:
- luettavan tiedoston nimi (merkkijono). ', 17, 2), ('cleanup', '
Funktion tulee avata
\n', 20, 1), ('list', 'tiedosto
ja lukea siellä olevia, spiraalia kuvaavia datarivejä, joissa on arvot samassa järjestyksessä kuin spiraalifunktion parametrit pilkulla toisistaan erotettuna:- spiraalin väri (väriarvo - värin nimi tai heksadesimaalimuotoinen värikoodi)
- piirrettävien kaarien (neljäsosaympyrä) lukumäärä (kokonaisluku)
- spiraalin säde (kokonaisluku)
- säteen kasvu (liukuluku)
- viivan paksuus (kokonaisluku) ', 21, 5), ('cleanup', '
Funktion tulee siis lukea nämä arvot kultakin riviltä, muuttaa ne tarpeen mukaan oikeaan tyyppiin ja sen jälkeen kutsua piirra_spiraali-funktiota riviltä luettuja arvoja käyttäen. Vaikka viivan paksuus on piirtofunktiolle valinnainen parametri, tiedostossa se löytyy jokaiselta riviltä - voit siis turvallisesti olettaa, että kullakin rivillä on aina 5 arvoa.
\n', 27, 1), ('paragraph', 'Tehtävää tehdessä voit muutenkin olettaa, että luettavassa tiedostossa ei ole virheitä.
\n', 29, 1), ('separator', '\n', 31, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 33, 1), ('paragraph', 'Alla on esimerkki tiedostosta jollaisia piirra_tiedostosta-funktion tulee lukea, sekä tutun näköinen kuva, joka on piirretty tämän esimerkkitiedoston pohjalta.
\n', 35, 1), ('file', ' \n', 37, 1), ('image', "
\n \n \n \n \n
\n\n\n', 'revision': 26337, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-spiraali-suoraan-tiedostosta/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/reset_completion/', 'edit_url': '/exercise-admin/file-upload/397/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/26337/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-suoraan-tiedostosta/add/'}}
Päätehtävät¶
{'slug': 'oa-aasigotchi', 'content': [('heading', "Astraalinen aasigotchi¶
\n", 0, 1), ('paragraph', 'Osa ehkä muistaa lapsuudestaan Tamagotchit, nuo muoviset huomiota kerjäävät piippaajat. Tässä harjoituksessa tehtävänäsi on toteuttaa moinen virtuaalieläin – tarkemmin ottaen virtuaalinen aasi.
\n', 2, 1), ('paragraph', 'Tehtävässä tutustutaan omien moduulien luomiseen ja käyttämiseen syvemmin. Oheisissa tiedostoissa on annettu pari moduulia jo valmiiksi, ja tehtäväksesi jääkin pääohjelmamoduulin täydentäminen sekä käyttöliittymämoduulin laatiminen. Bittiaasin logiikka ja joukko erinäisiä määritelmiä on siis toteutettu jo valmiiksi.
\n', 4, 1), ('paragraph', 'Opittavat asiat: Muiden kirjoittamaan koodiin tutustuminen ja sen toiminnan täydentäminen. Omien
\n', 6, 1), ('paragraph', 'moduulien
kirjoittaminen. Sanakirjojen
ja vakioiden
käyttö koodissa. Tavoite: Koodata käyttöliittymämoduuli muuten valmiiseen aasigotchi-sovellukseen.
\n', 8, 1), ('separator', '\n', 10, 1), ('paragraph', '
Alustus:
\n', 12, 1), ('paragraph', 'Tehtävässä käytetään kahta täysin valmista
\n', 14, 1), ('list', 'kooditiedostoa
sekä yhtä puolivalmista. Kooditiedostojen roolit ovat seuraavat:main.py
: Pääohjelma, jonka tehtävänä on toimia ohjelman ”sisäänkäyntinä” ja toteuttaa ohjelman logiikan käyttöliittymään sitova pääsilmukka. Tässä tiedostossa on kysymysmerkeillä merkittyjä aukkoja, jotka tulee paikata.aasimaaritelmat.py
: Valmiiksi määriteltyjävakioita, samaan tapaan kuin Pythonin omamath.pi
, joita voi hyödyntää muissa moduuleissa.aasilogiikka.py
: Ohjelman moottori, jossa dataa luodaan ja käsitellään. ', 16, 3), ('cleanup', '
Kooditiedostot löytyvät tehtävänannon lopusta.
\n', 20, 1), ('separator', '\n', 22, 1), ('paragraph', '
Korjattava kooditiedosto:
\n', 24, 1), ('paragraph', 'main.py
Jotta ohjelma voidaan suorittaa, main.py-tiedostoon tulee paikata kysymysmerkeillä merkityt kohdat. Se, mitä niihin sijoitetaan, selviää tutkimalla aasilogiikka- ja aasimaaritelmat-moduuleja.
\n', 26, 1), ('separator', '\n', 28, 1), ('paragraph', '
Toteutettava moduuli:
\n', 30, 1), ('list', 'aasikaytto.py
- Dokumenttimerkkijono:
"""Määrittelee aasigotchin käyttöliittymän toiminnot."""
- Funktiot:
nayta_tila
(yksityiskohdat alempana)pyyda_syote
(yksityiskohdat alempana) ', 32, 5), ('cleanup', '
1. toteutettava funktio:
\n', 38, 1), ('list', 'nayta_tila
- Dokumenttimerkkijono: ', 40, 1), ('cleanup', '
"""\nTulostaa aasin tilan.\n"""\n
- Parametrit:
- aasin tilaa kuvaava tietorakenne (sanakirja) ', 46, 2), ('cleanup', '
Funktio tulostaa aasin tilan, eli tilaa kuvaavassa sanakirjassa olevat arvot ikä, rahat, kylläisyys, onnellisuus ja jaksaminen. Lisäksi, jos aasi on eläkkeellä, tulostetaan tästä erillinen ilmoitus. Tulostuksessa käytettävät merkkijonot löydät tehtävänannon lopussa olevista suoritusesimerkeistä.
\n', 49, 1), ('paragraph', '2. toteutettava funktio:
\n', 51, 1), ('list', 'pyyda_syote
- Dokumenttimerkkijono: ', 53, 1), ('cleanup', '
"""\nNäyttää käyttäjälle aasin tilaa vastaavat mahdolliset syötteet ja kysyy uutta\nsyötettä kunnes käyttäjä antaa laillisen syötteen. Saatu syöte palautetaan.\n"""\n
- Parametrit:
- aasin tilaa kuvaava tietorakenne (sanakirja)
- Palauttaa:
- käyttäjän antaman laillisen syötteen (merkkijono) ', 60, 4), ('cleanup', '
Funktio tulostaa aasin tilasta riippuvat valinnat kerran, jonka jälkeen se kysyy syötettä käyttäjältä kunnes käyttäjä antaa aasin tilaa vastaavan laillisen syötteen. Jos aasi ei ole eläkkeellä, lailliset syötteet löytyvät aasimaaritelmat-moduulin VALINNAT-vakiosta listana; jos aasi on eläkkeellä, lailliset syötteet löytyvät saman moduulin ELAKEVALINNAT-vakiosta listana. Näitä vakioita kannattaa hyödyntää sekä valintojen tulostuksessa, että syötteiden laillisuuden tarkistamisessa. Tulostuksissa ja kyselyissä käytettävät merkkijonot löydät jälleen suoritusesimerkeistä.
\n', 65, 1), ('separator', '\n', 67, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 69, 1), ('code', "Aasi on 96 vuotta vanha ja rahaa on 0 mk.\nKylläisyys: 5\nOnnellisuus: 5\nJaksaminen: 5\nValinnat: q, r, k, t\nAnna seuraava valinta: q\n
Aasi on 96 vuotta vanha ja rahaa on 0 mk.\nKylläisyys: 5\nOnnellisuus: 5\nJaksaminen: 5\nValinnat: q, r, k, t\nAnna seuraava valinta: Z\nVirheellinen syöte!\nAnna seuraava valinta: ???\nVirheellinen syöte!\nAnna seuraava valinta: t\nAasi on 97 vuotta vanha ja rahaa on 1 mk.\nKylläisyys: 5\nOnnellisuus: 5\nJaksaminen: 4\nValinnat: q, r, k, t\nAnna seuraava valinta: \n
Aasi on 100 vuotta vanha ja rahaa on 12 mk.\nKylläisyys: 6\nOnnellisuus: 9\nJaksaminen: 2\nAasi on jäänyt eläkkeelle.\nValinnat: q, a\nAnna seuraava valinta: X\nVirheellinen syöte!\nAnna seuraava valinta: r\nVirheellinen syöte!\nAnna seuraava valinta: k\nVirheellinen syöte!\nAnna seuraava valinta: a\nAasi on 0 vuotta vanha ja rahaa on 0 mk.\nKylläisyys: 5\nOnnellisuus: 5\nJaksaminen: 5\nValinnat: q, r, k, t\nAnna seuraava valinta:\n
\n', 121, 1), ('paragraph', '
Resurssit
\n', 123, 1), ('paragraph', 'Lataa nämä kooditiedostot omalle koneellesi alta.
\n', 125, 1), ('file', ' \n', 127, 1), ('file', ' \n', 129, 1), ('file', ' \n', 131, 1)], 'question': 'Palauta aasikaytto.py
ja main.py
. Voit valita kaksi tiedostoa kerralla pitämällä Ctrl-näppäintä pohjassa.', 'form': '\n\n\n\n \n \n \n \n \n
\n\n\n', 'revision': 26355, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-aasigotchi/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-aasigotchi/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/reset_completion/', 'edit_url': '/exercise-admin/file-upload/303/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/26355/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-aasigotchi/add/'}}
Lopputyötehtävät 1¶
Näistä sopii valita yksi. Huomaa, että tehtäviä on tässä valinnassa vain kolme: miinantallaajat valitsevat ensimmäisen, sorsan nakkelijat kolmannen, ja muut toisen. Tämä johtuu siitä, että spektri- ja piiri-lopputyöt käyttävät samaa apukirjastoa käyttöliittymäikkunan tekemiseen. Nämä tehtävät eivät kuulu minimisuoritukseen.
{'slug': 'oa-hiiri-tarttuu-haravaan', 'content': [('heading', "Miinatehtävä: Hiiri tarttuu haravaan¶
\n", 0, 1), ('paragraph', 'Kuka nyt 2000-luvulla pelaisi miinaharavaa merkkigrafiikalla terminaalissa? Tässä ja seuraavissa tehtävissä hankimme perustan, jonka päälle Miinantallaaja-polun valinneet voivat rakentaa kauniin graafisen miinaharavan, jota pelataan hiirellä. Olemme tehneet tätä varten oman pienen kirjaston, ja tässä tehtävässä aloitamme siihen tutustumisen. Aiheina ovat sovellusikkunat ja käsittelijäfunktiot.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Sovellusikkunan luominen. Hiiren käsittely haravasto-kirjaston avulla. Käsittelijäfunktioiden toteuttaminen ja käyttö.
\n', 4, 1), ('paragraph', 'Tavoite: Toteuttaa ohjelma, jossa hiiren käsittelijäfunktio kertoo missä kohdassa ruutua hiiren nappia painettiin.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Tehtävässä käytetään Miinantallaaja-lopputyötä varten tehtyä haravasto-moduulia, joka avustaa huomattavasti lopputyön graafisen käyttöliittymän tekemisessä. Lataa kirjasto alta ja tutustu siihen huolellisesti - kirjastossa on kattavat dokumentaatiomerkkijonot sekä lopussa pieni esimerkkiohjelma.
\n', 12, 1), ('file', ' \n', 14, 1), ('paragraph', 'Myös Miinantallaaja-lopputyön sivulla on hieman pohjustusta haravaston käyttöön, joten se kannattaa käydä lukaisemassa. Asenna myös Pyglet, jos et vielä tehnyt sitä harjoitusesimerkkiä kokeillaksesi. Jos saat jonkin GLException-poikkeuksen koodia ajaessa, joudut asentamaan vanhemman version kirjoittamalla:
\n', 16, 1), ('code', 'pip install "pyglet<2.0.0"\n
Huomaa, että näissä harjoitustehtävissä sinun ei tarvitse tuoda Pygletiä omaan koodiisi - kaikki tapahtuu haravaston kautta. Tarkistinpalvelimelle ei ole edes asennettu Pygletiä, joten sen suora käyttöönotto aiheuttaa ModuleNotFoundError-poikkeuksen. Lopputyössä voit toimia tietenkin parhaaksi katsomallasi tavalla.
\n', 22, 1), ('separator', '\n', 24, 1), ('paragraph', '
1. toteutettava funktio:
\n', 26, 1), ('list', 'kasittele_hiiri
- Dokumenttimerkkijono: ', 28, 1), ('cleanup', '
"""\nTätä funktiota kutsutaan kun käyttäjä klikkaa sovellusikkunaa hiirellä.\nTulostaa hiiren sijainnin sekä painetun napin terminaaliin.\n"""\n
- Parametrit:
- hiiren x-sijainti (kokonaisluku)
- hiiren y-sijainti (kokonaisluku)
- hiiren painike (kokonaisluku)
- painetut muokkausnäppäimet (kokonaisluku - ei käytetä tehtävässä, mutta tulee määritellä jotta funktiota voidaan kutsua) ', 35, 5), ('cleanup', '
Funktio tulostaa saamansa parametrit terminaaliin (suoritusesimerkeistä näet tulostuksen muotoilun). Hiiren painike on kokonaisluku, jossa eri arvot vastaavat eri nappeja. Näitä arvoja ei tarvitse muistaa, sillä voit käyttää haravaston vakioita HIIRI_VASEN, HIIRI_KESKI ja HIIRI_OIKEA selvittääksesi mitä nappia painettiin. Voit vaikka harjoitella
\n', 41, 1), ('separator', 'sanakirjojen
käyttöä tekemällä sanakirjan, jossa nämä vakioarvot ovat avaimia
ja merkkijonot "vasen"
, "keski"
ja "oikea"
arvoja.\n', 43, 1), ('paragraph', '
2. toteutettava funktio:
\n', 45, 1), ('list', 'main
- Dokumenttimerkkijono: ', 47, 1), ('cleanup', '
"""\nLuo sovellusikkunan ja asettaa käsittelijäfunktion hiiren klikkauksille.\nKäynnistää sovelluksen.\n"""\n
Pääohjelmafunktion tulee luoda ikkuna käyttämällä haravaston luo_ikkuna-funktiota sekä asettaa käsittelijäfunktion hiirelle haravaston aseta_hiiri_kasittelija-funktiolla. Tutustu siis näiden funktioiden toimintaan. Ikkunan koko ja taustaväri on vapaasti valittavissa ja taustavärillä ei ole merkitystä, koska ikkunaa ei piirretä kertaakaan luomisen jälkeen. Lopuksi sovellus pitää vielä käynnistää aloita-funktiolla.
\n', 55, 1), ('separator', '\n', 57, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 59, 1), ('code', 'if __name__ == "__main__":\n main()\n
\n', 66, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 68, 1), ('paragraph', 'Esimerkeissä näkyy vain mitä tulostuu terminaaliin.
\n', 70, 1), ('code', "Hiiren nappia vasen painettiin kohdassa 123, 53\nHiiren nappia oikea painettiin kohdassa 20, 10\nHiiren nappia keski painettiin kohdassa 250, 39\n
\n \n \n \n \n
\n\n\n', 'revision': 33313, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-hiiri-tarttuu-haravaan/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/reset_completion/', 'edit_url': '/exercise-admin/file-upload/398/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/33313/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-hiiri-tarttuu-haravaan/add/'}}
{'slug': 'oa-ihan-tavallinen-ikkuna', 'content': [('heading', "Spektri- ja piiritehtävä: Ihan tavallinen ikkuna¶
\n", 0, 1), ('paragraph', 'Jotta spektriä voidaan pukata ja piiriä pyörittää graafisesti, täytyy opetella graafisten käyttöliittymien perusteet. Tämä on opiskelusarjan ensimmäinen tehtävä, jossa opit luomaan käyttöliittymäikkunan parilla kompomentilla. Apuna toimii pieni kurssia varten tehty kirjasto, jonka avulla homma hoituu yksinkertaisten funktiokutsujen kautta.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Käyttöliittymäikkunan luomisen perusteet. Kurssin ikkunasto-moduulin käytön perusteet.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, joka luo käyttöliittymäikkunan.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Asennettava moduuli:
\n', 10, 1), ('paragraph', 'matplotlib
Tekemämme ikkunasto-moduuli vaatii toimiakseen matplotlib-kirjaston. Asennuksen voi tehdä pip-ohjelmalla komennolla
\n', 12, 1), ('separator', 'pip install matplotlib
. Normaalisti pip tulee Pythonin mukana. Kurkkaa esitehtävistä jos et muista miten sitä ajetaan. Joissain Linuxeissa sekä Mac OS X:ssä komento saattaa olla pip3 - pelkkä pip asentaa moduuleja Pythonin kakkosversioon.\n', 15, 1), ('paragraph', '
Alustus:
\n', 17, 1), ('paragraph', 'Tehtävässä käytetään ikkunasto-kirjastoa, jota käytetään sekä Spektriä pukkaa että Piiri pieni pyörii lopputyöaiheissa. Kirjastosta löytyy funktiot, joiden avulla pystyt luomaan yksinkertaisia käyttöliittymiä. Lataa kirjasto alla olevasta linkistä ja tutustu siihen huolellisesti - kirjastossa on kattavat dokumentaatiomerkkijonot sekä lopussa pieni esimerkkiohjelma.
\n', 19, 1), ('file', ' \n', 21, 1), ('paragraph', 'Kirjasto kannattaa heti alkuun testata. Mikäli saat viestin puuttuvasta DLL:stä, kyseessä on todennäköisesti tämä, joka tulee siis asentaa.
\n', 23, 1), ('paragraph', 'Myös lopputyöaihesivuilla on kerrottu lyhyesti graafisten käyttöliittymäkirjastojen perusteet, joihin on siis syytä käydä tässä vaiheessa tutustumassa.
\n', 25, 1), ('paragraph', 'Huomaa, että näissä harjoitustehtävissä sinun ei tarvitse tuoda Tkinteriä tai Matplotlibiä omaan koodiisi - kaikki tapahtuu ikkunaston kautta. Tarkistinpalvelimelle ei ole edes asennettu näitä, joten niiden suora käyttöönotto aiheuttaa ModuleNotFoundError-poikkeuksen. Lopputyössä voit toimia tietenkin parhaaksi katsomallasi tavalla.
\n', 27, 1), ('paragraph', 'Luo myös ohjelman alussa sanakirja, johon voidaan tallentaa viittaukset tärkeisiin käyttöliittymäelementteihin.
\n', 29, 1), ('code', 'elementit = {\n "tekstilaatikko": None\n}\n
Koska ohjelma toimii pääasiassa käsittelijäfunktioilla, et pysty itse määrittelemään mm. sitä mitä parametreja kullekin funktiolle annetaan. Niinpä ohjelman tila ja viittaukset käyttöliittymäelementteihin täytyy pitää
\n', 37, 1), ('separator', 'globaalisti saatavilla
. Kaikkein selkein tapa on kasata ne yhteen sanakirjaan, jota voidaan käsitellä kaikissa ohjelman funktioissa. \n', 39, 1), ('paragraph', '
1. toteutettava funktio:
\n', 41, 1), ('list', 'tulosta_testirivi
- Dokumenttimerkkijono: ', 43, 1), ('cleanup', '
"""\nTulostaa testirivin käyttöliittymän tekstilaatikkoon.\n"""\n
Kun funktiota kutsutaan, se kirjoittaa elementit-sanakirjasta löytyvään tekstilaatikkoon vaikka merkkijonon
\n', 50, 1), ('separator', '"aasisvengaa"
, tai voit myös keksiä oman viestisi. Käytä ikkunaston kirjoita_tekstilaatikkoon
-funktiota. Viestillä ei tässä vaiheessa ole muuta tarkoitusta kuin osoittaa, että käyttöliittymän elementit on onnistuneesti kytketty toisiinsa tämän käsittelijäfunktion avulla.\n', 52, 1), ('paragraph', '
2. toteutettava funktio:
\n', 54, 1), ('list', 'main
- Dokumenttimerkkijono: ', 56, 1), ('cleanup', '
"""\nLuo käyttöliittymäikkunan, jossa on vasemmalla kaksi nappia ja oikealla\ntekstilaatikko, johon nappia painamalla voidaan tulostaa tekstiä.\n"""\n
Pääohjelmafunktion tehtävä on luoda käyttöliittymän elementit, kytkeä nappeihin käsittelijäfunktiot ja lopulta käynnistää ohjelma. Haluamme käyttöliittymän, jossa on kaksi puoliskoa: vasemmalla on kaksi nappia ja oikealla tekstilaatikko. Napeista ensimmäiseen tulee kytkeä juuri tehty
\n', 64, 1), ('paragraph', 'tulosta_testirivi
-funktio käsittelijäksi. Toisen napin käsittelijä on ikkunaston lopeta
-funktio. Nappien tekstit voit valita itse.Kun luot tekstilaatikon, talleta viittaus siihen aiemmin määriteltyyn sanakirjaan.
\n', 66, 1), ('paragraph', 'Tarvitset tämän kokonaisuuden tekemiseen ikkunaston
\n', 68, 1), ('separator', 'luo_ikkuna
, luo_kehys
, luo_nappi
ja luo_tekstilaatikko
-funktioita. Tutustu siis niiden toimintaan. Suoritusesimerkit-otsikon alla on annettu kuvaruutukaappaus valmiista käyttöliittymästä. Mittasuhteet saattavat omassasi olla eri, koska ne riippuvat funktioiden argumenteista, mutta asettelun tulee olla sama. \n', 70, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 72, 1), ('code', 'if __name__ == "__main__":\n main()\n
\n', 79, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 81, 1), ('image', "
\n \n \n \n \n
\n\n\n', 'revision': 26334, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-ihan-tavallinen-ikkuna/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/reset_completion/', 'edit_url': '/exercise-admin/file-upload/399/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/26334/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-ihan-tavallinen-ikkuna/add/'}}
{'slug': 'oa-sorsatehtävä-laatikon-raahausta', 'content': [('heading', "Sorsatehtävä: Laatikon raahaamisen alkeet¶
\n", 0, 1), ('paragraph', 'Jotta sorsa voidaan ampua hienosti ritsalla ilmaan, pelaajalla pitää olla mahdollisuus vetää ritsan kuvitteellista kuminauhaa hiirellä. Tässä tehtävässä tutustutaan tämän mekaniikan peruspalikoihin eli siihen miten asioiden raahaaminen hiirellä yleisesti ottaen toimii. Toiminnot tarjoilee meille kurssia varten luotu yksinkertaistettu pelikirjasto.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Sovellusikkunan luominen. Ikkunassa olevan objektin raahaaminen hiirellä.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma jossa käyttäjä voi raahata laatikkoa.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Jotta
\n', 12, 1), ('code', 'käsittelijäfunktiot
pääsevät käsiksi laatikkoon, se kannattaa esittää sanakirjana ohjelman alussa. Nappaa siis alla oleva sanakirja, ja liitä se koodiin heti importien perään.laatikko = {\n "x": 200,\n "y": 200,\n "w": 40,\n "h": 40\n}\n
\n', 23, 1), ('paragraph', '
1. toteutettava funktio:
\n', 25, 1), ('list', 'kasittele_raahaus
- Dokumenttimerkkijono: ', 27, 1), ('cleanup', '
"""\nTätä funktiota kutsutaan kun käyttäjä liikuttaa hiirtä jonkin painikkeen\nollessa painettuna. Siirtää ruudulla olevaa laatikkoa saman verran kuin kursori\nliikkui.\n"""\n
- Parametrit:
- hiiren x-sijainti (kokonaisluku)
- hiiren y-sijainti (kokonaisluku)
- hiiren liikkuma matka x-suunnassa (kokonaisluku)
- hiiren liikkuma matka y-suunnassa (kokonaisluku)
- hiiren painike (kokonaisluku)
- painetut muokkausnäppäimet (kokonaisluku - ei käytetä tehtävässä, mutta tulee määritellä jotta funktiota voidaan kutsua) ', 35, 7), ('cleanup', '
Funktion tulee siirtää laatikkoa eli muuttaa sen x- ja y-koordinaatteja sen verran kuin kursori liikkui. Kirjasto siis kutsuu tätä funktiota jatkuvasti kursorin liikkuessa, ja muutos annetaan aina erotuksena sijaintiin edellisen kutsun kohdalla. Näitä muutostietoja käyttällä laatikko voi siis seurata pelkästään kursorin liikettä (riippumatta siitä missä hiiren kursori sijaitsee).
\n', 43, 1), ('paragraph', 'Tiedät funktion toimivan oikein, jos laatikko liikkuu ilman hyppimistä kun kursoria liikutetaan jonkin napin ollessa pohjassa.
\n', 45, 1), ('separator', '\n', 47, 1), ('paragraph', '
2. toteutettava funktio:
\n', 49, 1), ('list', 'piirra_laatikko
- Dokumenttimerkkijono: ', 51, 1), ('cleanup', '
"""\nPiirtää kentällä olevan laatikon näkyviin.\n"""\n
Avaa haravasto.py ja lue aseta_piirto_kasittelija-funktion dokumenttimerkkijonosta ohjeet miten piirtofunktio tulee toteuttaa. Voit myös katsoa harjoitusesimerkkiä. Piirrettävä laatikko tulee hakea laatikko-sanakirjasta. Käytä laatikon kuva-avaimena välilyöntimerkkiä
\n', 58, 1), ('separator', '" "
. \n', 60, 1), ('paragraph', '
3. toteutettava funktio:
\n', 62, 1), ('list', 'main
- Dokumenttimerkkijono: ', 64, 1), ('cleanup', '
"""\nLuo sovellusikkunan ja asettaa käsittelijäfunktiot hiiren eri toiminnoille.\nKäynnistää sovelluksen.\n"""\n
Pääohjelmafunktion tulee luoda ikkuna käyttämällä haravaston luo_ikkuna-funktiota sekä asettaa käsittelijäfunktiot hiirelle haravaston aseta_raahaus_kasittelija-, ja aseta_piirto_kasittelija-funktioille. Tutustu siis näiden funktioiden toimintaan. Ikkunan koko ja taustaväri on vapaasti valittavissa. Lopuksi sovellus pitää vielä käynnistää aloita-funktiolla.
\n', 72, 1), ('separator', '\n', 74, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 76, 1), ('code', 'if __name__ == "__main__":\n main()\n
\n \n \n \n \n
\n\n\n', 'revision': 26459, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/reset_completion/', 'edit_url': '/exercise-admin/file-upload/648/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/26459/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-laatikon-raahausta/add/'}}
Lopputyötehtävät 2¶
Näistäkin sopii valita yksi. Nämä tehtävät eivät kuulu minimisuoritukseen.
{'slug': 'oa-miinoitustuokio', 'content': [('heading', "Miinatehtävä: Miinoitustuokio¶
\n", 0, 1), ('paragraph', 'Satunnaisuus on peleissä tärkeä tekijä, ja sitä varten on tietenkin olemassa omat ohjelmointityökalunsa. Tästä tehtävästä saat apua Miinantallaaja-harjoitustyön automaattiseen kentänluontiin, jossa siis satunnaisuutta tarvitaan miinojen sijoittamiseen kentälle. Lisäksi tutustumme siihen, miten pelikirjastoissa tyypillisesti piirretään grafiikkaa ruudulle.
\n', 2, 1), ('paragraph', 'Opittavat asiat: random-moduulin sisältöön tutustuminen ja sopivan satunnaistamiskeinon kehittäminen miinojen asettamiseen. Peligrafiikan piirtämisen perusteet. Piirtokäsittelijäfunktion toteuttaminen käyttämällä haravasto-moduulia.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, joka asettaa kentälle annetun määrän miinoja satunnaisiin kohtiin, ja piirtää lopputuloksen peli-ikkunaan.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Tehtävässä käytetään samaa haravasto-moduulia kuin edellisessäkin. Lisäksi tarvitset miinaharavaa varten suunnitellun grafiikkapaketin, jonka sisällön voit sijoittaa valitsemaasi kansioon.
\n', 12, 1), ('paragraph', 'Koska piirtokäsittelijällä ei ole lainkaan parametrejä, piirrettävää kenttää ei voida antaa sille argumenttina. Tästä syystä ohjelmassa on jollain tavalla tehtävä kenttä tavoitettavaksi kaikkien funktioiden sisältä. Tässä tehtävässä käytämme pelin tilaa ylläpitävää sanakirjaa, joka on alkeiskurssin keinoista suositeltavin tapa. Laita siis koodisi alkuun tämä koodipätkä heti importien jälkeen:
\n', 14, 1), ('code', 'tila = {\n "kentta": []\n}\n
Luonnollisesti ohjelman suorituksen aikana tyhjä lista korvataan kenttää kuvaavaalla kaksiulotteisella listalla. Huomaa, että tarkistin vaatii tämän näköisen sanakirjan löytyvän koodista.
\n', 22, 1), ('separator', '\n', 24, 1), ('paragraph', '
1. toteutettava funktio:
\n', 26, 1), ('list', 'miinoita
- Dokumenttimerkkijono: ', 28, 1), ('cleanup', '
"""\nAsettaa kentälle N kpl miinoja satunnaisiin paikkoihin.\n"""\n
- Parametrit:
- miinoitettava kenttä (2-ulotteinen lista)
- lista vapaista ruuduista (lista joka sisältää koordinaattipari-monikkoja)
- asetettavien miinojen lukumäärä (kokonaisluku) ', 34, 4), ('cleanup', '
Funktio valitsee vapaiden ruutujen joukosta - eli vapaita ruutuja esittävästä listasta - yhteensä N ruutua, ja asettaa kunkin ruudun koordinaattien osoittamaan kohtaan kentälle miinan (miina merkitään
\n', 39, 1), ('separator', '"x"
). Tämän voi tehdä usealla tavalla - pidä kuitenkin huoli siitä, että samaa koordinaattiparia ei voida valita kahdesti! Jo miinoitetut koordinaattiparit kannattaa siis poistaa koordinaattiparilistasta. Tarkistukseen kuuluu myös testi, onko arvonta toteuttu tehokkaasti.\n', 41, 1), ('paragraph', '
2. toteutettava funktio:
\n', 43, 1), ('list', 'piirra_kentta
- Dokumenttimerkkijono: ', 45, 1), ('cleanup', '
"""\nKäsittelijäfunktio, joka piirtää kaksiulotteisena listana kuvatun miinakentän\nruudut näkyviin peli-ikkunaan. Funktiota kutsutaan aina kun pelimoottori pyytää\nruudun näkymän päivitystä.\n"""\n
Avaa haravasto.py ja lue aseta_piirto_kasittelija-funktion dokumenttimerkkijonosta ohjeet miten
\n', 54, 1), ('separator', 'piirtofunktio
tulee toteuttaa. Piirrettävä kenttä tulee lukea tila-sanakirjasta "kentta"
avaimella. Ruutuja piirrettäessä niiden ruutukoordinaatit tulee laskea kertomalla ruudun listaindeksit ruudun koolla (jonka voit katsoa grafiikkatiedostojen ominaisuuksista). Kentän läpi silmukointi muistuttaa varsin vahvasti aiempaa harjoitusta.\n', 56, 1), ('paragraph', '
3. toteutettava funktio:
\n', 58, 1), ('code', 'main
def main():\n """\n Lataa pelin grafiikat, luo peli-ikkunan ja asettaa siihen piirtokäsittelijän.\n """\n\n haravasto.lataa_kuvat(#tähän tulee polku kansioon johon tallensit kuvat)\n haravasto.luo_ikkuna(600, 400)\n haravasto.aseta_piirto_kasittelija(piirra_kentta)\n haravasto.aloita()\n
\n', 74, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 76, 1), ('paragraph', 'Pääohjelma tulee sijoittaa
\n', 78, 1), ('code', 'if __name__ == "__main__":
-ehtolauseen
alle. Pääohjelman tarkoitus on testata funktioiden toimintaa. Tämä tapahtuu määrittelemällä 15x10 kenttä, johon sijoitetaan 35 miinaa. Miinat sijoitetaan kutsumalla
miinoita-funktiota. Kentän voit luoda oheisella koodinpätkällä:kentta = []\nfor rivi in range(10):\n kentta.append([])\n for sarake in range(15):\n kentta[-1].append(" ")\n\ntila["kentta"] = kentta\n
Lisäksi tarvitset listan vapaista ruuduista. Tämä lista tuotetaan seuraavalla koodinpätkällä. Kiinnitä huomiota siihen miten dimensiot yhdistyvät koodissa rivien, sarakkeiden ja koordinaattien käsitteisiin.
\n', 90, 1), ('code', 'jaljella = []\nfor x in range(15):\n for y in range(10):\n jaljella.append((x, y))\n
Kutsu tämän jälkeen ensin miinoitus-funktiota ja sitten main-funktiota.
\n', 99, 1), ('separator', '\n', 101, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 103, 1), ('image', "
\n \n \n \n \n
\n\n\n', 'revision': 34351, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-miinoitustuokio/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-miinoitustuokio/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/reset_completion/', 'edit_url': '/exercise-admin/file-upload/400/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/34351/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinoitustuokio/add/'}}
{'slug': 'oa-osoittelu-on-rumaa', 'content': [('heading', "Spektritehtävä: Osoittelu on rumaa...¶
\n", 0, 1), ('paragraph', '...mutta ah niin kätevää - ainakin hiirellä ruudulta osoittelu. Tässä tehtävässä opitaan parikin spektri-lopputyössä tarpeellista taitoa: kuvaajan piirtäminen käyttöliittymäikkunan sisälle sekä hiiren klikkausten lukeminen.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Kuvaajan piirtäminen ohjelmaikkunan sisälle matplotlib- ja ikkunasto-kirjastojen yhteistyöllä. Kuvaajaan kytketyn hiiren käsittelijäfunktion toteuttaminen. Tapahtumien varastointi ohjelman muistiin.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, jossa kuvaajaa klikkaamalla saadaan tulostettua tekstilaatikkoon klikatun kohdan x- ja y- data-arvot.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Käyttöliittymäikkunaan upotettu kuvaaja muodostuu kolmesta osasta: piirtoalueesta, kuvaajasta ja alikuvaajasta. Tekemämme ikkunasto-moduulin luo_kuvaaja-funktio palauttaa nämä kaikki, mutta sinun tehtäväsi on piirtää niihin. Ensin mainittu on matplolibin Figure-tyypin objekti, jonka dokumentaation löydät täältä. Ikkunoinnin vuoksi kuvaajaan ei voi piirtää suoraan, vaan varsinainen piirto tehdään alikuvaajaan.. Alikuvaaja on matplotlibin Axes-tyypin objekti, josta löydät lisää tietoa täältä. Kuvaaja tulee kuitenkin varmuudella näkyviin vasta, kun piirtoalueobjektin draw-metodia kutsutaan - tämä tulee tehdä koodissa vaikka näkisit kuvaajan ilmankin.
\n', 12, 1), ('paragraph', 'Hiiren
\n', 14, 1), ('list', 'käsittelijäfunktiolla
on sama toimintaperiaate kuin edellisen tehtävän napin käsittelijällä, mutta sillä on yksi parametri: hiiritapahtuma (dokumentaatio). Tapahtuma on objekti
, jolla on muutamia tarpeellisia attribuutteja
. Näistä tärkeimmät ovat: x
jay
, jotka kertovat missä kohtaa piirtoaluetta hiirtä klikattiinbutton
, joka kertoo mitä hiiren nappia klikattiin (1 = vasen, 2 = keski, 3 = oikea)xdata
jaydata
, jotka kertovat akselien arvot klikatussa pisteessä ', 16, 3), ('cleanup', '
Tehtävässä tarvitaan myös vastaava
\n', 20, 1), ('code', 'sanakirja
kuin edellisessä, mutta johtuen sen laajemmasta luonteesta, vaihdettakoon sen nimeksi tila
, koska se kertoo yleisesti ohjelman tilasta. Sanakirjaan lisätään uusi arvain-arvo-pari, johon tallennetaan suorituksen aikana valitut datapisteet kahden alkion monikkoina
. tila = {\n "tekstilaatikko": None,\n "pisteet": []\n}\n
\n', 29, 1), ('paragraph', '
1. toteutettava funktio:
\n', 31, 1), ('list', 'valitse_datapiste
- Dokumenttimerkkijono: ', 33, 1), ('cleanup', '
"""\nOttaa vastaan hiiren klikkaustapahtuman ja lukee siitä datapisteen x- ja\ny-arvot. Arvot tulosteetaan tekstilaatikkoon sekä talletetaan ohjelman\ntilasanakirjassa olevaan pisteet-listaan.\n"""\n
- Parametrit:
- hiiritapahtuma (matplotlibin MouseEvent-objekti) ', 41, 2), ('cleanup', '
Funktion tulee lukea saamastaan hiiritapahtumasta klikatun pisteen arvot akseleilla. Nämä löytyvät siis xdata- ja ydata-attribuuteista. Arvot tulostetaan käyttöliittymän tekstilaatikkoon kahden desimaalin tarkkuudella - katso viestin muoto suoritusesimerkeistä. Toiseksi tämä sama datapiste tulee lisätä tilasanakirjan pisteet-listaan monikkona. Tämä vaihe on tärkeä, koska lopputyössä on tarpeen pystyä jälkikäteen selvittämään mikä oli viimeisin valittu piste. Kun pisteet talletetaan tilasanakirjan sisällä, ne löytyvät sieltä kätevästi.
\n', 44, 1), ('separator', '\n', 46, 1), ('paragraph', '
2. toteutettava funktio:
\n', 48, 1), ('list', 'main
- Dokumenttimerkkijono: ', 50, 1), ('cleanup', '
"""\nLuo käyttöliittymän, jossa on klikattava kuvaaja sekä tekstilaatikko. Kuvaajaan\npiirretään käyrä parametreina saatujen data-arvojen perusteella.\n"""\n
- Parametrit:
- x data (lista, sisältää liukulukuja)
- y data (lista, sisältää liukulukuja) ', 57, 3), ('cleanup', '
Funktiolla on sama tarkoitus kuin edellisessä tehtävässä. Tällä kertaa käyttöliittymä tosin jaetaan kahteen kehykseen pystysuunnassạ. Ylempään kehykseen tulee kuvaaja, jonka lisäämistä voit ihmetellä
\n', 61, 1), ('paragraph', 'luo_kuvaaja
-funktion dokumenttimerkkijonosta. Käsittelijäfunktioksi asetetaan juuri tehty valitse_datapiste
. Alempaan tulee tuttu tekstilaatikko. Lisäksi funktion tulee piirtää parametreina annettu data kuvaajaan. Esimerkki lopputuloksesta löytyy suoritusesimerkeistä.
\n', 63, 1), ('separator', '\n', 65, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 67, 1), ('code', 'if __name__ == "__main__":\n datax = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0]\n datay = [0.0, 0.19, 0.36, 0.51, 0.64, 0.75, 0.84, 0.91, 0.96, 0.99, 1.0, 0.99, 0.96, 0.91, 0.84, 0.75, 0.64, 0.51, 0.36, 0.19, 0.0]\n main(datax, datay)\n
\n', 76, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 78, 1), ('image', "
\n \n \n \n \n
\n\n\n', 'revision': 26438, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-osoittelu-on-rumaa/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/reset_completion/', 'edit_url': '/exercise-admin/file-upload/401/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/26438/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-osoittelu-on-rumaa/add/'}}
{'slug': 'oa-koodarin-kompleksi-ikkunassa', 'content': [('heading', "Piiritehtävä: Koodarin kompleksi¶
\n", 0, 1), ('paragraph', 'Jo aiemmin opittiin, että Python käsittelee kompleksilukuja oikein mielellään. Viimeksi niitä käsiteltiin komentorivillä, mutta mitenkä sujuukaan lukujen kysely graafisessa käyttöliittymässä? Piiri pieni pyörii -tehtävässä tätä saatetaan tarvita, joten asia on syytä opetella. Opetellaan samalla virheilmoitusten antamista.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Käyttäjän syötteiden pyytäminen ja käsittely graafisessa käyttöliittymässä.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, joka laskee kompleksiluvun osoitinmuodon.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Voit käyttää pohjana edellisen tehtävän käyttöliittymää. Tekstilaatikon lisäksi ohjelmassa on nyt toinen dynaaminen komponentti: tekstikenttä, johon käyttäjä voi syöttää kompleksiluvun. Toimitaan samoin kuin aiemminkin, eli tallennetaan viittaus tähän tekstikenttään sanakirjaan, jotta siihen päästään käsittelijäfunktioissa käsiksi kätevästi. Määritellään siis ohjelman alkuun seuraavanlainen sanakirja:
\n', 12, 1), ('code', 'elementit = {\n "tekstilaatikko": None,\n "tekstikentta": None\n}\n
\n', 21, 1), ('paragraph', '
1. toteutettava funktio:
\n', 23, 1), ('list', 'muuta_osoitinmuotoon
- Dokumenttimerkkijono: ', 25, 1), ('cleanup', '
"""\nLukee kompleksiluvun syötekentästä ja muuttaa sen osoitinmuotoon, jossa\nosoittimen kulma on esitetty asteina. Kompleksiluku sekä sen osoitinmuoto\ntulostetaan käyttöliittymässä olevaan tekstilaatikkoon.\n"""\n
Tämä on käsittelijäfunktio, joten sillä ei ole parametreja eikä se palauta mitään. Syöte luetaan tekstikentästä, johon päästään käsiksi elementit-sanakirjan kautta (ikkunasto-moduulissa on lukemiseen oma funktionsa). Mikäli käyttäjän antama syöte ei ole kelvollinen kompleksiluku, avataan viesti-ikkuna, joka kertoo käyttäjälle virheestä. Tähänkin löytyy funktio ikkunastosta.
\n', 34, 1), ('paragraph', 'Muunnoksessa tarvittava
\n', 36, 1), ('paragraph', 'funktio
on jo tuttu. Kulma täytyy jälleen kerran muuntaa asteiksi. Lopputulos kirjoitetaan käyttöliittymän tekstilaatikkoon esimerkkien mukaisessa muodossa. Kaikki liukuluvut esitetään kolmen desimaalin tarkkuudella. Riippumatta siitä onnistuiko muunnos vai ei, käsittelijäfunktion tulisi lopuksi tyhjätä syötekentän sisältö.
\n', 38, 1), ('separator', '\n', 40, 1), ('paragraph', '
2. toteutettava funktio:
\n', 42, 1), ('list', 'main
- Dokumenttimerkkijono ', 44, 1), ('cleanup', '
"""\nLuo käyttöliittymäikkunan, jossa on vasemmalla tekstikenttä otsikoineen, kaksi nappia (muunnosnappi ja quit) ja oikealla tekstilaatikko.\n"""\n
Pääohjelmafunktio pohjautuu edelliseen. Uusina lisäyksinä lisäämme vasempaan kehykseen tekstikentän syötteitä varten sekä sen yläpuolelle ohjeistavan tekstirivin (jossa lukee esim. "Kompleksiluku:"). Muista sijoittaa tekstikentän luontifunktion palauttama arvo elementit-sanakirjaan, jotta tekstikentän sisältö voidaan lukea muissa ohjelman osissa. Testinappi korvataan muunnosnapilla, jonka käsittelijäksi asetetaan juuri tehty muunnosfunktio.
\n', 51, 1), ('separator', '\n', 53, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 55, 1), ('code', 'if __name__ == "__main__":\n main()\n
\n', 62, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 64, 1), ('image', "

\n \n \n \n \n
\n\n\n', 'revision': 26169, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-koodarin-kompleksi-ikkunassa/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/reset_completion/', 'edit_url': '/exercise-admin/file-upload/403/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/26169/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-koodarin-kompleksi-ikkunassa/add/'}}
{'slug': 'oa-lentorata', 'content': [('heading', "Sorsatehtävä: Lentorata¶
\n", 0, 1), ('paragraph', '"Koodaamisella voi heittää vesilintua" saattaa kuulostaa turhautuneelta purkautumiselta, mutta tässä tehtävässä lauseelle löydetään ihan toisenlainen tarkoitus. Opettelemme miten koodilla saadaan sorsa lentämään kauniissa kaaressa, käyttäen yksinkertaista painovoimamallia. Sorsan aerodynaamiset ominaisuudet ovat sen verran kovat, että ilmanvastusta ei tarvi huomioida.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Nopeusvektorien laskeminen napakoordinaateista, koordinaattien päivittäminen nopeuden perusteella, painovoiman toteuttaminen.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, joka näyttää sorsan liikkeen luonnollisella lentoradalla laukaisun jälkeen.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Tehtävässä käytetään samaa haravasto-moduulia kuin edellisessäkin. Lisäksi tarvitset sorsapeliä varten suunnitellun grafiikkapaketin, jonka sisällön voit sijoittaa valitsemaasi kansioon. Nämä löydät tehtävänannon resurssit-osiosta, mistä löydät myös pohjan johon tehtävän funktiot tulee sijoittaa. Pohjassa on toteutettu valmiiksi näppäimistöpohjainen käyttöliittymä testaamista varten, sekä piirtokäsittelijä.
\n', 12, 1), ('separator', '\n', 14, 1), ('paragraph', '
1. toteutettava funktio:
\n', 17, 1), ('list', 'alkutila
- Dokumenttimerkkijono: ', 19, 1), ('cleanup', '
"""\nAsettaa pelin takaisin alkutilaan, eli sorsan lähtöpaikkaan, sen nopeudet nollaan, sekä lentotilan epätodeksi.\n"""\n
Funktio päivittää pohjassa olevaan peli-sanakirjaan alkuarvot siten, että x- ja y-koordinaatit asetetaan arvoon 40, molemmat nopeudet arvoon 0, sekä
\n', 26, 1), ('separator', '"lennossa"
-avaimen arvoksi False
.\n', 28, 1), ('paragraph', '
2. toteutettava funktio:
\n', 30, 1), ('list', 'ammu
- Dokumenttimerkkijono: ', 32, 1), ('cleanup', '
"""\nFunktio lähettää sorsan liikkeelle ja laskee sille lähtönopeuden, sijoittaen x- ja\ny-nopeusvektorit globaaliin sanakirjaan.\n"""\n
Funktio laskee kulman ja voiman perusteella kappaleelle x- ja y-suuntaiset nopeudet. Asiaa on käsitelty jo aiemmin eräässä alkupään tehtävässä. Funktio myös merkitsee
\n', 40, 1), ('paragraph', '"lennossa"
-avaimen arvon todeksi, joka kertoo muulle koodille laukaisun tapahtuneen. Tällöin lento-funktio voi aloittaa sorsan sijainnin päivityksen.Funktiolla ei ole parametreja eikä paluuarvoa, vaan se käsittelee suoraan globaalina muuttujana tallennetun sanakirjan
\n', 42, 1), ('separator', 'peli
arvoja.\n', 44, 1), ('paragraph', '
3. toteutettava funktio:
\n', 46, 1), ('list', 'lento
- Dokumenttimerkkijono: ', 48, 1), ('cleanup', '
"""\nFunktio päivittää laatikon muuttuneet x- ja y-koordinaatit kappaleen nopeusvektorien perusteella.\n"""\n
- Parametrit:
- kulunut_aika (liukuluku) ', 54, 2), ('cleanup', '
Toistuvaa käsittelijäfunktiota kutsutaan noin 1/60 sekunnin välein (pieni epätarkkuus on todennäköistä). Parametrissa kulunut_aika ilmoitetaan todellinen kulunut aika edellisestä kutsusta. Parametria ei tarvitse huomioida tällä kertaa harjoitustehtävässä, mutta sitä käytetään apukirjaston funktiokutsussa.
\n', 57, 1), ('paragraph', 'Sorsan laukaisun jälkeen funktio päivittää uudet koordinaatit nopeuden perusteella. Kuten todettu, sorsan aerodynamiikka on erittäin hyvä ellei täydellinen, joten ilmanvastusta ei tarvitse ottaa huomioon. Sorsan nopeus muuttuu täten ainoastaan painovoiman vaikutuksesta, ja ainoastaan y-suunnassa. Käytä putoamiskiihtyvyyden arvona lukua 1.5 - tämä arvo siis vähennetään y-nopeudesta joka funktiokutsulla.
\n', 59, 1), ('paragraph', 'Kun sorsan y-koordinaatti menee nollaan tai alle, lento on päättynyt. Tämä kommunikoidaan pelilogiilkalle kutsumalla alkutila-funktiota. Mikäli sorsaa ei ole laukaistu, funktion ei tule tehdä mitään. Tämä tieto löytyy peli-sanakirjan
\n', 61, 1), ('separator', '"lennossa"
-avaimesta. \n', 63, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 65, 1), ('paragraph', 'Kyseessä on tavallisesta poikkeava tehtävä, sillä et pysty vertailemaan eri syötearvoja ohjelman odotettuun tulosteeseen. Olemme kuitenkin lisänneet peli-ikkunan taustalle muutaman numeron, joiden kautta laatikon tulisi lentää seuraavilla kulma- ja voima-arvoilla. Voit käyttää näitä arvoja ohjelman testaamiseen.
\n', 67, 1), ('table', 'Nro | \nKulma | \nVoima |
1 | \n40 | \n30 |
2 | \n40 | \n40 |
3 | \n80 | \n35 |
4 | \n90 | \n35 |
5 | \n50 | \n45 |
\n', 76, 1), ('paragraph', '
Resurssit:
\n', 78, 1), ('file', ' \n', 81, 1), ('file', ' \n', 83, 1), ('file', ' \n', 85, 1)], 'question': '', 'form': '\n\n\n\n \n \n \n \n \n
\n\n\n', 'revision': 33309, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-lentorata/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-lentorata/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/reset_completion/', 'edit_url': '/exercise-admin/file-upload/601/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/33309/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-lentorata/add/'}}
Lopputyötehtävät 3¶
Näistäkin voi yhden valita. Nämä tehtävät eivät kuulu minimisuoritukseen.
{'slug': 'oa-tulvatutkimus', 'content': [('heading', "Miinatehtävä: Tulvatutkimus¶
\n", 0, 1), ('paragraph', 'Tulvatäyttö on perusalgoritmi, jolla on kaikenlaista käyttöä ohjelmoinnissa. Sillä voidaan mm. selvittää rajattujen, mielivaltaisen muotoisten alueiden pinta-ala. Myös piirto-ohjelmien täyttötoiminto perustuu siihen. Lisäksi tulvatäytöllä voi vaikka navigoida labyrintteja tai laskea kuinka pitkälle pelihahmo voi liikkua vuorossa vaihtelevassa maastossa. Sattumoisin sillä on käyttöä myös Miinojen tallaamisessa, jossa pitäisi avata tyhjiä ruutuja räjähdysmäisesti joka suuntaan, mutta paljastamatta miinoja. Algoritmi ei ole ihan sieltä helpoimmasta päästä keksiä itse ilman ohjelmointikokemusta, joten olemme poikkeuksellisesti kuvanneet tehtävänantoon varsin tarkasti miten tulvatäyttö etenee.
\n', 2, 1), ('paragraph', 'Tässä tehtävässä luotainrobotti tutkii planeetan pintaa ja merkitsee tuntemattomia alueita turvallisiksi, välttäen aiemman skannauksen tutkimat vaaralliset ruudut.
\n', 4, 1), ('paragraph', 'Opittavat asiat: Tulvatäyttöalgoritmin toiminta ja yleisesti hieman monimutkaisempien algoritmien toteuttaminen Pythonilla. Poistojen tekeminen listasta siten, että ohjelma ei muutu jäätävän hitaaksi.
\n', 6, 1), ('paragraph', 'Tavoite: Ohjelma, joka tutkii toisiinsa yhteydessä olevat tuntemattomat ruudut kartalta.
\n', 8, 1), ('separator', '\n', 10, 1), ('paragraph', '
Alustus:
\n', 12, 1), ('paragraph', 'Tehtävässä voit piirtää kentän näkyviin samalla tavalla kuin miinoitus-tehtävässä - ota siis siellä tehty piirra_kentta-funktio käyttöön. Myös main-funktio toimii suurin piirtein sellaisenaan (ks. alla).
\n', 14, 1), ('separator', '\n', 16, 1), ('paragraph', '
1. toteutettava funktio:
\n', 18, 1), ('list', 'tulvataytto
- Dokumenttimerkkijono: ', 20, 1), ('cleanup', '
"""\nMerkitsee planeetalla olevat tuntemattomat alueet turvalliseksi siten, että\ntäyttö aloitetaan annetusta x, y -pisteestä.\n"""\n
- Parametrit:
- täytössä käytettävä planeetta (2-ulotteinen lista)
- täytön aloituspisteen x-koordinaatti (kokonaisluku)
- täytön aloituspisteen y-koordinaatti (kokonaisluku) ', 27, 4), ('cleanup', '
Planeetan kartta sisältää kahdenlaisia merkkejä: tuntemattomia (
\n', 32, 1), ('paragraph', '" "
) ja vaarallisia ("x"
). Turvallista kuvataan "0"
-merkillä. Tehtävänä on korvata aloituspisteesta alkaen kaikki toisiinsa kosketuksissa olevat tuntemattomat alueet turvallisella. Jos tutkimusta yritetään aloittaa vaarallisen ruudun kohdalta kohdalta, ei tehdä mitään. Funktion toteutuksessa tulee seurata allakuvattua algoritmia hyvin tarkasti. Äläkä ainakaan käytä rekursiota
(tiedät käyttäväsi rekursiota, jos kutsut tulvataytto-funktiota sen itsensä sisältä).Tulvatäyttö aloitetaan luomalla uusi lista, jossa on alkiona yksi
\n', 34, 1), ('list', 'monikko
, joka sisältää täytön aloituspisteen. Tämän jälkeen mennään silmukkaan
, jossa pyöritään niin kauan, että kaikki täytettävät alueet on täytetty. Yksi silmukan kierros
etenee seuraavasti: - Otetaan listasta ulos yksi koordinaattipari käsiteltäväksi (huom. se poistetaan listasta) - tähän on olemassa oma listametodinsa.
- Merkitään se turvalliseksi, eli merkitään planeettaan siihen kohtaan "0"
- Käydään vuorotellen läpi kaikki viereiset ruudut (8 kpl) (huomioiden planeetan reunat!) (ks. viime kerran ninja-tehtävä)
- Jos viereinen ruutu on tuntematon, lisätään se koordinaattiparilistaan ', 36, 4), ('cleanup', '
Näin siis koordinaattipareja sisältävä lista kasvaa sitä mukaa kun sitä käydään läpi, ja tyhjenee aivan tyhjäksi asti vasta kun kaikki toisiaan koskettavat tuntemattomat alueet on tutkittu. Turvalliseksi merkitseminen tapahtuu siis silmukan kierroksen alussa; koska koordinaattipari on aiemmalla kierroksella lisätty merkittävien listaan, tiedetään varmuudella, että sen osoittamasta ruudusta löytyy tuntematon ruutu (kohdan 4 tarkistuksen vuoksi).
\n', 41, 1), ('paragraph', 'Funktio ei palauta mitään.
\n', 43, 1), ('separator', '\n', 45, 1), ('paragraph', '
2. toteutettava funktio:
\n', 47, 1), ('list', 'main
- Dokumenttimerkkijono: ', 49, 1), ('cleanup', '
"""\nLataa pelin grafiikat, luo peli-ikkunan ja asettaa siihen piirtokäsittelijän.\n"""\n
- Parametrit:
- planeetta (kenttää kuvaava lista, ks. alempana) ', 55, 2), ('cleanup', '
Funktio pohjautuu miinoitustehtävän main-funktioon. Huomaamme kuitenkin, että alla esitetty planeetta ei mahdu nätisti 600x400 ikkunaan. Muuta siis ikkunan kokoa sopivaksi - kaikkein parhaiten tämä onnistuu, kun mittaat len-funktiolla kentän dimensiot ja kerrot ne yhden spriten dimensioilla.
\n', 58, 1), ('separator', '\n', 61, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 63, 1), ('paragraph', 'Testausta varten kannattaa tehdä
\n', 65, 1), ('code', 'pääohjelma
, jossa kutsutaan luotuja funktioita. Pääohjelmassa voit määritellä seuraavan planeetan: planeetta = [\n [" ", " ", " ", "x", " ", " ", " ", " ", " ", " ", " ", "x", " "], \n [" ", " ", "x", "x", " ", " ", " ", "x", " ", " ", " ", "x", " "], \n [" ", "x", "x", " ", " ", " ", " ", "x", " ", " ", "x", "x", " "], \n ["x", "x", "x", "x", "x", " ", " ", "x", " ", "x", " ", " ", " "], \n ["x", "x", "x", "x", " ", " ", " ", " ", "x", " ", "x", " ", " "], \n [" ", " ", "x", " ", " ", " ", " ", " ", " ", "x", " ", " ", " "]\n]\n
Kutsu sitten tulvataytto-funktiota sopivalla aloituspisteellä. Kutsu lopulta myös main-funktiota, jotta näet miten tulvatäyttö toimii.
\n', 78, 1), ('separator', '\n', 80, 1), ('paragraph', '
Nopeusvaatimukset:
\n', 82, 1), ('paragraph', 'Poiketen kaikista muista tehtävistä kurssilla, tässä tehtävässä liian hidas koodi vaikuttaa pisteisiin tai jopa tehtävän hyväksymiseen. Hitauden syynä on yleensä poistojen tekeminen listasta. Jos listasta poistetaan alusta tai välistä alkioita, tämä aiheuttaa massiivisen siirto-operaation jossa kaikkia listan alkioita poistokohdasta eteenpäin joudutaan siirtämään yhdellä alkua kohti. Pienillä kentillä eroa ei huomaa, mutta tarkistimen kokeilemalla 100x100 kentällä kyllä. Poistot pitää siis tehdä listan lopusta.
\n', 84, 1), ('paragraph', 'Lisäksi remove ei ole hyvä metodi, koska se poistaa sille annetun alkion ensimmäisen esiintymän listasta. Algoritmissa kuitenkin samoista koordinaattipareista päätyy useita kopioita listaan, joten vaikka poistaisit removella viimeisen alkion, todennäköisimmin sen alkion jokin kopio poistetaan aiemmasta kohtaa listaa. Tutki siis listojen metodeja ja etsi paremmin tähän tehtävään soveltuva metodi.
\n', 86, 1), ('paragraph', 'Toinen vaihtoehto liian pitkälle suoritusajalle on se, että teet
\n', 88, 1), ('paragraph', 'ikuisen silmukan
esim. siten, että algoritmi käy läpi uudestaan ruutuja jotka se on jo kerran käynyt läpi ja jää siten pyörimään kehää.Täydet pisteet edellyttävät, että koodi suoriutuu kaikista testeistä alle 10:ssä sekunnissa. Lisäksi tarkistuksessa on kovana aikarajana 20 sekuntia, ja jos tämä ylittyy, koodista ei saa muuta palautetta kuin tiedon, että suoritus aikakatkaistiin. Tämä siksi, että tarkistinpalvelin ei ruuhkaudu tai mene kokonaan jumiin.
\n', 90, 1)], 'question': '', 'form': '\n\n\n\n \n \n \n \n \n
\n\n\n', 'revision': 26461, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-tulvatutkimus/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-tulvatutkimus/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/reset_completion/', 'edit_url': '/exercise-admin/file-upload/404/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/26461/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-tulvatutkimus/add/'}}
{'slug': 'oa-datakaivuri-ikkunassa', 'content': [('heading', "Spektritehtävä: Datakaivuri kaatopaikalla¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä harjoitellaan kaikkeen datan käsittelyyn liittyvää tärkeää perustaitoa, eli datatiedostojen lukemista. Olet saanut tehtävänannon koodaustaidottomalta tutkijalta. Lisäksi tutkija, joka koodia on sinulta pyytänyt, on aivan uskomattoman organisointikyvytön, joten datakansioissa voi olla vaikka mitä roskaa kuten kuvia. Lisäksi osa datatiedostoistakin on rikki. Yleisesti ottaen olisi hyvä, että dataa lukevat ohjelmat pystyvät löytämään oikean datan hieman epämääräisemminkin järjestetyistä kansioista, koska ohjelman rajoituksia on vaikea pitää mielessä kun kiintolevylle tallentelee juttuja tavisten tapaan miten sattuu.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Datan lukeminen useasta
\n', 4, 1), ('paragraph', 'tiedostosta
ohjelman sisälle tietorakenteisiin
. Virheellisten datatiedostojen selvittäminen ja oikeaoppinen tapa käsitellä niitä. Datarivien lukeminen.Tavoite: Ohjelma, joka lukee dataa useasta tiedostosta muistiin.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Jotta tehtävän tekeminen olisi mielekästä, resursseissa on annettu ohjelma, joka luo hakemiston, jossa on satunnaisia datatiedostoja. Kaikki ohjelman tekevät datatiedostot ovat ehjiä, joten sinun tulee käydä itse rikkomassa osa niistä. Samalla voit kopioida kansioon vaikka lomakuvasi koodin ihmeteltäväksi. Aja tämä ohjelma siis terminaalissa ja anna sille
\n', 12, 1), ('paragraph', 'komentoriviargumentiksi
kansio johon haluat puskea datatiedostot.Kopioi myös Ihan tavallinen ikkuna -tehtävästä main-funktio.
\n', 14, 1), ('separator', '\n', 16, 1), ('paragraph', '
1. toteutettava funktio:
\n', 18, 1), ('list', 'lue_data
- Dokumenttimerkkijono: ', 20, 1), ('cleanup', '
"""\nLukee kaikki datatiedostot annetusta kansiosta. Ohittaa tiedostot, jotka eivät\nole päätteeltään .mydat sekä tiedostot, joiden sisältämässä datassa on\nvirheitä. Rikkinäisten tiedostojen nimet ilmoitetaan käyttäjälle.\n"""\n
- Parametrit:
- luettavan kansion polku (merkkijono)
- Palauttaa:
- Datatiedostojen sisällön tietorakenteena(lista, joka sisältää 3 alkion monikkoja)
- Virheellisten .mydat-tiedostojen nimet (lista merkkijonoja) ', 28, 5), ('cleanup', '
Funktion tulee käydä läpi annetun kansion sisältö ja etsiä sieltä kaikki .mydat-tiedostot ja lukea niiden sisältö (muut tiedostot ohitetaan!) Tässä tehtävässä ei tarvitse lukea alikansioita. Data luetaan ohjelman käyttämään tietorakenteeseen vasta kun saavutaan kunkin tiedoston loppuun. Mikäli ennen loppua kohdataan virheellinen rivi, kaikki tiedostossa ollut data hylätään ja tiedoston nimi lisätään virheellisten listaan. Oikeanlaiset datarivit näyttävät tältä:
\n', 34, 1), ('code', "Hammie,154.3578,12.9402\n
Eli rivillä on kolme pilkulla erotettua arvoa, joista ensimmäinen on aina merkkijono. Kukin datarivi luetaan
\n', 40, 1), ('code', 'monikoksi
, joka sisältää merkkijonon ja kaksi liukulukua
, esim: ("Hammie", 154.3578, 12.9402)\n
Nämä monikot kannattaa tallentaa ensin tilapäiseen listaan, ja lisätä vasta tiedoston lopussa varsinaiseen datalistaan. Tämä datalista palautetaan, kun kaikki tiedostot on luettu. Huomaa myös, että tiedostoissa saattaa olla lopussa tyhjä rivi tai sitten ei. Ratkaisutavasta riippuen tämä saattaa vaatia ylimääräistä käsittelyä.
\n', 46, 1), ('separator', '\n', 48, 1), ('paragraph', '
2. toteutettava funktio:
\n', 50, 1), ('list', 'avaa_kansio
- Dokumenttimerkkijono: ', 52, 1), ('cleanup', '
"""\nNapinkäsittelijä, joka pyytää käyttäjää valitsemaan kansion avaamalla\nkansioselaimen. Lataa datan valitusta kansiosta ja ilmoittaa käyttöliittymän\ntekstilaatikkoon montako riviä luettiin sekä virheellisten tiedostojen nimet.\n"""\n
Funktion tulee avata hakemistoselain (ikkunasto-moduulin funktiolla), ja käyttää sen palauttamaa arvoa lue_data-funktion argumenttina. Kun data on luettu, tekstilaatikkoon kirjoitetaan kaikkien viallisten tiedostojen nimet (esim.
\n', 61, 1), ('separator', '"Viallinen tiedosto: x"
) sekä lopulta luettujen datarivien määrä (ts. palautetun datalistan pituus). \n', 63, 1), ('paragraph', '
Muutettava funktio:
\n', 65, 1), ('paragraph', 'main
Vaihda testinapin tekstiksi "lataa" tai jotain muuta kuvaavaa, ja käsittelijäksi juuri tehty
\n', 67, 1), ('paragraph', 'avaa_kansio
.Funktioiden testaaminen:
\n', 70, 1), ('code', 'if __name__ == "__main__":\n main()\n
\n', 78, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 80, 1), ('image', "
\n', 84, 1), ('paragraph', '
Resurssit:
\n', 86, 1), ('file', ' \n', 88, 1)], 'question': '', 'form': '\n\n\n\n \n \n \n \n \n
\n\n\n', 'revision': 34352, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-datakaivuri-ikkunassa/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/reset_completion/', 'edit_url': '/exercise-admin/file-upload/405/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/34352/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-datakaivuri-ikkunassa/add/'}}
{'slug': 'oa-piirillinen-vastuksia', 'content': [('heading', "Piiritehtävä: Piirillinen vastuksia¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä tutustutaan yksinkertaisten piirikaavioiden piirtämiseen käyttöliittymäikkunaan. Vähemmän yllättäen tätä taikuutta tarvitaan piirilopputyössä. Tehtävässä käyttäjä syöttää piiriin vastuksia, ja piirikaavioita päivitetään sitä mukaa kun siihen lisätään jotain. Käytössä on tälläkin kertaa apukirjasto, joka yksinkertaistaa prosessin alkeiskurssille sopivalle tasolle.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Kurssin piiristo-moduulin käyttö piirikaavioiden piirtämiseen. Piirin komponenttien kysely ja tallentaminen graafisessa käyttöliittymässä.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, jolla syötetään sarjaan kytkettyjä vastuksia, ja joka piirtää niistä piirikaavion jännitelähteen kera.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Asennettava moduuli:
\n', 10, 1), ('paragraph', 'SchemDraw
Piirien piirtelyssä taustalla toimii SchemDraw-moduuli. Asennus menee samalla tavalla kuin matplotlibin kohdalla, eli
\n', 12, 1), ('separator', 'pip install schemdraw==0.8
. Kirjastoon voit tutustua sen dokumentaatiossa, mutta tehtävän tekemisen kannalta tämä ei ole tarpeen, koska käytämme omaa apukirjastoa. Huomaa, että asennamme kirjastosta 0.8-version, koska uudempi ei toimi tämänhetkisen SchemCanvas-palikan kanssa. \n', 15, 1), ('paragraph', '
Alustus:
\n', 17, 1), ('paragraph', 'Tarvitset kaksi kurssia varten tehtyä moduulia: piiristo-moduulin, joka tarjoaa funktiot piirien piirtelyyn, sekä SchemCanvas-palikan, jonka avulla SchemDraw saadaan piirtämään käyttöliittymäikkunan sisälle. Tutustu piiristo-moduulin toimintaan lukemalla sieltä löytyvät dokumentaatiomerkkijonot. SchemCanvas-moduuliin ei ole tarpeen tutustua - sen sisältö menee alkeiden ulkopuolelle.
\n', 19, 1), ('file', ' \n', 21, 1), ('file', ' \n', 23, 1), ('paragraph', 'Ohjelman alkuun on jälleen tarpeen määrittää sanakirja, johon talletetaan arvoja sekä viittauksia suorituksen aikana.
\n', 25, 1), ('code', 'tila = {\n "syote": None,\n "laatikko": None,\n "piiri": None,\n "komponentit": [],\n "jannite": 0,\n "taajuus": 0,\n}\n
\n', 38, 1), ('paragraph', '
1. toteutettava funktio:
\n', 40, 1), ('list', 'aseta_jannite
- Dokumenttimerkkijono: ', 42, 1), ('cleanup', '
"""\nLukee liukulukuarvon syötekentästä ja asettaa sen piirin jännitelähteen\njännitteeksi.\n"""\n
Käsittelijäfunktio, joka yrittää lukea liukulukuarvon syötekentästä ja tallentaa arvon tilasanakirjaan. Jos syötekentässä ei ole liukulukuarvoa, annetaan virheilmoitus edellisestä tehtävästä tutulla viesti-ikkunalla. Syötekenttä on ystävällistä myös tyhjätä kun arvo on luettu. Lisäksi kirjoitetaan tekstilaatikkoon, että jännitelähteen jännite on asetettu annettuun arvoon.
\n', 50, 1), ('separator', '\n', 52, 1), ('paragraph', '
2. toteutettava funktio:
\n', 54, 1), ('list', 'aseta_taajuus
- Dokumenttimerkkijono: ', 56, 1), ('cleanup', '
"""\nLukee liukulukuarvon syötekentästä ja asettaa sen piirin jännitelähteen\ntaajuudeksi.\n"""\n
Sama kuin edellinen, mutta taajuudelle.
\n', 64, 1), ('separator', '\n', 66, 1), ('paragraph', '
3. toteutettava funktio:
\n', 68, 1), ('list', 'lisaa_vastus
- Dokumenttimerkkijono: ', 70, 1), ('cleanup', '
"""\nLukee liukulukuarvon syötekentästä, ja lisää vastuksen, jonka resistanssi on\nluettu arvo, piirissä olevaan ainoaan haaraan. Päivittää piirikaaviokuvan.\n"""\n
Sama kuin aiemmat, mutta arvon tallentamisen sijaan komponentit-listaan lisätään uusi alkio: kahden arvon monikko, jossa ensimmäinen arvo on
\n', 78, 1), ('paragraph', '"r"
\xa0ja jälkimmäinen luettu liukulukuarvo. Vastuksen lisäämisen jälkeen piirikaaviokuva tulee päivittää käyttämällä piiristo-moduulin funktioita piirra_jannitelahde
, piirra_haara
\xa0ja piirra_piiri
. SchemDraw on suunniteltu alunperin valmiiden piirien piirtämiseen, joten joka kerta kun kuvaa halutaan "päivittää", se vedetään tyhjäksi ja piirretään uudestaan. Koska tässä tehtävässä sekä lopputyössä piiri alkaa aina jänniteläheestä, tämä nollaus tapahtuu kun
\n', 80, 1), ('paragraph', 'piirra_jannitelahde
-funktiota kutsutaan. Haarat piirretään yksi kerrallaan. Tekemämme piiristo-moduuli huolehtii pääasiassa komponenttien asettelusta, mutta jonkin verran voit joutua säätelemään myös itse (tosin vasta lopputyössä - tämän tehtävän piirtelyt ovat aika suoraviivaisia). Nämä funktiot vasta valmistelevat piirin - ruudulle piirto tapahtuu vasta kun kutsut piirra_piiri
-funktiota. Tutustu mainittujen funktioiden dokumentaatioon, jotta ymmärrät toiminnan yksityiskohdat.
\n', 82, 1), ('paragraph', 'Virheellisestä syötteestä annetaan edelleen virheilmoitus viesti-ikkunan kautta.
\n', 84, 1), ('separator', '\n', 87, 1), ('paragraph', '
4. toteutettava funktio:
\n', 89, 1), ('list', 'main
- Dokumenttimerkkijono: ', 91, 1), ('cleanup', '
"""\nLuo käyttöliittymäikkunan, jossa on vasemmalla puolella syötekenttä\nnumeroarvoille, neljä nappia ja tekstilaatikko. Oikealla puolella on\npiirikaaviokuva.\n"""\n
Käyttöliittymä luodaan samalla tavalla kuin aiemmissa tehtävissä. Napit kytketään juuri tehtyihin funktioihin. Viittaukset syötekenttään, tekstilaatikkoon sekä piirikaavioon tallennetaan tilasanakirjaan. Tekstilaatikon ja piirikaavion mittasuhteet on hyvä asettaa itse.
\n', 100, 1), ('separator', '\n', 102, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 104, 1), ('code', 'if __name__ == "__main__":\n main()\n
\n', 111, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 113, 1), ('image', "
\n \n \n \n \n
\n\n\n', 'revision': 26175, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-piirillinen-vastuksia/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-piirillinen-vastuksia/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/reset_completion/', 'edit_url': '/exercise-admin/file-upload/406/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/26175/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piirillinen-vastuksia/add/'}}
{'slug': 'oa-sorsatehtävä-pudottelu', 'content': [('heading', "Sorsatehtävä: Laatikoiden pudottelua¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä pudotellaan laatikoita. Laatikoiden pudottelussa on tärkeää tarkistaa, että ne eivät päädy toistensa sisälle. Sorsailussa tätä tarvitaan mm. tilanteissa joissa maali on laatikon alla, ja laatikko pitää pudottaa kun maali häviää.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Putoamiskiihtyvyyden soveltaminen laatikoihin. Törmäystarkistusten teko joukolle objekteja.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, joka pudottaa taivaalle arvotun laatikkojoukon alas siten, että laatikot kasautuvat toistensa päälle.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Edellisen tehtävän tapaan käsiteltävä data tulee sijoittaa sanakirjaan, jotta siihen päästään käsiksi käsittelijäfunktioiden sisältä. Käytä siis annettua sanakirjaa. Ohjelmassa on myös määritellä ikkunan koko vakioilla.
\n', 12, 1), ('code', 'IKKUNAN_LEVEYS = 1200\nIKKUNAN_KORKEUS = 600\nPUTOAMISKIIHTYVYYS = 1.5\n\npeli = {\n "laatikot": []\n}\n
\n', 24, 1), ('paragraph', '
1. toteutettava funktio:
\n', 26, 1), ('list', 'luo_laatikot
- Dokumenttimerkkijono: ', 28, 1), ('cleanup', '
"""\nLuo halutun määrän laatikoita ja asettaa ne satunnaisiin kohtiin määritetyn\nalueen sisälle. Laatikot esitetään sanakirjoilla joissa on seuraavat avaimet:\nx: vasemman alakulman x-koordinaatti\ny: vasemman alakulman y-koordinaatti\nw: laatikon leveys\nh: laatikon korkeus\nvy: laatikon putoamisnopeus\n"""\n
- Parametrit:
- Laatikoiden lukumäärä (kokonaisluku)
- Raja jonka yläpuolelle laatikot asetetaan (kokonaisluku)
- Palauttaa:
- Laatikkosanakirjoja sisältävän listan ', 40, 5), ('cleanup', '
Funktio arpoo halutun määrän laatikoita. Laatikot ovat neliöitä (eli leveys == korkeus). Laatikkojen tulee olla ikkunan sisällä sekä halutun rajan yläpuolella. Laatikot saavat olla sisäkkäin (pudotusalgoritmi hoitaa tämän ongelman kunhan putoamistilaa on tarpeeksi). Laatikoiden putoamisnopeus asetetaan 0:aan ja molemmat dimensiot 40:een. Laatikot laitetaan listaan, joka palautetaan.
\n', 46, 1), ('separator', '\n', 48, 1), ('paragraph', '
2. toteutettava funktio:
\n', 50, 1), ('list', 'pudota
- Dokumenttimerkkijono: ', 52, 1), ('cleanup', '
"""\nPudottaa annetussa listassa olevia neliskanttisia objekteja (määritelty\nsanakirjana jossa vasemman alakulman x, y -koordinaatit, leveys, korkeus sekä\nnopeus pystysuuntaan). Funktio pudottaa laatikoita yhtä aikayksikköä\nvastaavan matkan.\n"""\n
- Parametrit:
- Lista sanakirjoja, joista kukin esittää yhtä laatikkoa ', 61, 2), ('cleanup', '
Funktion tulee käydä läpi kaikki listassa olevat objektit ja selvittää niistä kustakin tuleeko laatikon pysyä paikallaan vai pudota. Laatikot tulee käydä läpi perustuen niiden yläreunan korkeusjärjestykseen. Alimpana olevat laatikot siis pudotetaan ensin. Laatikko pysyy paikoillaan jos sen pohja on kiinni maassa (y <= 0) tai toisessa laatikossa kiinni. Molemmissa tapauksissa laatikon pohja asetetaan sille tasolle, johon laatikko on pysähtynyt (eli joko nollaan tai alla olevan laatikon yläreunaan).
\n', 64, 1), ('image', "Putoavaksi todettu laatikko käsitellään siten, että sen y-nopeuteen lisätään putoamiskiihtyvyysvakion arvo, ja tämän jälkeen y-koordinaatista vähennetään y-nopeus. Laatikot siis putoavat kiihtyvällä vauhdilla. Tästä johtuen on myös mahdollista, että laatikot putoavat toistensa läpi ilman kosketusta (kun putoamisnopeus on suurempi kuin alla olevan laatikon korkeus) - tämä tulee käsitellä tarkistuksessa erikseen.
\n', 68, 1), ('paragraph', 'Huom! Vaikka ohjelmassa itsessään on vain 40x40 laatikoita, koodi on syytä kirjoittaa siten, että se toimii myös muun kokoisille laatikoille. Lue siis laatikon leveys ja korkeus aina laatikkoa esittävästä sanakirjasta! Tarkistin testaa koodia erikokoisilla laatikoilla.
\n', 70, 1), ('paragraph', 'Vihje: Kun etsit laatikoiden välisiä kosketuksia, kannattaa edetä verrattavana olevasta laatikosta alaspäin. Eli jos oltaisiin menossa esim yllä olevan kuvan laatikossa 5, vertailut tehtävisiin laatikoihin 4, 3, 2 ja 1. Tällöin vältytään oudoilta reunatapauksilta.
\n', 72, 1), ('separator', '\n', 74, 1), ('paragraph', '
3. toteutettava funktio:
\n', 76, 1), ('list', 'piirra
- Dokumenttimerkkijono: ', 78, 1), ('cleanup', '
"""\nPiirtää kaikki kentällä olevat laatikot näkyviin.\n"""\n
Piirto tapahtuu samalla tavalla kuin edellisissä tehtävissä, mutta laatikoita on nyt useita. Tarvitset siis silmukan niiden läpikäyntiin. Varmista että lisaa_piirrettava_ruutu funktiota kutsutaan kerran jokaiselle laatikolle. Piirrettävät laatikot tulee hakea peli-sanakirjasta
\n', 85, 1), ('separator', '"laatikot"
avaimella. Käytä laatikon kuva-avaimena välilyöntimerkkiä " "
. \n', 87, 1), ('paragraph', '
Funktioiden testaaminen:
\n', 89, 1), ('paragraph', 'Voit käyttää edellisen tehtävän main-funktiota sekä pääohjelmaa avuksi, kunhan vaihdat piirtokäsittelijäksi tekemäsi funktion, ja päivityskäsittelijäksi alla olevan funktion:
\n', 91, 1), ('code', 'def paivita(kulunut_aika):\n pudota(peli["laatikot"])\n
Hetken kuluttua kaikkien laatikoiden tulisi asettua siten, että ne eivät ole toistensa sisällä, ja seisovat "turvallisesti" jonkin päällä. Jos haluat nähdä tarkemmin mitä laatikoille tapahtuu, voit hidastaa putoamista asettamalla päivityskäsittelijän toistovälin isommaksi antamalla aseta_toistuva_kasittelija-funktiolle valinnaisen toisen argumentin. Tästä voi olla hyötyä bugien etsinnässä.
\n', 98, 1)], 'question': '', 'form': '\n\n\n\n \n \n \n \n \n
\n\n\n', 'revision': 33318, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-sorsateht%C3%A4v%C3%A4-pudottelu/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/reset_completion/', 'edit_url': '/exercise-admin/file-upload/647/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/33318/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sorsateht%C3%A4v%C3%A4-pudottelu/add/'}}
Anna palautetta
Kommentteja harjoituksista?