Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Oppgaven går ut på å implementere spillet Slagskip (eng: Battleship) (http://en.wikipedia.org/wiki/Battleship_(game)) som  som skal kunne kjøres i konsollenen JavaFX-applikasjon. Det er to spillere, med hvert sitt brett med utplasserte skip. Ulike typer skip har ulik størrelse og fasong. Målet er å senke alle motstanderens skip ved å bombe rutene som skipene dekker. Motstanderens skip er skjult for spilleren i starten, men siden en etter å ha bombet en rute får vite om en har truffet eller ikke, så får en oversikt over motstanderens brett etterhvert. Et skip er senket når alle rutene det dekker er truffet. Spillet er vunnet når en spiller har senket alle motstanderens skip.

...

  • Programmet må bestå av minst tre to klasser (de trenger ikke ha samme navn som under):

    • Cell – en klasse for å representere innholdet i og tilstanden til en rute på brettet.

    • BattleshipBoard – en klasse for selve spillbrettet.BattleshipProgram – et hovedprogram for interaksjon med spilleren.

  • Brett-klassen må kunne initialiseres med en String på standard-formatet, som beskrevet under.

  • Spillet skal støtte to spillere med hvert sitt brett.

  • Spillet må veksle mellom de to spillerne og skrive ut til konsollet hvilken spiller sin tur det er og brettet med oversikt over bom og treff for denne spilleren. Så skal de kunne skrive inn koordinatene for neste bombe.

  • En spiller skal ikke få lov til å bombe en rute han allerede har bombet.

  • Etter at en bombe er sluppet så skal det komme en tekstlig beskjed i konsollen om det var treff eller ikke, i tillegg til å kunne se det på motstanderens brett.

  • Når en av spillerene har vunnet skal spillet stoppes, og det skal skrives til konsoll det gis beskjed om hvem som vant.

Eksempelbrett

...

Tips: Lag en egen klasse Levels.java som har disse eksempelbrettene som felt (tilstand). De kan være public static final. final betyr at verdien til variabelen ikke kan endres etter den er initialisert. Se /sokoban/SampleLevels.java SokobanSampleLevels for inspirasjon.

Forslag til grafisk implementasjon og gjennomførelse av to runder:

...

TegnForklaring
~Hav. Uskutt rute. Ligner på bølge, ikke sant?
.Skutt rute, men ingen skip truffet.
XSkip truffet.

...


Input fra brukeren er markert i grønt, og kommer egentlig fra JavaFX-applikasjonen (under).

Code Block
themeEclipse
// Player 1's turn:
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |

2 2
That's a miss...
 
// Player Two's turn:
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |


5 6
That's a hit!
 
// Player One's turn:
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ . ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |


2 5
That's a miss...

// Player Two's turn:
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ X ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ |

JavaFX-

...

applikasjon

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

  • GameController, deklarer spillet ditt og initialiser det slik kommentarene i koden forklarer. 
  • BattleshipBoard, 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 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 BattleshipBoard 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 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. 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.

Konsollbasert IO er greit for å teste spillet, men det er kanskje artigere å lage en ordentlig app, med grafisk visning av rutenettet og bruk av musa for å klikke på ruter du vil skyte. Vi har laget en JavaFX-basert app, som du kan laste ned og koble til din Battleship-klasse. App-koden forutsetter at spill-logikken er implementert i en klasse Battleship som implementerer IBattleship-grensesnittet (i pakken games.battleship). Med bruk av grensesnitt, så gjøres det klart hvilke metoder appen trenger og som du må implementere.

Last først ned IBattleship-grensesnittet fra /games/battleship/battleship1/IBattleship.java, og programmer din spill-klasse slik at den implementerer dette grensesnittet. Så laster du ned app-klassene (og filene), så du kan prøve om det virker. Husk at du må endre en linje i BattleshipFX.fxml slik at den peker på klassen din som implementerer IBattleship-grensesnittet.  

Fil-tre som må lastes ned evt. importeres med Digital Compendium-panelet:

Code Block
titlebattleship.emfs
collapsetrue
emfs
/games/ #java #package	
	FxmlApp.java			 		@ git@github.com:hallvard/javafx/games/src/games/FxmlApp.java;	
	FxmlBuilderFactory.java 		@ git@github.com:hallvard/javafx/games/src/games/FxmlBuilderFactory.java;	
	FxmlGame.java					@ git@github.com:hallvard/javafx/games/src/games/FxmlGame.java;	
	imagegrid/ #java #package		
		ImageGrid.java				@ git@github.com:hallvard/javafx/games/src/games/imagegrid/ImageGrid.java;		
		ImageGridGame.java			@ git@github.com:hallvard/javafx/games/src/games/imagegrid/ImageGridGame.java;		
		;	
	battleship/ #java #package		
		hit64x64.png				@ git@github.com:hallvard/javafx/games/src/games/battleship/hit64x64.png;		
		miss64x64.png           	@ git@github.com:hallvard/javafx/games/src/games/battleship/miss64x64.png;		
		ocean64x64.png          	@ git@github.com:hallvard/javafx/games/src/games/battleship/ocean64x64.png;
		
		battleship1/			
			IBattleship.java		@ git@github.com:hallvard/javafx/games/src/games/battleship/battleship1/IBattleship.java;			
			Cell.java				@ git@github.com:hallvard/javafx/games/src/games/battleship/battleship1/Cell.java;			
			Battleship.java			@ git@github.com:hallvard/javafx/games/src/games/battleship/battleship1/Battleship.java;			
			BattleshipFX.java		@ git@github.com:hallvard/javafx/games/src/games/battleship/battleship1/BattleshipFX.java;			
			BattleshipFX.fxml		@ git@github.com:hallvard/javafx/games/src/games/battleship/battleship1/BattleshipFX.fxml;

Merk at du godt kan la være bruke å IBattleship-grensesnittet, men da må du omprogrammere appen, så den bruker andre metoder enn vi har forutsatt. Det er nok mer arbeid, men kanskje enda mer lærerikt?