Loppuharjoitus
Kurssin loppuharjoituksen tehtävänanto kuvataan seuraavilla sivuilla.
Deadline on 31.1.2008, eli ohjelmakoodi pitää olla palautettuna viimeistään klo 23:59 31.1.2008.
Tehtävän yleiskuvaus - Eekotsi
Tehtävänäsi on toteuttaa pieni hupiohjelma, Eekotsi. Eekotsi on stekt-tunnuksessa elävä digitaalinen lemmikki jota voi ruokkia, hoitaa ja sen kanssa voi leikkiä. Ohjelmasi avulla käyttäjä pystyy katsomaan mitä hänen Eekotsilleen kuuluu sekä ruokkimaan että hoivaamaan sitä. Ohjelmasi säilöö Eekotsin tilan tiedostoon ja päivittää sen tilaa aina kun ohjelmaa ajetaan.
Ohjelman tulostus
Eekotsi-ohjelmasi tuloste koostuu neljästä osasta:
- Inforivit - ohjelma tulostaa kolme inforiviä. Nämä ovat pakollisia, niiden on oltava oikeassa järjestyksessä ja juuri oikeassa muodossa (tarkistusskriptaa varten)
- Iloisuus - kuinka iloinen Eekotsi on asteikolla (hyvin masentunut) -9 - +9 (erittäin iloinen)
- Ruoka - kuinka nälkäinen Eekotsi on asteikolla (kuolemaisillaan)-9 - +9 (ähkyssä)
- Uni - kuinka väsynyt Eekotsi on asteikolla (kuolemanväsynyt)-9 - +9 (virkeä)
- Reaktiolaatikko: kahden erotinrivin erottama yksirivinen reaktiolaatikko, johon tulee se mitä Eekotsi kulloinkin sanoo tai tekee. Rivin tulee alkaa eekotsin nimellä.
- ASCII-kuva Eekotsista. Kuvan saa itse vapaasti suunnitella ja sen koon saa vapaasti määritellä (järkevissä rajoissa)
- Extra-info on valinnainen osa, johon voi laittaa toteutuskohtaista informaatiota Eekotsista.
Esimerkki:
stekt1> ./eekotsi I: +4 <--- (I)loisuus - kertoo kuinka iloinen Eekotsi on R: +2 <--- (R)uoka - kertoo kuinka nälkäinen Eekotsi on U: +1 <--- (U)ni - kertoo kuinka väsynyt Eekotsi on ------ Kiki sanoo: "Purrr" <--- puhelaatikko ------ \\___// |o o| ||V|| <--- ASCII-kuva Eekotsista __| |__ ????? <--- Extra-info stekt1>
Eekotsi-tiedosto
Eekotsin tila tallennetaan tekstitiedostoon eekotsi.dat. Tiedosto koostuu seuraavista riveistä:
- Rivi 0 : Ajankohta: milloin viimeksi Eekotsiohjelma on ajettu, muodossa vvvv-kk-pp-tt-mm-ss
- Rivi 1 : Iloisuus kahtena merkkinä: [+,-]n , missä n on numero välillä 0-9 tai merkki 'X'
- Rivi 2 : Ruoka kahtena merkkinä: [+,-]n , missä n on numero välillä 0-9 tai merkki 'X'
- Rivi 3 : Uni kahtena merkkinä: [+,-]n , missä n on numero välillä 0-9 tai merkki 'X'
- Rivi 4 : Eekotsin nimi merkkijonona. Maksimipituus nimelle on 256 merkkiä.
- Jokaisen rivin (siis myös sen viimeisen) on loputtava unix-tyyliseen rivinvaihtoon eli merkkiin "\n".
- Windows-tyylinen rivinvaihto "\r\n" ja MAC-tyylinen rivinvaihto "\n\r" eivät siis käy.
Nämä viisi riviä ovat pakollisia ja niiden on oltava juuri edelläesitetyssä muodossa. Niiden jälkeen tiedostossa saa olla toteutuskohtaisia rivejä.
- Huomaa, että "eekotsi.dat" - tiedostossa pitää olla aina jokin nimi. Tämä tarkoittaa sitä, että uutta eekotsia luotaessa on eekotsille annettava jokin oletusnimi.
Esimerkki, tiedoston eekotsi.dat sisältö::
2007-11-27-13-24-15 +4 +2 +1 Kiki
Ohjelman toiminta
Aina kun Eekotsi-ohjelma ajetaan, se
- Avaa Eekotsi-tiedoston
- Jos tiedostoa ei ole, se luo uuden Eekotsin arvoilla [+5,+5,+5]
- Jos tiedosto on rikkinäinen tai ei avaudu, tulostaa virheen
- Laskee kuluneen ajan viime ajosta
- Päivittää eekotsin tilan kuluneen ajan perusteella
- Suorittaa käyttäjän antaman komennon
- Jos komento on virheellinen tai sen suorittaminen ei onnistu, palauttaa virheilmoituksen ja jättää komennon suorittamatta.
- Päivittää eekotsin tilan komennon perusteella
- Tallentaa eekotsin tilan tiedostoon
- Tiedoston formaattia ei saa rikkoa
- Tulostaa eekotsin näytölle (ks. ylläoleva kuvaus)
Komennot
Alla on lista pakollisista komennoista. Niiden lisäksi voit toteuttaa haluamasi määrän lisäkomentoja.
./eekotsi
- Katso eekotsia - ei suorita mitään komentoa.
./eekotsi -l
- Leiki eekotsin kanssa.
- Kasvattaa iloisuutta yhdellä.
- Laskee unta yhdellä
- Jos iloisuus kasvaa 10:een, eekotsi pakahtuu onnesta ja kuolee.
- Jos uni laskee -10:een, kuolee eekotsi unen puutteeseen.
./eekotsi -r n
- Anna eekotsille ruokaa.
Kasvattaa kylläisyyttä n yksikön verran
- Parantaa iloisuutta yhdellä jos R oli alle nollan.
- Eekotsi kuolee ähkyyn jos R-arvo nousee 10:een.
- Jos iloisuus kasvaa 10:een, eekotsi pakahtuu onnesta ja kuolee.
./eekotsi -n nimi
- Anna eekotsille nimi
./eekotsi -u [tiedostonnimi]
- Luo uusi eekotsi (esimerkiksi kuolleen tilalle)
- Jos tiedostonimi annettu, kopioi ensin vanha eekotsi annettuun tiedostoon.
Huom Ohjelma käyttää aina eekotsi.dat nimistä tiedostoa. -u-vivulla voidaan vanha eekotsi kopioida talteen tiedostonimi -nimiseen tiedostoon.
Eekotsin elämä ja kuolema
Kun ohjelmasi suoritetaan, se päivittää kuluneen ajan perusteella eekotsin tilaa. Käytä seuraavia sääntöjä:
- Joka tunti eekotsin R-arvo pienenee yhdellä. Jos R tippuu -10:een, eekotsi kuolee nälkään.
- Joka tunti, jos eekotsin R-arvo on alle nollan, eekotsin iloisuus pienenee yhdellä.
- Kolmen tunnin välein eekotsin iloisuus pienenee yhdellä. Jos I tippuu -10:een, eekotsi kuolee suruun.
- Joka tasatunti eekotsi väsyy yhden U-pisteen verran. Jos U tippuu -10:een eekotsi kuolee ylirasituksesta.
- Eekotsi menee nukkumaan kun sen U-arvo on alle 0 ja se on saanut olla tunnin rauhassa. Kun eekotsi nukkuu
- Joka tunti sen U-arvo nousee yhdellä laskemisen sijaan.
- Nälkä kasvaa puolet hitaammin, eli R pienenee yhdellä vain joka toinen tunti.
- Iloisuus ei laske ajan vuoksi, eikä myöskään nälän vuoksi.
- Eekotsi herää kun sen U-arvo saavuttaa +9.
- Jos eekotsi on kuollut, kuolemaksi koitunut arvo muutetaan 'X':ksi, eikä eekotsin tila muutu enää mitenkään, ajan eikä käyttäjän toimenpiteiden perusteella.
- Huomaa, että joskus kuolema voi johtua useasta yhtäaikaisesta syystä.
Voit itse keksiä lisäsääntöjä.
Käytännössä tämä tarkoittaa sitä että:
- Kun ohjelma ajetaan, laske montako kokonaista tuntia on kulunut viime ajosta (Tyyliin: Tunteja = lasketunnit (aikasilloin, aikanyt);)
- Aseta lähtöarvot (tunti = 0; nukkuu = 0; kuollut = 0;)
Lähde suorittamaan tunteja yksi kerrallaan, niin kauan kuin kuollut == 0 ja tunti < Tunteja.
- Jos nukkuu == 0
Jos R < 0
- I = I - 1;
- R = R - 1;
- jos R == -10, kuollut = 1
- Jos ((tunti % 3) == 0), I = I-1;
- jos I == -10, kuollut = 1
- U = U - 1;
- jos U == -10, kuollut = 1
jos U < 0, nukkuu = 1
- Jos nukkuu == 1
- U = U + 1
- Jos ((tunti % 2) == 0), R = R-1;
- jos R == -10, kuollut = 1
- Jos U == 9, nukkuu = 0
- Jos nukkuu == 0
Arvostelu
Työn arvostelu noudattaa suunnilleen seuraavaa kaavaa
- 5 p. - Vain vähän toteutettu tai pieni osa huonolaatuisesti.
- 10 p. - Pieni osa ylläolevasta toteutettu, tai pääosin mutta huonolaatuisesti
- 15 p. - Pääosa ylläolevista toteutettu tai toteutettu huonolaatuisesti
- 20 p. - Kaikki ylläoleva toteutettu
- 25 p. - Kaikki ylläoleva toteutettu + lisäominaisuuksia/erityisen laadukas
Vinkkejä
Olemme kooneet vinkkejä, joista pitäisi olla apua.
Palauttaminen
Työ palautetaan komennolla samaan tapaan kuin muut kurssin työt komennolla /roles/tklab/public/courses/521276P/bin/palauta-harkka.
Eimerkki:
tk1% /roles/tklab/public/courses/521276P/bin/palauta-harkka -f muneekotsi.c Compiling /home/student/muneekotsi ... ok Submiting results to exercise system ... ok
Harjoitus työlle ei ajeta mitään testejä. Ohjelma tarkistaa ainoastaan että koodi kääntyy. Töitä aletaan tarkistaa viimeisen palautuksen jälkeen.
Huom Ohjelmalla voi palautaa vain yhden tiedoston (ohjelman lähdekoodin).