Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Oppgaven handler om en TicTacToe-klasse, som håndterer nødvendig logikk for å kunne spille 'Tre på rad'. I Del 1 skal du implementere logikken som testes av referert JExercise-kode. I Del 2 av oppgaven skal klassen utvides med støtte for å la spillerne (etter tur) taste inn ønsket trekk helt til en spiller har vunnet eller spillet avsluttes uavgjort. Spillet er beskrevet i detalj her.

Del 1 - Indre logikk (50%)

Tilstanden i TicTacToe-objekter er som følger:

...

  • int getStringIndexForCoordinates(int x, int y) - hjelpemetode som returnerer 
  • boolean makePlacement(String player, int x, int y) - beregner renta og legger det til konto-beløpet
  • String hasWon() 
  • String changePlayer(String player) 

 

Tilstanden i Rectangle-objekter er ikke spesifisert eksplisitt, men må velges slik at metodene nedenfor kan implementerers. Merk at alle metodene jobber med heltallsstørrelser.

Rectangle-klassen har metoder for å spørre om tilstanden og endre tilstanden. Spørremetodene dekker høyde og bredde og koordinatene til øverste venstre og nederste høyre hjørne og om rektanglet inneholder spesifikke punkt(er). Endringsmetodene dekker utviding ved å legge til punkter.

Logikken til metodene må tilfredsstille følgende krav:

  • et Rectangle-objekt er tomt i starten
  • et tomt Rectangle-objekt skal returnere 0 for alle get-metodene (minX, minY, maxX, maxY), true for isEmpty og false for contains-metodene.
  • et punkt har bredde og høyde lik 1, så dersom en legger punktet x,y til et tomt Rectangle-objekt, så skal getMinX og getMaxX returnere x, getMinY og getMaxY skal returnere y og getWidth og getHeight skal returnere 1.
  • når en utvider et Rectangle-objekt med en av add-metodene, så skal ikke rektanglet bli større enn nødvendig.

Spørremetoder:

  • int getMinX() og int getMinY() - returnerer henholdsvis x- og y-koordinatene til punktet med lavest x,y-verdier som er inneholdt i dette rektanglet. Dersom dette rektanglet er tomt, så skal 0 returneres.
  • int getMaxX() og int getMaxY() - returnerer henholdsvis x- og y-koordinatene til punktet med høyest x,y-verdier som er inneholdt i dette rektanglet. Dersom dette rektanglet er tomt, så skal 0 returneres.
  • int getWidth() og int getHeight() - returnerer henholdsvis bredden og høyden til rektanglet. Begge skal returnere 0, dersom dette rektanglet er tomt.
  • boolean isEmpty() - returnerer true om rektanglet er tomt, dvs. om bredden og/eller høyden er 0.
  • boolean contains(int x, int y) - returnerer true om punktet x,y er inneholdt i dette rektanglet, og false ellers.
  • boolean contains(Rectangle rect) - returnerer true om hele rect, dvs. alle punktene i rect er inneholdt i dette rektanglet, og false ellers. Dersom rect er tomt, så skal false returneres.

Endringsmetoder:

  • boolean add(int x, int y) - utvider (om nødvendig) dette rektanglet slik at det (akkurat) inneholder punktet x,y. Etter kallet skal altså contains(x, y) altså returnere true. Returnerer true om dette rektanglet faktisk ble endret, ellers false.
  • boolean add(Rectangle rect) - utvider (om nødvendig) dette rektanglet slik at det (akkurat) inneholder hele rect-argumentet. Returnerer true om dette rektanglet faktisk ble endret, ellers false. Dersom rect er tomt, så skal dette rektanglet ikke endres.

Andre metoder:

  • Rectangle union(Rectangle rect) - returnerer et nytt Rectangle-objekt som tilsvarer kombisjonen av dette rektanglet og rect-argumentet. Alle punktene som finnes i ett av rektanglene skal altså være inneholdt i rektanglet som returneres.

Del 1 - Indre logikk (50%)

Tegn et objekttilstandsdiagram for en tenkt bruk av Rectangle-klassen. Velg en sekvens av kall som bruker alle fire endringsmetoder.

  • tar inn x- og y-koordinater som svarer til posisjoner på brettet og returnerer tilsvarende indeks i gridString-strengen. Her skal x,y=(0,0) returnere index=0, x,y=(1,0) returnere index=1, ..., og x,y=(2,2) returnere index=8.
  • boolean makePlacement(String player, int x, int y) - metode som tar inn koordinatene til ønsket trekk i tillegg til spilleren som prøver å gjøre trekket. Metoden må sjekke om trekket er tillatt (må være innenfor brettet og posisjonen kan ikke være okkupert av en annen brikke), oppdatere brettet tilsvarende og returnere true. I motsatt tilfelle skal den returnere false.
  • String hasWon() - metode som skal sjekke hvorvidt spillet er blitt vunnet. Dette skjer når en spiller har lagt tre brikker på rad. Dette kan være enten langs en rad, en kolonne eller på tvers. Dersom dette er tilfelle skal "X" eller "O" returneres, avhengig av hvem som har vunnet. Dersom ingen har vunnet skal null returneres. Og dersom hele brettet er fylt med brikker uten at noen har vunnet skal "draw" returneres.
  • String changePlayer(String player) - tar inn "X" eller "O" og returnerer streng-representasjonen til neste spilleren til å gjøre et trekk (i.e. den motsatte spilleren)

Implementer støtte for tilstand og metoder beskrevet over slik at JExercise-testkoden fullfører feilfritt. Denne koden JExercise-testkode for denne oppgaven finner du her: objectstructures/TicTacToeTest.java.

 

Del 2 - Fullt fungerende spill (50%)

Utvid logikken fra Del 1 med støtte for å la to spillere spille mot hverandre ved å taste inn ønskede trekk (posisjoner) gjennom konsollen. Hver runde bør brettet printes til konsollen og det burde oppgis hvilken spiller som skal utføre det neste trekket. Når spillet er avsluttet (vunnet eller uavgjort) bør dette gå klart frem. Denne oppgaven er friere i den forstand den ikke stiller krav til hvordan beskreven funksjonalitet implementeres. Likevel gis følgende tips til hvordan dette kan løses:

 

TicTacToe-klassen bør inneholde følgende, eller tilsvarende, metode

  • String toString() - metode som representerer en streng-representasjon av brettet - denne metoden bør kalles og skrives til konsollen mellom hvert trekk

 

Skriv Java-kode for Rectangle-klassen med oppførsel som er beskrevet over.

...