Luku 8.2: Robottisimulaattori
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.3 ja 9.1.
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 luvussa 8.1.
Alla on ensin taulukossa tiiviit kuvaukset simulaattorin tärkeimmistä osista erikseen ja sitten kaavio, joka korostaa osien välisiä suhteita.
Pakkaus |
Komponentti |
Kuvaus |
Tila |
---|---|---|---|
|
luokka |
Kuvaa koordinaattipareja. (Tuttu mm. luvusta 6.3.) |
valmis |
|
piirreluokka |
Kuvaa ruudukkoja yleiskäsitteenä. (Tuttu luvusta 8.1.) |
valmis |
|
luetelmatyyppi
|
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 |
|
luokka |
Kuvaa robotin fyysistä olemusta. Kullakin
|
annettu puutteellisena |
|
piirreluokka
|
Kuvaa robotin “tekoälyä” yleiskäsitteenä. |
annettu puutteellisena |
|
luokat |
|
|
|
piirreluokka |
Kuvaa yksittäistä robottimaailman ruutua yleiskäsitteenä. |
valmis |
|
luokka |
|
annettu puutteellisena |
|
yksittäisolio |
|
annettu puutteellisena |
|
luokka |
|
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 tarvittavaaheight
-muuttujaa (eikäwidth
iä). Sen pitäisi periä neGrid
-piirreluokasta. Kirjoitaextends
-rimpsu, jollaRobotWorld
määritelläänGrid
in alatyypiksi.Inspiraatiota voi hakea Viinaharava-pelin
GameBoard
-luokan toteutuksesta.Lue dokumentaatio huolellisesti ja varmista, että annat oikeat kokonaisluvut yliluokalle luontiparametreiksi.
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
in vaatima tyyppiparametri. (Jos saat virheilmoituksia, joissa esiintyy sana ruutujen tyyppinäNothing
, olet luultavasti unohtanut tämän.)
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.Huomaa, että
Floor
on luokka, ei yksittäisolio. Se on parametriton, joten siitä uuden ilmentymän saadaksesi kirjoitaFloor()
tyhjillä sulkeilla.
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
inupdate
-metodia.
Aja ohjelma ja kokeile seinien lisäämistä klikkaamalla ruutuja hiiren oikealla korvalla.
Täydennä saman luokan metodi
addRobot
.Tämän 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.
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. 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, Kaisa Ek, Joonatan Honkamaa, Antti Immonen, Jaakko Kantojärvi, Onni Komulainen, Niklas Kröger, Kalle Laitinen, Teemu Lehtinen, Mikael Lenander, Ilona Ma, Jaakko Nakaza, Strasdosky Otewa, Timi Seppälä, Teemu Sirkiä, Joel Toppinen, Anna Valldeoriola Cardó 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, Juha Sorva ja Jaakko Nakaza. 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; sitä 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 suunnitteluun ja toteutukseen on osallistunut useita opiskelijoita yhteistyössä O1-kurssin opettajien kanssa.
Kurssin tämänhetkinen henkilökunta löytyy luvusta 1.1.
Joidenkin lukujen lopuissa on lukukohtaisia lisäyksiä tähän tekijäluetteloon.