You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

NB: Dette er et utkast. Oppgaven vil sansynligvis endres.

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.

Forslag til visuell representasjon av brett:

      +-------------+-------------+-------------+
    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 problemet
  • Tall uten parenteser: satt av spilleren
  • Punktum: 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

  • sudoku end
  • sudoku 1a7 1b9 1g3 2f6 2g9 3a8 3e3 3h7 3i6 4f5 4i2 5c5 5d4 5e1 5f8 5g7 6a4 6d7 7a6 7b1 7e9 7i8 8c2 8d3 9c9 9h5 9i4 end
  • sudoku 1b7 1d9 1g6 1i8 2d5 2i3 3b4 3c9 3e8 3g7 3h5 4b6 4c5 4f3 4i4 5c2 5d8 5e4 5f6 5g5 6a4 6d1 5g3 5h6 6b5 6c4 6e2 6g9 6h1 7a7 7f5 8a7 8f5 9a8 9c6 9f1 9h4 end
  • No labels