Prosjektoppgåve - Datastrukturar og Algoritmer

(Sist oppdatert: $Date$)

Prosjektoppgåva i Objektorienter Programmering 2 byggjer vidare på oppgåva frå Objektorientert programmering 1. De skal utvida programmet med ny funksjonalitet. Eit løysingsdøme vert lagt ut for dei som anten ikkje tok kurset i fjor eller som ikkje er nøgd med si eiga løysing.

Merk! Løysingsdømet er ikkje perfekt. Det er meint å vera ei typisk løysing frå haustsemesteret; litt, men berre litt over middels. Evt. lus og feil er ein del av oppgåva for våren; oppussing og forbetring av struktur og kommentarar likeså. Men, dømet løyser problemet, og ein kan ta fatt på våroppgåva utan å måtta skriva heile programmet frå starten.

Minimumskrava til det nye programmet er definert gjennom tre delinnleveringar som kvar skal forbetre éi hovudside ved programmet:

  1. Støtte for fleire typar spel: Vikinglotto, laurdagslotto, tipping som minimum. Gjerne ogso V6 og andre ting de måtte finna på. Dette vil krevja bruk av arv.
  2. Betre grafisk brukargrensesnitt. Mindre bruk av stadige oppsprettvindaugo og introduksjon av nye element som menyar og avkrysningsboksar.
  3. Filbehandling. Detaljane kjem seinare.

Eg har laga eit raskt oversyn over reglane for spela. Dei som er interesserte kan finna fulstendige reglar hjå Norsk Tipping. Der er ingen grunn til å ha med alle detaljar.

Hovudinnleveringa til slutt skal samanfatta alle tidlegare innleveringar i ein heilskapleg løysing som dannar grunnlag for munnleg eksamen. Her er det rom for å inkludera ekstra funksjonalitet for å demonstrera læring utover gjennomsnittet.

Generelle krav til innleveringa

  1. Programmet skal kompilera.
  2. JavaDoc skal vera fullstendig og ordentlig. Generert JavaDoc-dokument skal kunne forevisast.
  3. God bruk av kommentarar gjennom programmet. Alle vanskelege konstruksjonar skal forklarast.
  4. Programmet skal inkludera fullstendig funksjonalitet frå tidlegare leveringar.
  5. Innleveringa er individuell.

Innlevering 1: Arv

I denne øvinga skal me kun sjå på dei klassane som styrer sjølve spelet. Spelaren, spelardatabasen og brukargrensesnittet er uinteressant denne gongen.

Du skal levera ei samling med nye klassar for å organisera fylgjande spel: to variantar av lotto (Lotto og VikingLotto) samt tipping (der resultata ikkje er tilfeldig trekte).

Du må tenkja nøye gjennom designet og grensesnittet for klassene, slik at du unngår kodeduplisering, og gjer det enklast mogleg når du skal innlemma dei nye spela i brukargrensesnittet til innlevering nr. 2.

Læringsmål

  1. Betra forståinga av og ferdigheitene i objektorientert design og programmering gjennom mengdetrening.
  2. Verta kjend med arv som eit designverkemiddel.
Innlevering

Definisjonar

Spel (Game)
Spelet er eit sett med reglar som seier (1) korleis spelarar kan delta i spelet; (2) kven som vinn; (3) korleis premiar vert fordelte. Døme: Lotto, VikingLotto, Tipping, V6
Spelrunde (Round)
Ei spelrunde er ein instans av eit spel. Spelrunda fylgjer reglane definert for spelet, men køyrer sin eigen prosess for å kåra vinnarane og fordela premiane. Ulike runder av same spel er heilt uavhengige, og resultatet i ei runde påverkar ikkje andre rundar. Døme: Lotto-trekninga laurdag 14. januar 2012.
Spelar (Player)
Ein spelar er ein person som tek del i spelet og som dermed har ein sjanse til å vinna. Døme: Petter Hansen jr.
Kupong (Ticket)
Kupongen er ei deltaking i ei spelrunde. I dei fleste spel kan spelaren velja korleis spelaren ynskjer å spela (t.d. kva tal han trur vert trekte). Alle vala som spelaren tek vert nedskrivne på kupongen. (I røynda kan ein levera same kupong til fleire trekningar - femvekers kupong i riktig gamle dagar - de må gjerne støtta det, men det er ikkje viktig.) Døme: Petter Hansen jr. sin kupong til lotto-trekninga 14. januar 2012 med rekkjene 7/17/27/28/29/30/32 og 1/3/5/7/13/17/19.

Hint Det kan løna seg å starta med omgrepa definerte over og sjå korleis dei bør svara til klasser og objekt.

Krav til klassene

  1. Kupong og trekning/spelerunde må vera uavhengige. Ein skal kunna levera inn fleire kupongar til same spelerunde, men der skal berre vera éi trekning (eller kamprunde). Alle kupongane deltek i den same trekninga.
  2. Programmet skal ha støtte for fleire spelerunder, og lagra resultata frå tidlegare rundar. Korleis er eit spel og ei spelrunde representert i objektmodellen din?
  3. De må definera klasser for å handtera VikingLotto, Lotto og (fotball)-tipping.
  4. Klassene må testast; dvs. de må visa ved demonstrasjon korleis de har testa dei.

Testing kan innebera at de integrerer dei nye klassene med det gamle brukargrensesnittet utan at programmet misser funksjonalitet. De kan bruka eigne testprogram, eller de kan bruka JUnit-testar. Helst bør de bruka alle tre metodane, men det viktigaste er at de kjenner de trygge på at klassene verker og at de ikkje treng skriva dei om ved neste innlevering.

Hint Målet i øvinga er å trena på god bruk av arv. Kvar er arv nyttig? Det er ikkje noko mål å bruka mest mogleg arv, men heller best mogleg arv.

Innlevering 2: GUI

I denne øvinga skal de byta ut brukargrensesnittet, slik at det vert penare og ryddigare, og samstundes gje tilgang til dei nye spela som me introduserte i Innlevering 1.

I det nye brukargrensesnittet skal de visa eit større repertoir enn dei statiske funksjonane frå JOptionPane. Det er ikkje slik at ein for ein kvar pris skal unngå JOptionPane, men mange funksjonar i brukargrensesnittet vert enklare å bruka om ein kan gjera fleire ting i same vindauge. De skal visa at de kan instantiera og setja saman objekt til meir komplekse vindauga der de kan kontrollera utsjånaden.

Minimumskrav til GUI

Det nye brukargrensesnittet må sjølvsagt gje tilgang til alle dei nye spela som de har introdusert.

For å gjera brukargrensesnittet enklare å bruka, og verta kjende med større delar av Swing, er dei fylgjande klassene gode å starta med:

    Hovudmenyen bør enten ha knappar for dei ulike funksjonane, eller ein eller annan form for meny, som du kan bruka med musa aleina (utan å måtta tasta inn eit tal).

    Vindauga for å registrera ein spelar skal lata deg skriva alle opplysingar (etternamn, fornamn, adresse) i kvar sitt felt i eitt og same vindauga.

Desse to funksjonane er ein god test på om du har forstått det grunnleggjande brukargrensesnittet, og er om lag det som er forventa av ein C-student. Det er lett å bruka uhorveleg mykje tid på GUI, so før du går vidare med andre GUI-funksjonar bør du forvissa deg om at er à jour med andre delar av pensum, og med andre emne.

Andre gode idéar

Dei som har kapasitet til å gjera GUI utover minimumskravet kan t.d. sjå på fylgjande.

    Du skal kunna visa ei liste over alle spelarar der ein kan velja ein spelar frå lista for å visa personopplysingar og innleverte kupongar.

    I vindauga for å levera ein lottokupong skal du bruka avkryssingsboksar for kvart tal.

Du kan velja om dei ulike funksjonane skal liggja som ulike vindaugo, eller som ulike faner innanfor eitt vindauga.

Minimumskrv til programmet

  1. Programmet skal kunna køyra utan bruk av BlueJ.
  2. Programmet skal gje tilgang til å spela kvart av spela nemnde for innlevering nr. 1.

Innlevering 3: Filar

Den tredje innleveringa handlar om fil- og feilhandsaming. De skal leggja til to nye funksjonar i programmet dykkar.

  1. De skal kunna lasta inn tipperesultat frå ein fil. Sjå detaljar nedanfor.
  2. De skal kunna lagra spelarregisteret på fil, og lasta det inn at neste gong programmet startar. De kan velja sjølv om dette skjer automatisk, eller om brukaren må velja fil. Her er det enklast å bruka Serializable-interfacet.

Dersom de ikkje har spelarregister i systemet, kan de løysa oppgåva ved å lagra spelrunde- eller kupongregisteret i staden.

Filhandsaming bring dykk i kontakt med unntak, og det er ein del av oppgåva å ta hand om alle Checked Exceptions på ein fornuftig måte.

Tipperesultat

Data kan representerast på fil på ei lang rekkje måtar. I denne øvinga har eg laga eit svært enkelt format for å lagra tipperesultatet for ei runde. Runde 1 kan t.d. sjå slik ut:

@@tipping
Week: 1
1: H
2: H
3: B
4: U
5: B
6: H
7: U
8: H
9: H
10: B
11: B
12: U
@@end

Brukaren skal altso kunna velja ei fil som ser slik ut, og lata programmet lasta inn resultatet og lagra det i spelrunda før ein sjekkar kven som vann. Programmet bør sjekka at filen er velforma (fyrste og siste line er rette), og sjekka vekenummeret.

Det er fornuftig å leggja inn feilsjekking, slik at brukaren ikkje får lasta inn resultat for ei runde som allereie er avgjort tidlegare.


Hans Georg / hasc@hials.no