Versions Compared

Key

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

Oppgaven handler om en TicTacToe-klasse som holder logikken representasjon, logikk og funksjonalitet for å la to spillere spille 'Tre på rad' (Tic-Tac-Toe) gjennom konsollenvia en JavaFX-applikasjon.

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 spillet Tripp-trapp-tresko og klassen TicTacToeTicTacToe-klassen kapsler inn brettet og har metoder for å utføre trekk og sjekke om spillet er avsluttet, og dekkes av del 1 og 2.  I del 3 skal du implementere metoder i klassen din slik at den kan brukes av en JavaFX-applikasjon som er forhåndslagd. Da vil det bli et fullt fungerende spill som tar tekstlig input. Spillerne taste inn ønsket trekk etter tur helt til en spiller har vunnet eller spillet avsluttes uavgjort. Spillet er beskrevet i detalj her.Du står fritt til å implementere dette hvordan du vil, men her følger et forslag. 

Del 1 -

...

Representasjon av brett og spiller

Tilstanden i TicTacToe-objekter er som følger:

  • gridString - en streng som holder styr på hvilke brikker som er lagt på de ulike posisjonene på brettet, enten "X", "O" eller " " (sistnevnt tomme streng 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      " like etter at spiller "X" har plassert en brikke oppe i høyre hjørne (x=2, y=0) og deretter lik "  X    O " like etter at spiller "O" har plassert en brikke i midten nede (feltet må forøvrig 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:

todelt: Den ene er brettet, dvs. hvilke ruter som er tomme, eller har x og o i seg, og den andre er hvilken spiller sin tur det er.

Du står fritt til å velge hvordan tilstanden realiseres med felt i klassen, men et alternativ er å bruke en tegnsekvens på 3x3 = 9 tegn (altså datatypen char) lagret i et felt av typen String eller StringBuilder og bruke tegnene 'x', 'o' (brikkene) og ' ' (tom rute) for å representere rutene. Spilleren som har turen kan representeres med brikken som han/hun legger, altså en char som er 'x' eller 'o'. Nedenfor ser du eksempler på String'er og tilsvarende brett.

Start-tilstand: "         " (ni mellomrom)

Code Block
   |   |   
-----------
   |   |   
-----------
   |   |   

Spiller 'x' har plassert en brikke øverst i midten: " x       "

Code Block
   | x |   
-----------
   |   |   
-----------
   |   |   

Spiller 'o' har plassert en brikke i slutten av andre rad: " x   o   "

Code Block
   | x |   
-----------
   |   | o 
-----------
   |   |   

Lenger ut i spillet: " x  xo xo"

Code Block
   | x |   
-----------
   | x | o 
-----------
   | x | o 

TicTacToe-klassen må 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 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.
  • 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. Testkoden finner du her: objectstructures/TicTacToeTest.java.

Del 2 - Fullt fungerende spill (50%)

...

  • ruten er ledig før brettet oppdateres (okkuperte ruter kan ikke overskrives) og returnerer true hvis en ny brikke har blitt lagt på, false ellers.
  • boolean isOccupied(int x, int y) - returnerer true hvis ruten på posisjon x, y har en brikke og false ellers.
  • char getCurrentPlayer() - returnerer spilleren/brikken som har turen
  • String toString() - returnerer en String-representasjon av brettet, som gjerne kan likne på rutenett-eksemplene over, uten at dette er et krav som testes.

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 kreves ikke (i.e. det er fint mulig å implementere det på andre måter):

Del 2 - Logikk for spillets gang

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

  • 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) og oppdaterer hvilken spiller som skal utføre det neste trekket.

...

Image Removed

...

Og når spillet avsluttes:

Image Removed

...

  • boolean isWinner(char c) - returnerer true om spiller med brikke c har vunnet, false ellers.
  • boolean hasWinner() - returnerer true om spiller har en vinner, false ellers.
  • boolean isFinished() - returnerer true om spillet har en vinner eller brettet er blitt fylt og false ellers. En spiller har vunnet når den har lagt tre brikker på rad, enten horisontalt, vertikalt eller diagonalt.

Del 3 - Fullt fungerende spill, med interaksjon og JavaFX

Det er laget en JavaFX-applikasjon som i praksis gjør to ting: den tar inn tekstlig input fra brukeren og endrer tilstanden i TicTacToe-objektet basert på dette, og den viser spillets toString()-metode i applikasjonsvinduet. For at applikasjonen skal være kjørbar med TicTacToe, må følgende gjøres:

  • GameController, deklarer spillet ditt og initialiser det slik kommentarene i koden forklarer. 
  • TicTacToe, lag en metode void getInput(String in), som tar inn bruker-input (som kommer fra applikasjonen), og endrer tilstanden på spillet tilsvarende. Her kommer det altså inn posisjonen for neste trekk, som så skal bli utført. Formatet på strengen er valgfri, så "21", "2 1", eller "x2y1" vil fungere. Bestem deg for et format, og skriv kode for dette i metoden.
  • Når spillet er ferdig, skal spillerne få vite dette. GameController bruker TicTacToe sin toString()-metode for å vise spillets tilstand. Oppdater denne metoden slik at den returnerer en String som sier at spillet er over og hvem som vant (eller uavgjort) når dette skjer.

Du kan nå kjøre applikasjonen (Game.fxml > Run As > FXML Application) og teste spillet ditt.

Demonstrer spillet ditt for stud.assen din for å få poeng på del 3. Ekstra poeng gis hvis du klarer å slå han / henne (wink)

Met hjelp til kjøring av JavaFX og generelt om øvinger finner du i Hjelp til øvinger.

Include Page
Bunntekst for oppgaver
Bunntekst for oppgaver

 

  • String toString() - metode som representerer en streng-representasjon av brettet - denne metoden bør kalles og skrives til konsollen mellom hvert trekk
  • int getXForInput(String input) - hjelpemetode som mapper fra tastene qweasdzxc til x-koordinater. F.eks. q --> x=0, w --> x=1, ..., c --> x=2.
  • int getYForInput(String input) - hjelpemetode som mapper fra tastene qweasdzxc til y-koordinater. F.eks. q --> y=0, w --> y=0, ..., c --> y=2.
  • void main() - metode som skriver brettet til konsollen, oppgir hvilken spiller som skal utføre det neste trekket, bruker Scanner til å lese inn input fra denne spilleren og oppdaterer brettet. Løkken skal kjøre så lenge spillet ikke er avsluttet.

Demonstrer spillet ditt for studassen din for poeng. Ekstra poeng gis hvis du vinner. 

Include PageBunntekst for JExercise-oppgaverBunntekst for JExercise-oppgaver