I oppgaven skal man implemetere spillet Sudoku, som skal kunne spilles på konsollen.

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

Implementsjon av Sudoku

Sudoku-oppgaven er en åpen oppgave, hvor man selv velger løsninger for hvordan spillet skal implementeres. Det stilles likevel følgende krav:

  • Programmet må bestå av minst to klasser; en klasse for å representere (innholdet i) en rute på brettet, og en spillklasse for brettet med ruter. Disse må være ordentlig innkapslet.
  • Spillklassen må kunne initialiseres med en String på formatet beskrevet lengre ned på siden.

Funsjonelle krav til spillet:

  • Spillet må kunne spilles via 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:
  +-------------+-------------+-------------+
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

Forklaring:

  • Tall i parenteser: tall som ikke kan endres
  • Tall uten parenteser: tall satt av spilleren
  • Punktum: tom rute
  • Asterisk/stjerne: tall satt av spilleren, i konflikt

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:

  +-------------+-------------+-------------+
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. 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 mer enn en gang i samme kolonne/rad/område).

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

 

  • No labels