Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: 2017-versjon med JavaFX

...

  • Programmet må bestå av minst treto klasser; en klasse for å representere (innholdet i) en rute på brettet, og en klasse spillklasse for brettet med ruter og et hovedprogram for interaksjon med spilleren. De to første av disse . Disse må være ordentlig innkapslet.
  • Brett-klassen Spillklassen må kunne initialiseres med en String på formatet beskrevet lengre ned på siden.

Funsjonelle krav til spillet:

  • Spillet må kunne spilles gjennom konsollen. Dvs. at en spilleren må kunne skrive instruksjoner i konsollen, som deretter utføres i spilletvia JavaFX-applikasjonen som spesifisert under.
  • Spillet skal ikke la spilleren endre på tallene som allerede var satt før spillet startet (som er en del av sudoku-problemet).
  • Spillet skal la spilleren endre ruter de allerede har satt selv.
  • Spillet skal la spilleren sette inkonsistente/ulovlige verdier.
  • Spiller skal vise hvilke tall som ikke kan endres.
  • Spillet skal vise hvilke tall som er i konflikt.
Forslag til visuell representasjon av brett:
Code Block
  +-------------+-------------+-------------+
1 |  .  (1)  .  |  .   .   .  |  .   .   .  | 
2 |  .   .   .  |  3   2   1  |  .   .   .  | 
3 |  .   1*  .  |  .   .   .  |  .   .   .  | 
  +-------------+-------------+-------------+
4 |  .   .   .  |  .   1*  .  |  .   .   .  | 
5 |  .   .   .  |  1*  .   .  |  .   .   1* | 
6 |  .   .   .  |  .   .   .  |  .   .   1* | 
  +-------------+-------------+-------------+
7 |  .   .   .  |  .   .   .  |  .   .   .  | 
8 |  .   .   .  |  .   .   .  |  1*  1*  .  | 
9 |  .   .   .  |  .   .   .  |  .   .   .  | 
  +-------------+-------------+-------------+
     a   b   c     d   e   f     g   h   i

...

Code Block
  +-------------+-------------+-------------+
1 |  .   .   .  |  .   .  (2) |  .   .  (3) | 
2 | (8)  .  (2) | (7) (3)  .  | (4) (5)  .  | 
3 |  .   .   .  | (6)  .   .  | (8) (7)  .  | 
  +-------------+-------------+-------------+
4 | (9)  .  (8) |  .   .  (5) | (3) (6) (7) | 
5 |  .   .  (6) |  .   .   .  | (1)  .   .  | 
6 | (4) (5) (1) | (3)  .   .  | (9)  .  (8) | 
  +-------------+-------------+-------------+
7 |  .  (8) (4) |  .   .  (3) |  .   .   .  | 
8 |  .  (7) (9) |  .  (5) (1) | (2)  .  (6) | 
9 | (2)  .   .  | (8)  .   .  |  .   .   .  | 
  +-------------+-------------+-------------+
     a   b   c     d   e   f     g   h   i
Forslag til brukergrensesnitt

En mulig måte spilleren kan fylle ut brettet på er å oppgi trekk på formen <rad(0-8)><kollone(0-8)><verdi(.1-9)>. For eksempel vil "259" sette ruten i kolonne 2, rad 5 til 9. "25." vil sette den tilbake til tom. Merk at her har vi regnet med at brettet er 0-indeksert.

Beskrivelse av formatet på brett

Formatet er en streng av tall og punktum. Hvert tegn representerer innholdet i en rute. Rutene kommer venstre til høyre, top til bunn. Det er alltid 81 tegn i strengen.

Eksempelbrett
  • .....2..38.273.45....6..87.9.8..5367..6...1..4513..9.8.84..3....79.512.62..8.....
  • .68.257.3..........71..39..61.35.2...8.....4...3.64.95..76..58..........8.653.42.
  • .....59.4.8..9.6.5..6....3..3.7.145...8.4.7...742.6.9..6....3..8.1.6..7.3.98.....
  • ...6...513....2..66...3..89..4.2.6...3.418.2...8.7.1..59..6...38..3....241...9...

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 spillklasse-objektet basert på dette, og den viser spillklassens toString()-metode i applikasjonsvinduet. For at applikasjonen skal være kjørbar med spillklassen, må følgende gjøres:

  • Hvis du ikke allerede har gjort det: lag en metode String toString() i spillklassen som returnerer en String med spillets tilstand (dvs tekstlig representasjon av brettet).
  • GameController, deklarer spillet ditt og initialiser det slik kommentarene i koden forklarer. 
  • I spillklassen, 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. Formen 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 spillklassens toString()-metode for å vise spillets tilstand. Oppdater denne metoden slik at den returnerer en String som sier at spillet er over når dette skjer.

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

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

Vurdering

Oppgaven blir vurdert etter hvorvidt spillet kan

...

Hvert nivå innbærer at all funksjonalitet i lavere nivåene fungerer som beskrevet.

JavaFX-app

Konsollbasert IO er greit for å teste spillet, men det er kanskje artigere å lage en ordentlig app, med grafisk visning av rutenettet og bruk av piltastene for styring av spilleren. Vi har laget en JavaFX-basert app, som du kan laste ned og koble til din Sudoku-klasse. App-koden forutsetter at spill-logikken er implementert i en klasse som implementerer ISudoku-grensesnittet (i pakken games.sudoku.sudoku1). Når brukeren starter spillet, så lages det en instans av spillklassen din i app-en, og det er denne som holder rede på spill-tilstanden, dvs. hvilke brikker som er i hvilke ruter. Med bruk av grensesnitt, så gjøres det klart hvilke metoder appen trenger og som du må implementere.

Last først ned ISudoku-grensesnittet, 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:

Code Block
titleFil-tre som må lastes ned evt. importeres med Digital Compendium-panelet
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;
		;
	sudoku/ #java #package
		sudoku1/ #java #package
			SudokuFX.java	@ git@github.com:hallvard/javafx/games/src/games/sudoku/sudoku1/SudokuFX.java;
			SudokuFX.fxml	@ git@github.com:hallvard/javafx/games/src/games/sudoku/sudoku1/SudokuFX.fxml;
 

Merk at du godt kan la være bruke å ISudoku-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?