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 tre klasser; en klasse for å representere (innholdet i) en rute på brettet, en klasse for brettet med ruter og et hovedprogram for interaksjon med spilleren. De to første av disse må være ordentlig innkapslet.
- Brett-klassen 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 spillet.
- 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...
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.
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:
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?