# Innkapsling - Card-oppgave

Denne oppgaven handler om to klasser for kortspill: `Card` (kort) og `CardDeck` (kortstokk), der den siste inneholder ett eller flere `Card`-objekter.

I mange sammenhenger vil objekter av en klasse inneholde eller "eie" objekter av andre klasser. Når en klasse er assosiert med én instans av en (annen) klasse er dette en [1-1-assosiasjon](https://www.ntnu.no/wiki/display/tdt4100/Koding+av+1-1-assosiasjoner) og når en klasse er assosiert med flere instanser av en annen klasse er dette en [1-n-assosiasjon](https://www.ntnu.no/wiki/display/tdt4100/Koding+av+1-n-assosiasjoner). I denne oppgaven skal du implementere logikk for en kortstokk som inneholder kort. Nedenfor beskrives begge klassene og metodene disse skal inneholde.

Filene i denne oppgaven skal lagres i [oving3/card](../../src/main/java/oving3/card).

## Card

Oppgavebeskrivelsen for denne deloppgaven er annerledes enn oppgavene dere har møtt tidligere. Istedenfor å få gitt oppgavene her i `README`-en, skal dere lese og forstå den såkalte Javadoc-dokumentasjonen som er skrevet i koden. Javadoc er en måte å skrive dokumentasjon på i Java, og er en standard måte å skrive dokumentasjon på i Java-verdenen. Dette er ofte slik oppgavene blir gitt på eksamen, så det er viktig å kunne lese og forstå Javadoc-dokumentasjonen. Her gjelder det å lese beskrivelsen nøye, og det er ofte fordelaktig å lese testkoden for å forstå hva som forventes av klassen.

> Kjapt tips: Hold musen over metoden/klassen for å lese Javadoc-dokumentasjonen på et fint format.

Den påbegynte koden for `Card`-klassen finner du i [oving3/card/Card.java](../../src/main/java/oving3/card/Card.java).

## CardDeck

Denne klassen må dere lage selv slik som på tidligere øvinger. `CardDeck`-objekter inneholder initielt et visst antall kort av de fire kortfargene `'S'`, `'H'`, `'D'` og `'C'`. Klassen inneholder standardmetoder for å lese hvor mange og hvilke kort, og en metode for å endre tilstand.

Konstruktør:

- `CardDeck(int n)` - fyller kortstokken med de `n` første kortene av hver kortfarge, totalt `n*4` kort, med spar $1$ som første kort, spar $2$ som andre, spar $3$ som tredje, spar $4$ som fjerde, ..., hjerter $1$ som fjortende, hjerter $2$ som femtende, osv. Med andre ord, først alle spar, så hjerter, så ruter og så kløver, alle i stigende rekkefølge.

Lesemetoder:

- `int getCardCount()` - returnerer hvor mange Card-objekter som `CardDeck`-objektet inneholder.
- `Card getCard(int n)` - returnerer kort nr. `n` eller utløser et `IllegalArgumentException` hvis `n` ikke er gyldig. Kort nr. $0$ er det første kortet i kortstokken.

Endringsmetode:

- `void shufflePerfectly()` - stokker kortstokken ved å dele den i to like store deler og flette de to delene perfekt, slik at kortet på toppen forblir på toppen og kortet på bunnen forblir på bunnen (se [http://en.wikipedia.org/wiki/Out_shuffle](http://en.wikipedia.org/wiki/Out_shuffle)).

## Oppgave: Java-kode

Skriv `Card`- og `CardDeck`-klassene, slik at de har ønsket oppførsel og er skikkelig innkapslet. Det kan være lurt å skrive og teste `Card`-klassen først.

Testkode for denne oppgaven finner du i [oving3/card/CardDeckTest.java](../../src/test/java/oving3/card/CardDeckTest.java) og [oving3/card/CardTest.java](../../src/test/java/oving3/card/CardTest.java).
