Ohjelmointiharjoitus 2

Ohjelmointiharjoituksessa opetellaan metodien kirjoittamista. Tarkoituksena on soveltaa tapauksessa 3 opittuja asioita.

Tee itsellesi alihakemisto esim. Tehtava2 Unix-komennolla mkdir Tehtava2 ja sijoita kaikki tehtävässä käytetyt Java-tiedostot sinne.

Tämän ohjelmointiharjoituksen maksimipistemäärä on 100 ja läpäisyraja on 50 pistettä.

Valmiit Java-luokat

Kopioi itsellesi kaikissa tehtävissä tarvittavat tiedostot:

Huom1! Näiden valmiina annettujen luokkien toteutusta ei tarvitse ymmärtää tehtävien ratkaisemiseksi. Edellä olevien linkkien kautta pääsee käsiksi niiden dokumentaatioon, joka on tehty käyttäen javadocia.

Ilmansuunnat on koodattu seuraavalla tavalla:

Osatehtävä 2.1 (max 20 pistettä)

Tässä osatehtävässä toteutetaan robottia kuvaavan luokan Robot metodeja. Robotilla on suunta (jokin ilmansuunnista) ja tieto nykyisestä huoneesta (voi olla myös null). Robotti osaa liikkua eteenpäin komennolla stepForward (mikäli mahdollista), tarkistaa onko eteneminen mahdollista komennolla testForward sekä kääntyä 90 astetta komennoilla turnLeft ja turnRight. Osa robotin metodeista on jo toteutettu, mutta osasta on vain otsikko.

  1. Kopioi itsellesi tiedosto Robot.java, joka sisältää puolivalmiin luokan Robot.
  2. Toteuta metodi testForward. Metodin tulee käyttää Room-luokan metodia possibleDirection.
  3. Toteuta metodi stepForward. Metodi palauttaa true, jos liikkuminen onnistuu ja muuten false. Metodin tulee käyttää Room-luokan metodia moveToDirection.
  4. Toteuta metodit turnLeft ja turnRight.
  5. Kopioi itsellesi tiedosto Main1.java, jossa on puolivalmis pääohjelma Main1. Täydennä pääohjelman loppuun tarpeelliset robotinohjauskomennot (stepForward, turnLeft, turnRight) robotin siirtämiseksi alkupisteestä (0, 2) huoneeseen (2, 0).
  6. Käännä ja testaa ohjelmasi.

Osatehtävä 2.2 (max 20 pistettä)

Tässä osatehtävässä toteutetaan aliluokka MarchingRobot, joka osaa kulkea suoraan eteenpäin annettuun suuntaan, kunnes eteneminen ei enää ole mahdollista.

  1. Tee aliluokka MarchingRobot ja sille metodi
    public Room marchForward(int direction), joka liikkuu annettuun suuntaan, kunnes liikkuminen ei enää ole mahdollista ja palauttaa huoneen, johon päädyttiin.
  2. Kopioi itsellesi pääohjelmatiedosto Main2.java, jossa on valmis pääohjelmaluokka Main2.
  3. Käännä ja testaa ohjelmasi. Robotin pitäisi liikkua labyrintin päästä päähän.

Osatehtävä 2.3 (max 40 pistettä)

Tässä osatehtävässä toteutetaan aliluokka RandomRobot, joka yrittää päästä tavoitehuoneeseen liikkumalla satunnaisiin suuntiin.

  1. Tee aliluokka RandomRobot ja sille metodi
    public void solve(Maze maze, Room goal). Metodissa robotti lähtee liikkeelle huoneesta, jossa se alussa sijaitsee. Joka kierroksella robotti valitsee satunnaisesti ilmansuunnan, johon se etenee ja kulkee annettuun suuntaan. Tämän jälkeen metodi tulostaa labyrintin tilanteen komennolla maze.print().
    Robotti lopettaa toimintansa, kun se saapuu huoneeseen goal. Voit valita, liikkuuko robotti askel kerrallaan vai niin pitkälle, kuin se pääsee. Voit halutessasi käyttää apuna tehtävässä 2.2. toteuttamaasi MarchingRobot-luokkaa.
    Satunnaislukuja muodostetaan Java-kirjaston luokan java.util.Random metodeilla. Laita luokkatiedoston alkuun (ennen luokan määrittelyä) määrittely import java.util.Random;, jotta saat käyttöösi ko. pakkauksen sisällön.
  2. Kopioi itsellesi pääohjelmatiedosto Main3.java, jossa on valmis pääohjelmaluokka Main3.
  3. Käännä ja testaa ohjelmasi. Ohjelma päättyy, kun robottisi on päässyt maaliin, mikä voi tosin kestää pitkään.

Osatehtävä 2.4 (max 40 pistettä)

Tässä osatehtävässä toteutetaan aliluokka SmartRobot, joka löytää tavoitehuoneen missä tahansa labyrintissa, joka ei haaraudu. SmartRobotin toiminnan tulee perustua johonkin muuhun menetelmään kuin satunnaiseen harhailuun.

  1. Tee aliluokka SmartRobot ja sille metodi
    public void solve(Maze maze, Room goal). Metodi kuljettaa robotin labyrintin lävitse tavoitehuoneeseen. Joka askelella tulostetaan labyrintin sisältö komennolla maze.print().
  2. Kopioi itsellesi pääohjelmatiedosto Main4.java, jossa on valmis pääohjelmaluokka Main4.
  3. Käännä ja testaa ohjelmasi.

Harjoituksen palautus

Kirjoita jokaisen palauttamasi java-tiedoston alkuun nimesi ja opiskelijanumerosi lukuunottamatta tiedostoja, joita et ole muuttanut. Näin arvostelu on helpompaa, kun on aina selvää, kuka on koodin laatinut.

Harjoitukset palautetaan jar-apuohjelmalla luotuina paketteina. Seuraava Unix-komento luo jar-tiedoston harj2.jar Java-tiedostoista Luokka1.java ja Luokka2.java.

jar cf harj2.jar Luokka1.java Luokka2.java

Jar-tiedoston sisällön voi katsoa komennolla:

jar tf harj2.jar

VAROITUS. Muista ehdottomasti, että ensimmäinen tiedostonimi on se tiedosto, johon haluat paketin laatia, koska muuten jar-komento kirjoittaa paketin ensimmäisen antamasti tiedoston päälle. Siten komento

jar cf Luokka1.java Luokka2.java

TUHOAA tiedoston Luokka1.java.

Valmis jar-paketti, joka sisältää KAIKKI harjoituksessa käytettävät luokat (myös valmiit luokat) lähetetään sähköpostitse liitetiedostona oman ryhmän tutorille. Kaikkien eri osatehtävien luokat palautetaan samassa paketissa, eli lähetä vain yksi viesti.

Palautus on tehtävä viimeistään keskiviikkona 24.10 klo 16.00. Jos palautus myöhästyy, jokaisen myöhässä palautetun tehtävän arvosana laskee 5 pistettä / myöhästymispäivä.