Versions Compared

Key

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

...

Spillet Sudoku består av et delvis utfylt 9x9 brett av tall fra 1 til 9. Målet med spillet er å fylle brettet fulstendig ut fullstendig slik at det følger oppfyller visse regler. Reglene er: Det samme tallet kan kun opptre én gang i : 1. hver kolonne, 2. hver rad, og 3. hvert av de 3x3 store område man får dersom man deler opp brettet i 9 like, kvadratiske deler.

...

  • 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 i lengre nede 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 allerede utfylte ruterruter 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

...

Representasjon av ".....2..38.273.45....6..87.9.8..5367..6...1..4513..9.8.84..3....79.512.62..8....." ser slik ut:

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-98)><kollone(a0-i8)><verdi(.01-9)>. For eksempel vil "2f9259" sette ruten i kollone akolonne 2, rad 2 5 til 9. "2f25." 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. 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 spilleren 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

  • Nivå 0 (10%): Skrive ut brettet ved oppstart
  • Nivå 1 (30%): Fylle ut ruter (med input fra brukeren) uten hensyn til regler.
  • Nivå 2 (70%): Tillate endringer kun i originalt tomme ruter. (Tall satt av spilleren må kunne kunne endres i tillegg til tomme ruter.)
  • Nivå 3 (100%): Markere inkonsistente tall (dvs. tallene som dukker opp men mer enn en gang i kollonesamme kolonne/rad/område).

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 fra /games/sudoku/sudoku1/ISudoku.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:

...

titleFil-tre som må lastes ned evt. importeres med Digital Compendium-panelet
collapsetrue

...

.

...

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?