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.
Oheisprojektit: 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 kymmeneen vaiheeseen, joista kaksi ensimmäistä ovat tässä luvussa ja loput luvuissa 8.2 ja 8.3.
Otetaan ennen varsinaisia työvaiheita yleiskatsaus Robots-projektiin.
Robots-projekti
Robots-projekti 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
projekteissa.
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,
muut puuttuvat
tyystin |
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/10: Pohjustavia pikkukysymyksiä
Ennen kuin etenet
Muodosta ensin kokonaiskuva lukemalla yllä oleva kuvaus ja ohjelman osien Scaladoc-dokumentteja sekä silmäilemällä ohjelmakoodia.
Vaihe 1/10: RobotWorld
in peruskorjausta
Valmista koodia on annettu varsin reippaasti, mutta ohjelma ei ole ajokunnossa. Eclipse 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/10: 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.
- Huomaa, että
- Kokeile
Spinbot
-robottien lisäämistä. Niiden pitäisi ilmestyä näkyviin, mutta niitä ei vielä voi liikuttaa. Rikkoa ja korjata voi.
Palauttaminen
Palauta ratkaisusi vaiheisiin 1–2 tällä lomakkeella.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.
Tehtävä jatkuu seuraavissa luvuissa.
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!
Kierrokset 1–13 ja niihin liittyvät tehtävät ja viikkokoosteet on laatinut Juha Sorva.
Kierrokset 14–20 on laatinut Otto Seppälä. Ne eivät ole julki syksyllä, mutta julkaistaan ennen kuin määräajat lähestyvät.
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 ovat suunnitelleet Juha Sorva ja Teemu Sirkiä. Niiden teknisen toteutuksen ovat tehneet Teemu Sirkiä ja Riku Autio käyttäen Teemun toteuttamia Jsvee- ja Kelmu-työkaluja.
Muut diagrammit ja materiaaliin upotetut vuorovaikutteiset esitykset on laatinut Juha Sorva.
O1Library-ohjelmakirjaston ovat kehittäneet Aleksi Lukkarinen ja Juha Sorva. Useat sen keskeisistä osista tukeutuvat Aleksin SMCL-kirjastoon.
Opetustapa, jossa 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+ on luotu Aallon LeTech-tutkimusryhmässä pitkälti opiskelijavoimin. Pääkehittäjänä toimii tällä hetkellä Jaakko Kantojärvi, jonka lisäksi järjestelmää kehittävät useat tietotekniikan ja informaatioverkostojen opiskelijat.
Kurssin tämänhetkinen henkilökunta on kerrottu luvussa 1.1.
Joidenkin lukujen lopuissa on lukukohtaisia lisäyksiä tähän tekijäluetteloon.