Versions Compared

Key

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

NB: Dette er et utkast. Oppgaven vil sansynligvis endres, dog ikke drastisk (du kan trygt starte med å løse den hvis du vil). 

Excerpt

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

Spillet Sukoku 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.