Harjoitustyö
Kevään 2017 verkkokurssilla harjoitustyön vaatimukset päivittyvät tammikuun aikana.
Kurssi suoritetaan tekemällä pakollisia viikkotehtäviä ja pakollinen harjoitustyö. Kurssin arvosana on viikkotehtävistä lasketun keskiarvon ja harjoitustyöstä saadun arvosanan keskiarvo.
Ts. jos viikkotehtävistä saa keskiarvoksi 2.3 (ei pyöristetä kokonaisluvuksi) ja harjoitustyöstä arvosanaksi 1 niin kurssin arvosana on 2 koska (2.3+1)/2.0 = 1.65 ja pyöristyy ylöspäin kakkoseksi
Harjoitustyön aihe
Tärkeimpiä asioita harjoitustyössä on käyttöliittymän komponenttien käyttö. Erityisesti omien komponenttien tuottaminen ja jakaminen muiden käyttöön. Algoritmiset seikat ovat toisarvoisia.
Harjoitustyö pitää toteuttaa järkevällä ja hyvällä ohjelmointitavalla. Tarkistajalla on täydet valtuudet hylätä näennäisesti toimivat mutta purukumilla viritetyt tai muuten epäilyttävät tekeleet.
Harjoitustyöstä on kolme eri tasoa eli tasot yksi (1), kolme (3) ja viisi (5) jotka vastaavat samaa arvosanaa. Jos teet moitteetta tason viisi työn saat harjoitustyön arvosanaksi viisi. Jos toteutuksessa on puutteita niin arvosanasi on matalampi.
Harjoitustyön pitää noudattaa seuraavan tarkistuslistan ohjeita: UX checklist for desktop applications. Lue myös UX guiden tärkeimmät käytettävyysohjeet. Kts. luennot 17-18.
Harjoitustyön yleiset vaatimukset
Seuraavat vaatimukset koskevat kaikentasoisia harjoitustöitä:
- Järkevä toteutustapa eli ei liikaa purukumia, cut and paste -koodia tai muuta huonoja ratkaisuja. Työssä on osoitettava, että on oppinut ja ymmärtänyt kurssilla käytyjä asioita.
- WPF-ohjelma
- Menut - Vähintään File-valikko, Game-valikko, Settings-valikkoa ja Help-valikko. Menun on oltava ohjelmaikkunan levyinen.
- About-dialogi - Sisältää vähintään ohjelman nimen, tekijän nimen, versionumeron ja päiväyksen
- Avustus - Sisältää vähintään lyhyen selityksen kaikista ohjelman ominaisuuksista ja miten niitä käytetään. Avustukseksi kelpaa mm. www-sivu kunhan se avataan ohjelman Help-valikosta.
- Painikkeita ja muita peruskontrolleja
- Access keyt -menuihin
- Käyttöliittymä on toimiva, järkevä ja looginen. Käyttöliittymä ei ole rakennettu vain huitaisemalla komponentit lomakkeelle miten sattuu ja mihin sattuu. Ohjelman on siis noudatettava sivun UX checklist for desktop applications ohjeita.
- Ohjelmassa on oleellisissa kohdissa osattu käyttää valmiita dialogeja (open, save, print ym.)
- Ohjelmakoodin dokumentointi on selkeä ja kattava
- Syöttökentissä on järkevät tarkistukset
- Ohjelma osaa antaa oleellisissa tilanteissa selkeää palautetta. Erilaisista ohjelmassa tapahtuvista toimenpiteistä pitää tulla käyttäjälle jokin vaste, että käyttäjä tietää toiminnon onnistuneen tai epäonnistuneen. Ohjelma jossa vain tyrkitään painikkeita ilman, että mitään näkyvää tapahtuu ei ole hyvä ohjelma.
- MessageBox-luokan käyttäminen on harjoitustyössä kiellettyä.
- Jos ohjelmaikkunan kokoa voi muuttaa niin käyttöliittymä osaa siististi mukautua uuteen ikkunan kokoon. Ikkunan kokoa ei pidä lukita ilman erityisen hyvää perustelua. Ohjelmoijan laiskuus ei ole kelvollinen peruste.
- Ohjelma kääntyy ja käynnistyy muuallakin kuin tekijän omalla tietokoneella. Varokaa absoluuttisia tiedostopolkuja ja muita kone- ja ympäristökohtaisia viritelmiä. Kokeilkaa ohjelmaanne muuallakin kuin kehityskoneessa.
- Pelin tai ohjelman toiminnallisuuden aloittaminen alusta ei tarkoita koko ohjelman sulkemista ja käynnistämistä uudelleen!
- Älä käytä turhaan static-tyyppisiä attribuutteja
- Ohjelma ei saa kaatua
Taso 1
Toteuta Mylly-pelin pelilauta WPF-ohjelmana. Kokeile pelata malliohjelmaa tai malliohjelmaa.
- Tee ohjelma, joka luo Myllyn pelaamiseen sopivan pelialueen. Alue koostuu ympyröistä, jotka on yhdistetty
toisiinsa viivoilla.
- Ohjelman päätoiminnot on tehtävä commandeilla.
- Valikoissa olevien valintojen ja vastaavien painikkeiden pitää siis aktivoitua ja disabloitua sen mukaan onko kyseinen toiminto käytettävissä vai ei.
- Toimintoja EI SAA itse mennä aktivoimaan/disabloimaan muuttamalla painikkeen tai menun IsEnabled-ominaisuutta vaan oikein toteutettu command tekee tämän.
- commandit on toteutettava oikein eli siten, että saman commandin voi lisätä minne tahansa käyttöön ilman, että ohjelmakoodiin tarvitsee koskea.
- Luo pelialue omana kontrollina.
- Pelialueen täytyy skaalautua ohjelmaikkunan koon mukaan.
- Pelialueen muodostamisen apuna voi käyttää mallia (gridcanvas.zip) tai toista mallia (canvas_background.zip)
- Ohjelman päätoiminnot on tehtävä commandeilla.
- Lisää ohjelmaan toiminto, joka lisää pelialueelle nappulan valitsemaasi kohtaan. Toiminto pitää olla
käytettävissä Game-valikon kautta (Game|Insert Piece) ja lomakkeella olevalla painikkeella. Toteuta
komennon avulla.
Nappulan lisäämisen täytyy toimia seuraavalla tavalla:
- Valitse toiminto (painike tai menuvalinta)
- Valitse hiirellä ympyrä johon nappula lisätään
- Nappula ilmestyy ympyrän kohdalle
- Paikkaan jossa on jo nappula ei voi lisätä uutta nappulaa
- Jos kaikki pelialueen paikat on jo täytetty niin uutta ei voi enää lisätä ja lisäämiseen liittyvät valinnat (menu ja painike) eivät ole käytössä
- Lisääminen peruuntuu jos hiirellä valitsee paikan jossa jo on nappula
- Hiirellä voi valita pelilaudalla olevan nappulan. Valittu nappula esitetään muista nappuloista selkeästi poikkeavalla ulkoasulla esim. suurennettuna ja eri värillä. Vain yksi nappula voi olla valittuna.
- Nappuloita voi poistaa pelialueelta valitsemalla hiirellä nappula ja sen jälkeen valitsemalla Game-valikosta Remove Piece (Game|Remove Piece) tai käyttämällä vastaavaa painiketta. Jos nappulaa ei ole valittuna niin poistoon liittyvät toiminnot eivät ole käytettävissä. Tämä on toteutettava Commandin avulla.
- Nappulan voi siirtää toiseen paikkaan valitsemalla hiirellä nappula ja sen jälkeen valitsemalla Game-valikosta Move Piece (Game|Move Piece) tai käyttämällä vastaavaa painiketta. Toiminnon valitsemisen jälkeen valitaan hiirellä paikka johon nappula halutaan siirtää. Toiminto perutaan jos klikataan jo laudalla olevaa nappulaa. Jos nappulaa ei ole valittuna tai pelilaudalla ei ole tyhjiä paikkoja niin siirtämiseen liittyvät toiminnot eivät ole käytettävissä. Toteuta Commandin avulla.
- Ohjelmaikkunan kokoa ei saa kyetä muuttamaan järjettömän pieneksi. Aseta ohjelmaikkunalle järkevä minimikoko jossa pelilaudasta saa vielä hyvin selvää
- Tee pelinappulasta oma kontrolli
- Pelinappula osaa muuttaa ulkoasuaan sen mukaan onko nappula valittuna vai ei.
- Pelinappulalla on oltava myös oma property nappulan värin asettamiseksi.
- Pelinappulan on oltava itsenäinen yleiskäyttöinen kontrolli. Sen on siis toimittava suoraan muissakin ohjelmissa.
- Pelinappula ei tiedä mitään pelilaudasta, pelaajien määrästä tai minkälaisessa pelissä nappulaa käytetään
- Tee pelialueesta oma kontrolli.
- Pelialue tarjoaa MainWindow-luokalle sopivat propertyt ja metodit commandien luomiseen ja asetuksien asettamiseen.
- Kaikki pelialueen varsinainen toiminta pitää sijaita pelialuekontrollissa.
- Pelialue ei tiedä mitään menuista tai sisällä painikkeita
- Pelialueen on oltava itsenäinen kontrolli ja toimittava sellaisenaan muissakin ohjelmissa
- Pelialue on toteutettava tavalla, joka sallii esim. useamman pelialueen yhtäaikaisen toiminnan
- Tee MainWindow-luokasta mahdollisimman yksinkertainen.
- MainWindow huolehtii käytetyistä commandeista
- MainWindow sisältää valikot
- MainWindow sisältää kaikki painikkeet
- MainWindow hoitaa myös asetukset sopivan dialogin avustuksella
- MainWindow ei sisällä yhtään pelinappulaluokan esiintymää.
- MainWindow ei tiedä mitään pelin toiminnasta. MainWindow sisältää yhden kappaleen pelilautoja ja ohjailee peliä tämän tarjoamien metodien ja propertyjen avulla
- Lisää ohjelman Tools-valikkoon Settings-vaihtoehto josta aukeaa modaalinen dialogi, jolla voi määritellä
pelilaudalle lisättävien nappuloiden värin ja pelialueen taustavärin.
- Samassa dialogissa kysytään siis kaksi eri väriä.
- Nappulan värin valinta vaikuttaa vain uusien nappuloiden väriin. Jo lisätyt nappulat pitävät entisen värinsä.
- Dialogissa on oltava standardit OK- ja Cancel-painikkeet.
- Dialogin on oltava yleiskäyttöinen eli sitä voisi halutessaan käyttää jossain muussakin ohjelmassa ilman mitään muutoksia dialogin ohjelmakoodiin. Dialogi ei saa muutella muissa luokissa (MainWindow, pelilauta, pelinappula jne.) olevia propertyja tai staattisia muuttujia.
- Dialogi on toteutettava Microsoftin Custom Dialog Boxes -ohjeessa esitetyllä tavalla
- Jos dialogissa painetaan Enter-painiketta niin se on sama kuin valittaisiin OK
- Jos dialogissa painetaan ESC-painiketta niin se on sama kuin valittaisiin Cancel
- Värit on kysyttävä käyttäjältä tavalla jota kuka tahansa osaisi käyttää. Esim. värikoodin syöttäminen tekstinä ei kelpaa. Saa esim. käyttää valmista ColorDialog-luokkaa
- Asetusdialogin ollessa näkyvissä ei peli ole käytettävissä vaan odotetaan, että dialogi suljetaan.
- Dialogissa on oltava oletuksena valittuna pelissä aiemmin käytössä olevat vanhat värit
- Lisää ohjelman File-valikkoon New Game -valinta, jolla voi aloittaa uuden pelin. Uuden pelin aloittamiseksi EI kelpaa ohjelman uudelleenkäynnistäminen.
- Lisää File-valikkoon Print-valinta josta aukeaa standardi tulostusdialogi ja ohjelma tulostaa pelialueen sisällön nappuloineen valitulle tulostimelle.
- "Pelin päätyttyä" eli kun pelilaudalle on lisätty viisi pelinappulaa on soitettava heres-your-winner.wav-ääni.
- Ohjelma on toteutettava helposti laajennettavalla tavalla. Ratkaisuksi ei siis kelpaa hirvittävän kokoinen If-hässäkkä, joka hajoaa heti jos xamlista muuttaa jotakin, vaan on käytettävä jotain järkeviä tietorakenteita ja käsiteltävä niitä silmukoilla. Ts. Pelilautaa ja sen sisältöä on käsiteltävä silmukoilla ja jonkinlaisen taulukkorakenteen avulla eikä nimeämällä xamliin erikseen jokaista objektia.
Taso 2
Laajenna tason 1 -ohjelmaa seuraavilla ominaisuuksilla:
- Laajenna Settings-dialogia:
- Dialogissa syötetään kummankin pelaajan nimet
- Syötetyt nimet näytetään pelialueen vieressä.
- Jos nimiä ei syötetä käytetään oletuksena jotain geneerisiä nimiä.
- Dialogissa valitaan kummallekin pelaajalle oma väri.
- Dialogissa valitaan myös pelilaudan taustaväri. Väri ei saa olla sama kuin kummankaan pelaajan väri
- Värit täytyy valita ColorDialogilla tai ColorPickerilla.
- Ohjelma osaa myös automaattisesti tallentaa kaikki asetuksensa (pelilaudan väri, pelaajien nappuloiden
värit ja pelaajien nimet) ja ladata ne ohjelman seuraavalla
käynnistyskerralla. kts.
How To: Create a New Setting at Design Time,
ohjelman asetusten tallentaminen
ja Using Application Settings and User Settings
- MainWindow hoitaa kaiken asetuksiin liittyvän.
- Varmista, että ohjelma toimii vaikka mitään asetuksia ei olisi vielä määritelty
- Jos pelilaudalla ei ole vielä yhtään painiketta niin myöskään File|Print-valinta ei ole käytössä.
- Tulosteessa lukee suurella kirjasimella sivun ylälaidassa: Mylly. Tämän tekstin alapuolelle tulostuu kuva pelilaudasta. Varmista, että lauta mahtuu A4-paperille. vinkki
- Pelin päätyttyä on WPF-animaatiolla liikuteltava voittaneen pelaajan nimeä pelilaudan päällä laudan laidalta toiselle vaakasuunnassa edestakaisin ja soitettava heres-your-winner.wav-ääni.
- Peliruudukko ja sen sisältämät nappulat skaalautuvat ikkunan koon mukana. Mitä suurempi ikkuna niin sitä suuremmat nappulat ja ruudukko.
- Uuden pelin voi aloittaa milloin tahansa valikosta File|New Game-valinnalla
- Ohjelmassa on osoitettava, että osaa järkevästi käyttää binding-ominaisuutta
Taso 3
Laajenna tason 2 -ohjelma toimimaan Mylly-lautapelinä. Tarkista pelin säännöt wikipediasta.
- Painikkeita ei enää käytetä/tarvita ja ne voidaan poistaa. Laita kakkostason ohjelmasi talteen ennen kuin poistat painikkeet.
- Peliä pelaa aina kaksi ihmispelaajaa. Ohjelma arpoo aloittajan.
- Ohjelma selvästi ilmoittaa tekstillä ja/tai värillä kumman pelaajan vuoro on kyseessä
- Nappulan lisääminen on pystyttävä tekemään ilman valikkoa tai painiketta eli kukin pelaaja vuorotellen vain valitsee nappuloilleen sopivat paikat pelilaudalta.
- Nappuloiden lisäämisen jälkeen nappulan siirtäminen onnistuu myös ilman erillistä toiminnon valitsemista eli riittää kun valitsee nappulan ja sen jälkeen paikan johon haluaa nappulan siirtää
- Jos siirto on laiton niin kyseistä siirtoa ei voi tehdä. Virhe ilmaistaan värjäämällä valittu kohderuutu punaiseksi. Vaihtoehtoisesti voi näyttää lailliset siirtovaihtoehdot korostettuina esim. punaisella ja jättää kokonaan reagoimatta vääriin siirtoyrityksiin.
- Pelaajan saatua aikaiseksi myllyn pitää hänen valita jokin vastustajan nappuloista poistettavaksi. Peli ei jatku eikä vuoro vaihdu ennen kuin poistettava nappula on valittu ja poistettu. Poistamisesta on huomautettava pelaajille erikseen.
- Kaikki pelin erikoissääntöjä ei tarvitse vielä toteuttaa. Kts. taso 4.
Taso 4
Toteuta tason 3 ohjelma seuraavilla muutoksilla ja lisäyksillä:
- Huomioi myös Myllypelin erikoistilanteet kuten
- Pelaajalla ei ole ollenkaan laillista siirtoa
- Valmiista myllystä ei saa poistaa nappulaa jos muitakin nappuloita on tarjolla.
- Jos pelaajalla on enää kolme nappulaa on hänellä väljemmät siirtorajoitukset
- Asetusdialogista voi valita onko pelaaja ihminen vai tietokone. Tietokoneen voi myös asettaa pelaamaan itseään vastaan. Tietokoneen ei tarvitse olla älykäs pelaaja. Jos tietokone pelaa itseään vastaan niin pelaaminen tapahtuu oletuksena järkevällä nopeudella jotta ihminen kykenee seuraamaan pelin etenemistä.
- Lisää ohjelman asetuksiin mahdollisuus valita ohjelman kieli. Tarjoa oletuksena suomi ja englanti. kts. Lokalisointi
- Asetuksista voi valita kummankin puolueen pelinappulan muodon. Muotoja on tarjolla ainakin ympyrä, kuutio ja kolmio.
- Ohjelma osaa tallentaa kaikki asetusdialogista löytyvät tiedot
Taso 5
Toteuta tason 4 ohjelma seuraavilla muutoksilla ja lisäyksillä:
- Mahdollista nappulan siirtäminen myös Drag & Dropilla eli nappulan voi omalla siirtovuorollaan suoraan raahata toiseen paikkaan.
- Valittaessa nappula tai tartuttaessa hiirellä raahausaikeissa nappulaan osaa ohjelma automaattisesti korostaa ruudut joihin nappulan voi raahata
- Ohjelma animoi varsinaisen siirron eli siirtää sopivalla vauhdilla nappulan jokaisen reitille osuvan ruudun kautta. Jos nappula poistetaan laudalta niin poistettava nappula kutistuu olemattomiin ja katoaa pelipöydältä. Siirto ja nappulan katoaminen on toteutettava WPF-animaatioina.
- Lisää File|Print Full Game -valinta, joka tulostaa koko pelin tapahtumat eikä vain juuri näkyvää tilannetta. Jokaisen nappulan lisäämisen tai poiston jälkeen esitetään tulosteessa omalla sivullaan kyseinen pelitilanne. Sivun ylälaidassa lukee monesko siirto on menossa / montako siirtoa (sivua) kokonaisuudessa on.
- Ohjelmassa on pyrittävä käyttämään bindausta aina kun se on järkevää. Käyttöliittymää suoraan manipuloiva ohjelmakoodi on pidettävä minimissä.
- Yritä noudattaa MVVM-mallia.
Dokumentointi
Harjoitustyön tärkeä osa on dokumentoitu ohjelmalistaus. Osa dokumentointia on ongelman jakaminen selkeiksi ja hyvin nimetyiksi aliohjelmiksi/komponenteiksi/luokiksi. Samoin osa dokumentointia on epämääräisten vakioiden siirtäminen koodista tiedoston alussa oleviin vakiolausekkeisiin.
Dokumentoinnissa on käytettävä XML dokumentaatio kommentteja.
Ohjelmakoodin dokumentoinnin lisäksi on ohjelman Help-valikosta löydyttävä ohje jossa on selkeä kuvaus ohjelmasta, sen toiminnasta ja myös lyhyt käyttöohje.
Palauttaminen
Harjoitustyö palautetaan samalla tavalla kuin viikkotehtävätkin. Jokainen joutuu myös arvostelemaan toisen tekemän harjoitustyön. Harjoitustyön palauttaminen on mahdollista viimeisen viikkotehtävän palauttamisen jälkeen.
Harjoitustyota saa korjata / parannella kerran ensimmaisen palautuksen jalkeen. Esim. palautat harkkasi takarajaan mennessa ja saat tyosta hylatyn arvosanan. Saat korjata tyotasi hyvaksytyksi ja palauttaa sen uudelleen. Toinen vaihtoehto: palautat tyosi ajoissa ja saat arvosanaksi 2. Haluat paremman arvosanan ja korjaat tyotasi ja palautat sen uudelleen parempana ja saat uudeksi arvosanaksi 3.
Valmis työ
Hylätyn työn voi palauttaa uudelleen niin monta kertaa kunnes se hyväksytään. Jo hyväksytyn työn voi palauttaa yhden kerran uudelleen korjattuna ja paranneltuna.
Yleisiä virheitä
Varmista, että työssäsi ei ole seuraavia virheitä tai puutteita:
- Älkää tehkö ohjelman käyttöliittymää roiskimalla kontrolleja sattumanvaraisesti ympäri ikkunaa! Työ ei mene läpi jos käyttöliittymästä näkee heti, että kontrolleja ei ole edes yritetty asetella järkevästi
- Tehkää järkevät ja loogiset valikot
- Älkää keksikö ihan mitä tahansa valikko-otsikoita vaan käyttäkää vakiintuneita valikoita ja vakiintuneessa järjestyksessä
- Älkää laittako mitään toimintoa suoraan valikon nimeen. Kukaan ei odota, että jokin toiminto käynnistyy suoraan valikon nimestä esim. sanasta File.
- Muistakaa määritellä kaikille valikoille accesskeyt
- Tehkää menupalkista koko ohjelman ikkunan levyinen
- Varmistakaa, että menupalkki mukautuu ikkunan kokoon
- Kumpaankin edelliseen liittyen: Lukekaa Windows User Experience Interaction Guidelines tai ITKA112
Käyttäjien kommentit