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

Compare with Current View Page History

« Previous Version 21 Next »

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

Oppgaven handler om spillet Tripp-trapp-tresko og omfatter to klasser, TicTacToe og TicTacToeProgramTicTacToe-klassen kapsler inn brettet og har metoder for å utføre trekk og sjekke om spillet er avsluttet, og dekkes av del 1 og 2. Disse to delene har JExercise-tester. TicTacToeProgram-klassen lages i del 3 og håndterer tekstbasert interaksjon og bruker TicTacToe. Her skal to spillerne taste inn ønsket trekk etter tur helt til en spiller har vunnet eller spillet avsluttes uavgjort.

Del 1 - Representasjon av brett og spiller

Tilstanden i TicTacToe-objekter er todelt: Den ene er brettet, dvs. hvilke ruter som er tomme, eller har x og o i seg, og den 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)

   |   |   
-----------
   |   |   
-----------
   |   |   

Spiller 'x' har plassert en brikke oppe i høyre hjørne (x=1, y=0): " x       "

   | x |   
-----------
   |   |   
-----------
   |   |   

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

   | x |   
-----------
   |   | o 
-----------
   |   |   

Lenger ut i spillet: " x  xo xo"

   | x |   
-----------
   | x | o 
-----------
   | x | o 

TicTacToe-klassen må ha følgende metoder:

  • char getCell(int x, int y) - returnerer verdien til ruten på posisjon x, y.
  • boolean setCell(char c, int x, int y) - setter ruten i posisjon x, y til c. Metoden må sjekke om 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 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/TicTacToeTestPart1.java.

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

Implementer disse metodene slik at JExercise-testkoden fullfører feilfritt. Testkoden finner du her: objectstructures/TicTacToeTestPart2.java.

Del 3 - Fullt fungerende spill, med tekstlig interaksjon

Lage en TicTacToeProgram-klasse som lar to spillere spille mot hverandre ved å

  • skrive ut brettet som et ordentlig rutenett
  • angi hvem sin tur det er
  • be om og lese inn x, y-posisjon for neste trekk, f.eks. på formen x<whitespace>y<linjeskift> med en Scanner 
  • utføre trekket
  • gjenta dette helt til spillet er avsluttet.

Eksempel på interaksjon med brukeren og konsolloutput:

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


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