You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

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

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:

  • 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:

  • int 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.
  • 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. Testkoden 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 oppgis hvilken spiller som skal utføre det neste trekket. Når spillet er avsluttet (vunnet eller uavgjort) bør dette gå klart frem. 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:

  • 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 printer brettet til brukeren, 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. 


JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet

Bruk av JExercise:

  1. Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.

Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.

Unknown macro: {html}

Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

 

 

 

  • No labels