Luku 8.2: Robottisimulaattori

../_images/person10.png

Johdanto

../_images/robots.png

Virtuaalirobotit asuvat robottimaailmaksi kutsutussa ruudukossa. Ne toimivat kukin vuorollaan, lähinnä etenevät ja kääntyvät.

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

o1

luokka GridPos

Kuvaa koordinaattipareja. (Tuttu mm. luvusta 6.3.)

valmis

o1

piirreluokka Grid

Kuvaa ruudukkoja yleiskäsitteenä. (Tuttu luvusta 8.1.)

valmis

o1

luetelmatyyppi 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

piirreluokka RobotBrain

Kuvaa robotin “tekoälyä” yleiskäsitteenä.

annettu puutteellisena

o1.robots

luokat Spinbot, Nosebot, Staggerbot, Lovebot ja Slaybot

RobotBrain-luokan alatyyppejä. 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

Squaren alatyyppi. Kuvaa lattiaruutuja, joilla robotit liikkuvat.

annettu puutteellisena

o1.robots

yksittäisolio Wall

Squaren alatyyppi. Kuvaa seinää. (Yksittäisolio riittää, koska kaikki seinäruudut ovat identtisiä.)

annettu puutteellisena

o1.robots

luokka RobotWorld

Gridin alatyyppi vastaavasti kuin GameBoard oli luvun 8.1 pelissä. Kuvaa robottien asuttamia Square-olioista koostuvia ruudukkoja (vrt. GameBoard koostui Glass-olioista). RobotWorld-olio myös pitää kirjaa siitä, minkä robotin vuoro toimia on seuraavaksi.

annettu puutteellisena

../_images/module_robots.png

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.

Oletetaan, että Robots-ohjelma on täydennetty valmiiksi ja toimii annetun spesifikaation mukaisesti. Oletetaan lisäksi, että olemme luoneet yhden robottimaailman ja laittaneet testWorld-nimisen muuttujan viittaamaan siihen. Olemme myös luoneet kaksi robottia ja sijoittaneet ne robottimaailmaan. Kumpikaan roboteista ei ole vielä saanut toimintavuoroa. Tässä tilanteessa suoritamme kokeeksi nämä koodirivit:

testWorld.advanceTurn()
testWorld.advanceFullRound()
testWorld.advanceTurn()
testWorld.addRobot(GridPos(1, 1), North) // oletetaan, että kyseinen ruutu on tyhjä
testWorld.advanceTurn()
testWorld.advanceFullRound()
testWorld.advanceTurn()

Monennenko roboteista vuoro on toimia seuraavaksi?

Valitse seuraavien joukosta paikkansa pitävät väitteet.

Selvennys: Kun alla lukee "olio tietää", se tarkoittaa: "olio on varastoinut omiin ilmentymämuuttujiinsa tai voi muuten aina määrittää yksinkertaisella metodikutsulla tai laskutoimituksella". Tässä ei ole mitään kompia. Tarkoitus on vain kannustaa dokumentaation äärelle ja parantaa ymmärrystäsi annetusta ohjelmasta.

Vaihe 1/9: RobotWorldin 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:

  1. Virheilmoitukset johtuvat siitä, että RobotWorldillä ei ole tarvittavaa height-muuttujaa (eikä widthiä). Sen pitäisi periä ne Grid-piirreluokasta. Kirjoita extends-rimpsu, jolla RobotWorld määritellään Gridin 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 Gridin vaatima tyyppiparametri. (Jos saat virheilmoituksia, joissa esiintyy sana ruutujen tyyppinä Nothing, olet luultavasti unohtanut tämän.)

  2. Korjaa RobotWorld-luokan metodi initialSquare, 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ö viittausta Wall-yksittäisolioon.

    • Huomaa, että Floor on luokka, ei yksittäisolio. Se on parametriton, joten siitä uuden ilmentymän saadaksesi kirjoita Floor() tyhjillä sulkeilla.

  3. 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

  1. Täydennä RobotWorld-luokan metodi addWall.

    • Vinkki: käytä Gridin update-metodia.

  2. Aja ohjelma ja kokeile seinien lisäämistä klikkaamalla ruutuja hiiren oikealla korvalla.

  3. 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.

  4. 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 addRobotia 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.

a drop of ink
Palautusta lähetetään...