Kurssin viimeisimmän version löydät täältä: O1: 2024
Luku 8.1: Robottisimulaattori
Tästä sivusta:
Pääkysymyksiä: Miten yhdistän oppimiani asioita suuremmassa ohjelmakokonaisuudessa?
Mitä käsitellään? Esimerkkiohjelmaa. Ei varsinaisesti uusia asioita, mutta toistaiseksi monimutkaisin kurssilla käsitellyistä ohjelmakokonaisuuksista.
Mitä tehdään? Ohjelmoidaan.
Suuntaa antava työläysarvio:? Pari tuntia?
Pistearvo: B50.
Oheismoduulit: Robots (uusi).
Johdanto
Tämän kierroksen pihvi tai seitan on ohjelmointiharjoitus, jossa rakennat robottisimulaattorin. Simulaattorin "robottimaailma" on ruudukko, jossa kooltaan ja älyltään vähäiset "robotit" elävät virtuaalista elämäänsä.
Ohjelmointitehtävä jakautuu yhdeksään vaiheeseen, joista kaksi ensimmäistä ovat tässä luvussa ja loput luvuissa 8.2 ja 8.3.
Otetaan ennen varsinaisia työvaiheita yleiskatsaus Robots-ohjelmaan.
Robots-moduuli
Robots-moduuli jakautuu kahteen pakkaukseen. Pakkauksen o1.robots
sisältö mallintaa
simulaattorin sisäistä toimintaa, ja o1.robots.gui
tarjoaa graafisen käyttöliittymän.
Käyttöliittymä on annettu valmiina, eikä sitä käsitellä tässä sen tarkemmin.
Robottisimulaattorin tukena käytämme samaa Grid
-luokkaa, jota käytit lukujen 7.4 ja 7.5
ohjelmissa.
Alla on ensin taulukossa tiiviit kuvaukset simulaattorin tärkeimmistä osista erikseen ja sitten kaavio, joka korostaa osien välisiä suhteita.
Pakkaus | Komponentti | Kuvaus | Tila |
---|---|---|---|
o1 |
luokka GridPos |
Kuvaa koordinaattipareja. (Tuttu luvusta 6.3 ja kierrokselta 7.) | valmis |
o1 |
abstrakti luokka Grid |
Kuvaa ruudukkoja yleiskäsitteenä. (Tuttu luvuista 7.4 ja 7.5) | valmis |
o1 |
suljettu abstrakti
luokka CompassDir |
Kuvaa pääilmansuuntia. Tästä luokasta on täsmälleen neljä ilmentymää, jotka edustavat pohjoista, itää, etelää ja länttä. (Tuttu luvusta 6.3.) | valmis |
o1.robots |
luokka RobotBody |
Kuvaa robotin fyysistä olemusta. Kullakin
RobotBody -oliolla on mm. sijainti ja katsomissuunta.
Robotti voi olla rikki tai ehjä. |
annettu puutteellisena |
o1.robots |
abstrakti luokka
RobotBrain |
Kuvaa robotin “tekoälyä” yleiskäsitteenä. | annettu puutteellisena |
o1.robots |
luokat Spinbot ,
Nosebot , Staggerbot ,
Lovebot ja Psychobot |
RobotBrain -luokan aliluokkia. Kukin näistä kuvaa
erilaista robotin käyttäytymismallia. |
Spinbot
puutteellinen
ja muista vain
tynkä |
o1.robots |
piirreluokka Square |
Kuvaa yksittäistä robottimaailman ruutua yleiskäsitteenä. | valmis |
o1.robots |
luokka Floor |
Square n alatyyppi. Kuvaa lattiaruutuja, joilla
robotit liikkuvat. |
annettu puutteellisena |
o1.robots |
yksittäisolio Wall |
Square n alatyyppi. Kuvaa seinää. (Yksittäisolio
riittää, koska kaikki seinäruudut ovat identtisiä.) |
annettu puutteellisena |
o1.robots |
luokka RobotWorld |
Grid in alatyyppi. Kuvaa robottien asuttamia
Square -olioista koostuvia ruudukkoja.
RobotWorld -olio myös pitää kirjaa siitä,
minkä robotin vuoro toimia on seuraavaksi. |
annettu puutteellisena |
Vaihe 0/9: Pohjustavia pikkukysymyksiä
Ennen kuin etenet
Muodosta ensin kokonaiskuva lukemalla yllä oleva kuvaus ja ohjelman osien Scaladoc-dokumentteja sekä silmäilemällä ohjelmakoodia.
Vaihe 1/9: RobotWorld
in peruskorjausta
Valmista koodia on annettu varsin reippaasti, mutta ohjelma ei ole ajokunnossa. IntelliJ syöksee virheilmoituksia.
RobotWorld
-luokkaa ei ole määritelty kunnolla. Täydennä tuota luokkaa:
- Virheilmoitukset johtuvat siitä, että
RobotWorld
illä ei ole tarvittaviawidth
- jaheight
-muuttujia. Sen pitäisi periä neGrid
-luokasta. Kirjoitaextends
-rimpsu, jollaRobotWorld
määritelläänGrid
in aliluokaksi.- Inspiraatiota voi hakea Viinaharava-pelin
GameBoard
-luokan toteutuksesta. - Lue dokumentaatio huolellisesti ja varmista, että annat oikeat kokonaisluvut yliluokalle konstruktoriparametreiksi.
- Voit tämän tehtyäsi koeajaa ohjelman;
käynnistysolio on
o1.robots.gui.RobotApp
. Näkyviin tulee pelkkää tummaa seinää sisältävä robottimaailma. - Muista myös
Grid
-luokan vaatima tyyppiparametri. (Jos saat virheilmoituksia, joissa esiintyy sana ruutujen tyyppinäNothing
, olet luultavasti unohtanut tämän.)
- Inspiraatiota voi hakea Viinaharava-pelin
- Korjaa
RobotWorld
-luokan metodiinitialSquare
, joka nyt seinittää koko maailman. Metodi on yksityinen, eikä sen kuvaus näy scaladoceissa, mutta haluttu toiminta on kuvattu koodin kommentissa: metodin tulisi määrätä seinät vain maailman reunoille ja muualle lattiaa.- Sinun on siis koordinaattien perusteella
valittava kussakin kohdassa, luodaanko
Floor
-olio vai käytetäänkö viittaustaWall
-yksittäisolioon.
- Sinun on siis koordinaattien perusteella
valittava kussakin kohdassa, luodaanko
- Aja ohjelma. Tyhjän robottimaailman luomisen pitäisi nyt onnistua, mutta uusia seiniä ja robotteja ei vielä pysty luomaan hiirenklikkauksin.
Vaihe 2/9: Sisältöä robottimaailmaan
- Täydennä
RobotWorld
-luokan metodiaddWall
.- Vinkki: käytä
Grid
-luokanupdate
-metodia.
- Vinkki: käytä
- Aja ohjelma ja kokeile seinien lisäämistä klikkaamalla ruutuja hiiren oikealla korvalla.
- Täydennä saman luokan metodi
addRobot
.- Huomaa, että
addRobot
-metodin on huolehdittava useasta toisiinsa liittyvästä osatehtävästä. Varmista, ettet ole unohtanut toteuttaa mitään metodin Scaladoc-kuvauksessa mainittua asiaa. - Paljasta halutessasi lisävinkit alta.
- Huomaa, että
- Kokeile
Spinbot
-robottien lisäämistä. Niiden pitäisi ilmestyä näkyviin, mutta niitä ei vielä voi liikuttaa. Rikkoa ja korjata voi.
Vinkki: addRobot
-metodin osatehtävät
Metodin tulee: 1) luoda robotti; 2) lisätä robotti vuoroluettelon perään; 3) lisätä robotti kyseiseen maailman ruutuun; ja 4) palauttaa viittaus lisättyyn robottiin.
Työvälineitä kuhunkin vaiheeseen:
1) luo uusi RobotBody
-olio;
2) päivitä this.robots
-luetteloa;
3) poimi tietty ruutu maailmasta ja kutsu sen addRobot
-metodia; ja
4) palauta viittaus luomaasi RobotBody
-olioon.
Vinkki: tietyn ruudun poimiminen addRobot
ia varten
Maailma on ruudukko (Grid
).
Ruudukon osaan pääsee käsiksi elementAt
-metodilla.
Poimi näin tietty ruutu ja kutsu tuon ruudun robotinlisäysmetodia.
Palauta ratkaisusi vaiheisiin 1 ja 2. Tehtävä jatkuu seuraavissa luvuissa.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.
Palaute
Huomaathan, että tämä on henkilökohtainen osio! Vaikka olisit tehnyt lukuun liittyvät tehtävät parin kanssa, täytä palautelomake itse.
Tekijät
Tämän oppimateriaalin kehitystyössä on käytetty apuna tuhansilta opiskelijoilta kerättyä palautetta. Kiitos!
Materiaalin luvut tehtävineen ja viikkokoosteineen on laatinut Juha Sorva.
Liitesivut (sanasto, Scala-kooste, usein kysytyt kysymykset jne.) on kirjoittanut Juha Sorva sikäli kuin sivulla ei ole toisin mainittu.
Tehtävien automaattisen arvioinnin ovat toteuttaneet: (aakkosjärjestyksessä) Riku Autio, Nikolas Drosdek, Joonatan Honkamaa, Jaakko Kantojärvi, Niklas Kröger, Teemu Lehtinen, Strasdosky Otewa, Timi Seppälä, Teemu Sirkiä ja Aleksi Vartiainen.
Lukujen alkuja koristavat kuvat ja muut vastaavat kuvituskuvat on piirtänyt Christina Lassheikki.
Yksityiskohtaiset animaatiot Scala-ohjelmien suorituksen vaiheista suunnittelivat Juha Sorva ja Teemu Sirkiä. Teemu Sirkiä ja Riku Autio toteuttivat ne apunaan Teemun aiemmin rakentamat työkalut Jsvee- ja Kelmu.
Muut diagrammit ja materiaaliin upotetut vuorovaikutteiset esitykset laati Juha Sorva.
O1Library-ohjelmakirjaston ovat kehittäneet Aleksi Lukkarinen ja Juha Sorva. Useat sen keskeisistä osista tukeutuvat Aleksin SMCL-kirjastoon.
Tapa, jolla käytämme O1Libraryn työkaluja (kuten Pic
) yksinkertaiseen graafiseen
ohjelmointiin, on saanut vaikutteita tekijöiden Flatt, Felleisen, Findler ja Krishnamurthi
oppikirjasta How to Design Programs sekä Stephen Blochin oppikirjasta Picturing Programs.
Oppimisalusta A+ luotiin alun perin Aallon LeTech-tutkimusryhmässä pitkälti opiskelijavoimin. Nykyään tätä avoimen lähdekoodin projektia kehittää Tietotekniikan laitoksen opetusteknologiatiimi ja tarjoaa palveluna laitoksen IT-tuki. Pääkehittäjänä on tällä hetkellä Markku Riekkinen, jonka lisäksi A+:aa ovat kehittäneet kymmenet Aallon opiskelijat ja muut.
A+ Courses -lisäosa, joka tukee A+:aa ja O1-kurssia IntelliJ-ohjelmointiympäristössä, on toinen avoin projekti. Sen ovat luoneet Nikolai Denissov, Olli Kiljunen ja Nikolas Drosdek yhteistyössä Juha Sorvan, Otto Seppälän, Arto Hellaksen ja muiden kanssa.
Kurssin tämänhetkinen henkilökunta löytyy luvusta 1.1.
Joidenkin lukujen lopuissa on lukukohtaisia lisäyksiä tähän tekijäluetteloon.