Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Excerpt

I oppgaven skal man lage en Sudoku-klasse som holder representasjon, logikk og funksjonalitet for å spille tekstbasert sudoku.

I denne oppgaven skal du implementere spillet sudoku. Du vil lage en klasse Sudoku som innkapsler brettet og har metoder for å fylle det ut og sjekke gyldigheten til de forskjellige områdene. Du vil også implementere SudokuUI som lar en spille tekstbasert sudoku.

Del 1 - Representasjon av brett

Tilstanden Sudoku-objektet holder på består av et 9x9-brett. Hver rute kan være tom, eller ha et tall 1-9 i seg. Det må også holdes styr på om tallet i ruten er en del av problemet eller om den kan fylles ut / endres av spilleren.

KlassenSudoku må ha følgende metoder:

  • Sudoku(String problem):
        Konstruktør. Tar inn ett problem på formatet beskrevet legre nede på siden, og fyller ut brettet med problemet.
  • boolean playerSetCell(int x, int y, int value):
        Hvis ruten i x,y er en del av problemet, returner false. Ellers set ruten til value og returner true.
  • int getCell(int x, int y):
        Returner verdien til ruten i x,y.
  • boolean isCellPartOfProblem(int x, int y):
        Returner om ruten i x,y er en del av problemet.

Del 2 - Logikk som sjekker for ukonsistens i brettet

Utvid Sudoku-klassen med metodene under:

  • boolean isColumnLegal(int col):
        Returnerer false om et tall opptrer (minst) to ganger i kolonne col. Returnerer true ellers (selv om det er tome ruter i kollonen). col skal tilsvare x-verien til rutene.
  • boolean isRowLegal(int row):
        Returnerer false om et tall opptrer (minst) to ganger i rad row. Returnerer true ellers (selv om det er tome ruter i raden). row skal tilsvare y-verien til rutene.
  • boolean isRegionLegal(int rx, int ry):
        Returnerer false om et tall opptrer (minst) to ganger i 3x3 område i rx,ry. Returnerer true ellers (selv om det er tome ruter i området). rx skal tilsvare floor(x / 3) til rutene.

Del 3 - Fullt fungerende spill, med tekstlig interaksjon

Lag en SukokuProgram-klasse som lar en spille på konsollen. Programmet skal gjøre følgende:

  1. Ta inn en beskrivelse av et sudoku-problem. Formatet og eksempler finner du lenger ned på siden.
  2. Vise brettet. Forslag til representasjon finner du lenger nede på siden.
  3. La brukeren sette tall i ruter som ikke er en del av problemet, for å så gå tilbake til punkt 2.

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

Spillet Sukoku består av et delvis utfylt 9x9 brett av tall fra 1 til 9. Målet med spillet er å fylle brettet fulstendig ut slik at det følger visse regler. Reglene er: Det samme tallet kan kun opptre én gang i: 1. hver kolonne, 2. hver rad, og 3. hvert av 3x3 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.
  • Spillet må kunne spilles gjennom konsollen. Dvs. at en spilleren må kunne skrive instruksjoner i konsollen, som deretter utføres i spillet.
  • Brett-klassen må kunne initialiseres med en String på formatet beskrevet i lengre nede på siden.

Forslag til visuell representasjon av brett:

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

Forklaring:

  • Tall i parenteser: del av problemettall som ikke kan endres
  • Tall uten parenteser: tall satt av spilleren
  • Punktum: Tom tom rute
  • Spørsmålstegn: Ulovlig kollone, rad eller område.

Beskrivelse av problem-format

Problemene starter med ordet "sudoku" for å så fortsette med null eller flere ord som beskriver verdien til ruter i brettet, på formatet <rad><kollonne><verdi>. Problemet ender med ordet "end".

Eksempelproblemer

...

  • Asterisk/stjerne: tall satt av spilleren, i konflikt

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.

Eksempelproblemer

  • .....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 (40%): 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 enn en gang i kollone/rad/område).

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