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

Harjoitustyö: NysseMeni - kaupunkiseikkailu Tampereella

Harjoitustyö tehdään kahden hengen ryhmissä. Kurssi tarjoaa osan toimannillisuutta ja kurssin puolen koodia on käytettävänä osana harjoitustyötä.

Deadlinet

  • Lopullinen palautus: 30.11.2020
  • Armonaika päätty: 7.12.2020

Toteutettava ohjelma

Tarkoituksena on toteuttaa peli – työnimeltään NysseMeni – jonka osana toimivat Tampereen keskusta-alueella liikkuvia linja-autot ja matkustajat. Voitte kuitenkin itse vaikuttaa siihen, millainen peli lopulta on kyseessä.

Pelin kulku

Ohjelmaa käynnistettäessä näkyviin tulee ensin asetusikkuna. Asetuksien valinnan jälkeen siirrytään pelin pääikkunaan, jossa esitetään pelialueena Tampereen keskustan kartta. Pelialueella näkyvät kaupungilla liikkuvat nysset pysäkkeineen sekä pelaajan pelihahmo.

Pelissä nysset liikkuvat kaupungilla reaaliajassa oikeiden linjojen ja aikataulujen mukaisilla reiteillä. Matkustajat nousevat pysäkeiltä nysseihin ja jäävät toisilla pysäkeillä niistä pois. Pelaaja hallitsee valitsemaanne pelihahmoa, joka voi olla vuorovaikutuksessa muiden pelin toimijoiden kanssa. Hahmo voi olla esim. pelattava matkustaja tai esim. kaupungin yllä lentävä drooni. Pelin varsinaiset tavoitteet jätetään toteuttajien itse päätettäväksi. Peli voi olla esimerksi zombiemaailmanloppuseikkailu tai kaupunkiseikkailu. Peliin voi toteuttaa oman kulkuneuvotyypin.

Toteutus

Ohjelmaan on toteutettu valmiiksi nysset ja perusmatkustajat sekä niitä pyörittävä logiikka. Itse toteutettavaksi jäävät kaupunkiin liittyvä toiminnallisuus, pelattava hahmo, ja pääikkuna. Alla on hahmotelma siitä, miltä valmiin pelin käyttöliittymä saattaisi näyttää:

../../_images/gui_luonnos.png

Monet pelin yksityiskohdat on jätetty pelin kuvauksessa tarkoituksella avoimiksi ja ne voi toteuttaa haluamallaan tavalla. Tällaisia ovat mm.

  • Pelin tavoitteet: Miten pelin loppu ja siinä menestyminen määräytyvät?
  • Pelin käyttöliittymä: Millainen kartta pelissä on? Miten pelin eri toimintoja voidaan suorittaa?
  • Pelin alkutilanne: Mitä pelinappuloita/resursseja pelaajalla on alussa ja miten ne on sijoitettu pelimaailmaan?
  • Omat pelimekaniikat: Onko pelissä toimijoita, joilla on jotain erityistoimintoja?
  • Pelin tilan seuranta: Kenen vuoro on? Milloin peli on päättynyt?

Käyttötapaus

Seuraava toimintojen sarja havainnollistaa pelin käynnistystä ja toimintaa. Itse toteutettavien toimintojen osalta kyseessä on esimerkki, eli pelin ei tarvitse toimia juuri tässä kuvatulla tavalla.

  • Peliohjelma käynnistetään itse toteutetun pääohjelman avulla. Peliohjelma kysyy erillisellä konfiguraatio-ikkunalla pelaajien määrän ja muuta pelin tarvitsemaan alkutietoa pelaajien lukumäärän. Tämän jälkeen se avaa itse toteutettavan pääikkunan, jossa näkyy pelikartta, pelaajan/pelaajien hahmot ja muuta tarvittavaa tietoa.
  • Valmis toteutus tuottaa pelialueelle aikataulujen perusteella joitakin nyssejä ja päivittää niiden sijaintia pelialueella reaaliajassa. Pysäkeillä matkustajia nousee nysseihin ja jää niistä pois.
  • Pelaaja aloittaa pelin klikkaamalla nappulaa pääikkunassa
  • Pelaaja käskee pääikkunan suuntanäppäimillä pelihahmonsa liikkumaan kohti läheistä nysseä, joka poimi juuri mukaansa pari matkustajaa.
  • Pelaaja ampuu nysseä sen toiminnan lamauttavalla aseella. Ammuksen osuessa Nysse pysähtyy ja muuttuu pinkiksi. Nyssen matkustajat joutuvat jalkapatikkaan.
  • Pelaaja hakee kohteekseen uusia nyssejä. Pääikkunassa esitettävää pelin pistesaldoa kasvatetaan paikoilleen jämähtäneistä nysseistä ja jalkapatikkaan joutuneista matkustajista.
  • Viiden minuutin kuluttua peli päättyy, ja lopulliset pisteet esitetään pelaajalle.
  • Pelaaja sulkee pelin.

Oppimistavoitteet

Työssä harjoitellaan seuraavia asioita käytännössä:

  • Olemassa olevan ohjelmakoodin toimintaan tutustuminen ja sen käyttö tarjottujen rajapintojen avulla (sopimussuunnittelun hyödyntäminen)
  • Toiminnallisuuden lisääminen sovellukseen siihen määriteltyjen rajapintojen mukaan (sopimussuunnittelun noudattaminen)
  • Graafisen käyttöliittymän toteuttaminen osaksi ohjelmaa
  • Poikkeusten käsittely ja virhetilanteiden hallinta
  • Oman koodin testaus yksikkötasolla
  • Ohjelman toteuttaminen tiimityönä

Vaatimukset

Harjoitustyöhön on toteutettava vähintään tietyt perusominaisuudet, jotta sen suoritus voidaan hyväksyä. Lisäksi tarjolla on joukko vapaaehtoisia lisäominaisuuksia, joita toteuttamalla voi korottaa työn arvosanaa.

Pakolliset ominaisuudet

Harjoitustyössä on toteutettava ainakin alla olevat ominaisuudet. Minimitoteutuksen täyttävästä työstä voi ansaita hyväksytyn suorituksen (arvosana 1). Perustoteutukselle määriteltyjen ominaisuuksien mukaisella toteutuksella voi työstä ansaita korkeintaan arvosanan 3. Korkeampi arvosana edellyttää myös joidenkin lisäosien toteutusta.

Minimitoteutus (maksimiarvosana 1):

  • Peli kääntyy
  • Peliin on toteutettu jonkinlaiset pelimekaniikat
  • Yksi dialogi-ikkuna (esim. alkumenu, jossa määritellään pelaajamääriä, tavoitteita yms.)
  • Peliin on toteutettu ainakin yksi oma toimija
  • Yksikkötestit on kirjoitettu vähintään Tilasto-luokalle. Kyseinen luokka pitää kirjaa pelin siihenastisista tapahtumista ja laskee tarvittaessa pisteet.
  • Loppudokumentti, josta löytyy:
    • Pelin säännöt
    • Peliohjeet
    • Luokkien vastuujako (luokkakaavio on tässä hyödyllinen)
    • Ryhmän työnjako

Perustoteutus (maksimiarvosana 3):

  • Peli täyttää minimitoteutuksen vaatimukset
  • Peliin on toteutettu graafinen käyttöliittymä kokonaan itse (ei käytetä kurssikirjaston kartanpiirtoa)
  • Pelin pelihahmoa voi liikuttaa pelialueella. Perustoteutuksessa riittää, että hahmon paikkaa voi vaihtaa välittömästi ilman liikeanimaatiota, esim. kursorin osoittamaan paikkaan tai vakiomatkan suuntanappulan osoittamaan suuntaan.
  • Peliin on toteutettu vähintään yksi uniikki toimija lisää
  • Peli toimii
  • Toteutuksen bonuspisteillä voi kompensoida virheitä yhden arvosanan verran

Huipputoteutus (maksimiarvosana 5):

  • Peli täyttää minimi- ja perusvaatimukset
  • Pelissä on vähintään kaksi lisäosaa
  • Toteutuksen bonuspisteillä voi kompensoida virheitä yhden arvosanan verran

Lisäominaisuudet

Alla olevia lisäominaisuuksia ei tarvitse toteuttaa, mutta hyvästä lisäosan toteutuksesta voi ansaita korotuksen arvosanaan. Lähtökohtaisesti kukin lisäosa on arvoltaan 0,5 arvosanaa. Yksittäisen lisäosan arvoa voidaan kuitenkin tarvittaessa kasvattaa myöhemmin, jos se osoittautuu erityisen työlääksi. Korotuksen saaminen edellyttää, että lisäosa on dokumentoitu palautuksessa. Töiden tarkastajat eivät etsi lisäosia palautetusta koodista.

  • Tasainen ruudunpäivitys. Pelialueelle päivitetään tasaisin väliajoin kertyneet muutokset, sen sijaan että jokainen muutos aiheuttaisi erillisen päivityksen. QTimer-luokka voi olla tässä hyödyllinen.
  • Minimaalinen ruudunpäivitys. Toimijan tilan muutoksen seurauksena vain sen välitön ympäristö päivitetään pelialueelle, sen sijaan että koko kartta piirrettäisiin uudelleen.
  • Vieritettävä kartta. Pelialue ei ole sidottu vain Tampereen keskustaan, vaan esitettävä alue vaihtuu pelihahmon liikkeiden perusteella. (max. 1 arvosana)
  • Pelihahmon tasainen liike. Välittömän paikanvaihdon sijaan pelihahmo käskytetään liikkumaan johonkin suuntaan, minkä jälkeen se etenee sinne sopivalla nopeudella.
  • Matkustajamäärät. Kartalla esitetään nysseissä ja pysäkeillä olevien matkustajien lukumäärät, esimerkiksi numerona ikonin yläpuolella.
  • Pelin tilan seuranta. Pelin aikana kerättäviä tilastotietoja esitetään reaaliajassa pääikkunassa.
  • Top10-lista. Peliin toteutetaan Top10-lista, jonka sisältö säilyy pelin sulkemisen ja uudelleenkäynnistyksen yli.
  • Paikallinen moninpeli. Pelissä voi olla samanaikaisesti useampia pelihahmoja (esim. zombiematkustaja ja zombietaistelija), joita eri pelaajat voivat hallita, esimerkiksi yksi hiirellä ja toinen näppäimistöllä. Pisteytys voidaan laskea yhdessä tai erikseen. (max. 1 arvosana)
  • Laaja liikennevälinelikoima. Pelihahmolla on käytettävissään ainakin kolme eri välinettä kaupungilla liikkumiseen
  • Pelihahmon päivitykset. Pelattavaan hahmoon on ostettavissa, kerättävissä tai muulla tavoin hankittavissa päivityksiä, jotka vaikuttavat sen liike- ja hyökkäysominaisuuksiin.
  • Matkustajien kaappaus. Pelihahmo voi napata jollain tavoin mukaansa matkustajia esimerkiksi lamautetuista nysseistä ja kuljettaa niitä kartalla sopivaan paikkaan.
  • Oma lisäominaisuus. Ohjelmaan on toteutettu jokin itse keksitty tämän listan ulkopuolinen lisäominaisuus. Huom! Lisäominaisuuden pitää olla selkeästi koodaustyötä vaativa ominaisuus.
  • Tekoälypelaaja (max. 1 arvosana)
  • Pelin tallettaminen ja tallennuksesta pelin jatkaminen (max. 1 arvosana)
  • Huom! Lisäominaisuuden pitää olla selkeästi koodaustyötä vaativa ominaisuus.
  • Huom! KAIKKI LISÄOSAT PITÄÄ DOKUMENTOIDA PISTEET SAADAKSEEN

Arvosanan määräytyminen

Arvosana koostuu erillisistä osioista ja bonuspisteistä. Loppuarvosanaa rajaa yllä määritellut toiminnalliset vaatimukset. Perustoteutuksesta ylöspäin bonuspisteillä voi kompensoida yhden arvosanan verran pistemenetyksiä. Kahden lisäosan toteuttamisen jälkeen bonuspisteet voivat kompensoida kaksi lisäarvosanaa.

Arvosteltavat osiot:

  • Pelin suunnittelu ja kokonaisrakenne
  • Luokkasuunnittelu ja toteutus
    • Olio-ohjelmoinnin periaatteiden käyttö
    • Luokkien dokumentaatio
  • Poikkeuskäsittely
    • Poikkeusten oikea käyttö ja käsittely
  • Koodin laatu
    • Hyvien ohjelmointitapojen ja -periaatteiden noudattaminen
    • Koodityyli
  • Versiohistoria ja tiimityö
  • Bonuspisteet
    • Annetaan lisäosista ja erityisen hyvin toteutetuista toiminnallisuuksista

Arvosteltavista osoista pisteytys muodostuu:

  • 50% => 1
  • 70% => 2
  • 90% => 3

Lisätyö, joka lasketaan bonuspisteisiin:

  • Ylimääräiset, hyvin toteutetut yksikkötestit (yht. max. 0,5 arvosana)
  • Ylimääräiset uniikit pelitoimijat (yht. max. 0,5 arvosana)
  • Grafiikan taso (max. 1 arvosana)
  • Erittäin hyvä käyttöliittymä (max. 1 arvosana)
  • Taustatarina ja maailman kuvaus (max. 0,5 arvosana)

Esimerkkejä:

  • Vain minimivaatimukset saavutettu ja täydet pisteet arvosteltavista osioista, ei bonuspisteitä, ( 3 + 0 => 1)
  • Minimi ja perusvaatimukset saavutettu, 75% arvosteltavien osioiden pisteistä, 0,5 arvosanan verran bonuspisteitä ( 2 + 0.5 => 2.5)
  • Mimini ja perusvaatimukset saavutettu, 60% arvosteltavien osioiden pisteistä, 2 lisäosaa 60% arvosteltavien osioiden pisteillä (1 + 3.5 => 4 )
    • Vain 3 pistettä huomioidaan saavutetusta 3,5 pisteestä (1 arvosteltavien osioiden kompensaationa, 2 lisäosista)

Ympäristö

Työympäristö haetaan Gitlabista. Jokaisella ryhmällä on oma ryhmän nimellä nimetty repositorio. Kannattaa huomata, että joidenkin ryhmien nimiä on jouduttu muokkaamaan, jotta ne käyvät GitLabin repositorionimiksi. Valmiit toteutuksen osat tulevat myös versionhallinnan kautta saataville.

Luokkakaavio

Ohjelman toteutuksen kannalta olennaiset luokat:

../../_images/ClassDiagram.png

Luokkakaavio

HUOM! Opiskelijoiden toteuttamien luokkien osalta kaavio on täysin kuvitteellinen, luokkia voi olla enemmän (ja on luultavasti syytäkin olla), ja niiden väliset suhteet voivat olla aivan erilaiset.

Rajapintojen Doxygen-dokumentaation saa generoitua suoraan projektista. Tutustu projektiin tarkemmin lukemalla README.

Vihjeitä

  • Selvittäkää mitä kurssin puolen koodissa tarjotaan valmiina
  • Suunnittelussa:
    • Tehkää oma luokkakaavio, joka selkeyttää rakennetta ja työnjakoa
    • Käykää luokkakaavion ja/tai sekvenssien avulla läpi, miten toiminnot etenevät ohjelmassa
  • Aloittakaa koodaaminen vasta kun suunnitelma on selkeä, jolloin voitte keskittyä koodi-lähtöisten ongelmien ratkontaan.
  • Kaikille peliobjekteille voi lisätä tekstipohjaista metadataa.
  • Kurssikirjastossa löytyvistä bugeista ja laajennuksista voi esittää toivomuksia.
    • HUOM! Lisäykset kirjastoon kannattaa ilmoittaa hyvissä ajoin, jotta niiden toteuttaminen on mahdollista ennen harjoitustyön deadlinea. Tehkää suunnittelu ajoissa ja huolella.
Palautusta lähetetään...