Tämä kurssi on jo päättynyt.

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

../_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.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 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. Kuvaa robottien asuttamia Square-olioista koostuvia ruudukkoja. 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.

Huom. 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 edistää tutustumistasi dokumentaatioon ja 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 tarvittavia width- ja height-muuttujia. Sen pitäisi periä ne Grid-luokasta. Kirjoita extends-rimpsu, jolla RobotWorld määritellään Gridin 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.)
  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.
  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ä Grid-luokan update-metodia.
  2. Aja ohjelma ja kokeile seinien lisäämistä klikkaamalla ruutuja hiiren oikealla korvalla.
  3. 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.
  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

Näytä vinkkiPiilota vinkki

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 addRobotia varten

Näytä vinkkiPiilota vinkki

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.

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