Versions Compared

Key

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

...

Oppgaven handler om en TicTacToe-klasse, som holder representasjon, logikk og funksjonalitet for å kunne spille Tripp-trapp-tresko. I Del 1 skal du implementere representasjonen av spillets brett, som testes av referert JExercise-kode. I Del 2 skal du implementere logikken som er nødvendig for å utføre trekk og sjekke om spillet er avsluttet (når en av spillerne har vunnet eller ved uavgjort). Denne delen vil også testes av JExercise-kode. I siste del av oppgaven, Del 3, 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 Tripp-trapp-tresko er forøvrig beskrevet i detalj her.

Brettet bør representeres ved enten en String eller et StringBuilder-objekt. Bruk char til å representere spillerne ('x' og 'o') og char til å representere rutene i brettet ('x', 'o' eller ' ', avhengig av om ruten er tom eller hvilken spiller som har plassert brikken sin der). Brettet vil, som sådan, bestå av 9 chars svarende til hver av plasseringene på brettet. Hvis String velges til å representere brettet vil, f.eks., strengen " x  xo xo" representere brettet under.

Image Added

Del 1 - Representasjon (33%)

Tilstanden i TicTacToe-objekter er som følger:

...

  • gridString - en streng String eller StringBuilder som holder styr på hvilke brikker som er lagt på de ulike posisjonene på brettet, enten "X", "O" eller " " 'x', 'o' eller ' ' (sistnevnt tomme streng char er for tomt felt). Denne strengen vil ha lengde 9 der de tre første tegnene svarer til den første raden, de tre neste til den andre raden og de tre siste til den tredje raden i brettet. Mao vil strengen være lik "         " (tom streng med lengde 9) rett etter spillet har startet, være lik "  X  x      " like etter at spiller "X" 'x' har plassert en brikke oppe i høyre hjørne (x=2, y=0) og deretter lik "  X  x    O  o " like etter at spiller "O" 'o' har plassert en brikke i midten nede (feltet må forøvrig være public slik at JExercise-testen får tilgang til dette).

Del 2 - Logikk (33%)

  • player - en char som representerer hvilken spiller som skal utføre neste trekk (dette feltet må også være public slik at JExercise-testen får tilgang til dette).

TicTacToe-klassen må ha metodene, getStringIndexForCoordinates, makePlacement, hasWon og changePlayer, med følgende oppførsel:også ha følgende metoder:

  • char getCellint getStringIndexForCoordinates(int x, int y) - hjelpemetode som 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.returnerer verdien til ruten på posisjon x, y.
  • boolean isOccupied(int x, int y) - returnerer true hvis ruten på posisjon x, y er okkupert og false ellers.
  • char setCell(char cboolean 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 - setter ruten i posisjon x, y til c. 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.ruten er ledig før brettet oppdateres (okkuperte ruter kan ikke overskrives).
  • String toString() - returnerer en streng-representasjon av brettet. Denne kan gjerne likne på skjermdumpene integrert i oppgaveteksten, men det er ikke et krav.

Det kan være en fordel å implementere en metode som mapper fra x- og y-koordinater til riktig indeks i String eller StringBuilder-objektet, men dette testes ikke av JExercise (i.e. det er fint mulig å implementere det på andre måter):

  • int indexAt(int x, int y) - returnerer String eller StringBuilder-indeksen til posisjon x, y på brettet

 

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

 

Del 2 - Logikk (33%)

TicTacToe-klassen skal nå utvides med metodene, isFinished(), isWinner(char), hasWinner() og play(), med følgende oppførsel:

  • boolean isFinished() - returnerer true om spillet har en vinner eller brettet er blitt fylt og false ellers. En spiller har vunnet når den 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)
  • langs diagonalene.
  • boolean isWinner(char c) - returnerer true om spiller c har vunnet, false ellers.
  • boolean hasWinner() - returnerer true om en av spillerene har vunnet, false ellers.
  • void play(int x, int y) - setter ruten på posisjon x,y på brettet til tegnet til spilleren som utfører trekket (angis av player-feltet).

Implementer støtte for metodene Implementer støtte for tilstand og metoder beskrevet over slik at JExercise-testkoden fullfører feilfritt. Testkoden finner du her: objectstructures/TicTacToeTest.java.

Del

...

3 - Fullt fungerende spill (33%)

Utvid representasjonen og logikken fra Del 1 og 2 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 oppgis hvilken spiller som skal utføre det neste trekket. Når spillet er avsluttet (vunnet eller uavgjort) bør dette gå klart frem. For å gjøre dette bør du lage en toString()-metode som likner på rutenettet illustrert i oppgaven under (dersom du ikke allerede har laget denne i Del 1), en input-løkke som skriver ut brettet til skjerm, spør om neste trekk, utfører dette og gjentar helt til spillet er avsluttet. Bruk Scanner-klasen for å lese inn input (i.e. den posisjonen spilleren ønsker å plassere neste brikke på). Her kan eksempelvis x<whitespace>y<linjeskift> tastes inn i konsollen og leses med int x = Scanner.nextInt(); int y = Scanner.nextInt(); i løkken. Eksempel på interaksjon med brukeren og konsolloutput:

...

Og når spillet avsluttes:

Denne delen er friere enn den første i den forstand at 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, metoder:

...

...

Demonstrer spillet ditt for studassen din for poeng. Ekstra poeng gis hvis du vinnerklarer å slå han / henne

Include Page
Bunntekst for JExercise-oppgaver
Bunntekst for JExercise-oppgaver

...