Sudoku podział klas

0

Cześć!

Próbowałem napisać sudoku w javieFX, ale mnie to trochę przerosło (głównie architektura MVC, sporo namieszałem).
Wywaliłem kod i stwierdziłem, że zacznę od pisania sudoku w wersji konsolowej. Pomyślałem, że łatwiej mi to będzie ogarnąć później, jednak nadal się gubię przy najprostszych elementach.

Source tego co niedawno napisałem
Nie ma tego dużo, ale nie jestem w stanie ruszyć dalej (z góry przepraszam za g*wniany kod)

Napisałem:

  • klasę Player do obsługi gracza
  • klasę Board do obsługi planszy
  • klasę Checker do sprawdzania czy w danym miejscu można wstawić liczbę
  • klasę Solver (dziedziczy z Checker) do podania poprawnej odpowiedzi (rozwiązania planszy)

I tutaj utknąłem.
Jak podzielić wszystko na klasy (głównie w tym tkwi mój największy problem)?Jak przekazywać planszę, jak to odpowiednio zaimplementować, żeby było wszystko porządnie ogarnięte?
I jak się nauczyć dzielić projekt na odpowiednio małe jednostki?

2

Moja rada? Zacznij to po prostu pisać top-down a reszta wyjdzie w praniu. Takie próby "projektowania", szczególnie u początkujących to zwykle daja słabe efekty.
Zacznij pisać kod od main() i staraj się bardzo szybko wydzielać sobie nowe klasy/metody. Generalnie nie pisz szczegółów tylko wydzielaj nowe metody/klasy.

Załóżmy że na początek musisz wczytać plansze z pliku a potem załadować do solvera i odebrać wynik. No to piszemy

public static void main(String[] args){
    BoardConfiguration configuration = new BoardConfiguration("/tmp/plansza");
    Solver solver = new Solver();
    Solution solution = solver.solve(configuration);
}
```

i voila, mamy już początek kodu. Teraz zabieramy się za implementacje tego co nam się "wydzieliło", czyli np. loadera do planszy albo solvera do sudoku. Jak może wyglądać takie solve? Na przykład:

```java
public Solution solve(BoardConfiguration configuration){
    Solution solution initial = new Solution(configuration);
    while(!solution.isSolved()){
        solution = tryToSolve(solution);
    }
    return solution;
}

public Solution tryToSolve(Solution last){
    Solution next = new Solution(last);
    for(Field fieldToSolve in next.getEmpyFields()){
        solveIfPossible(fieldToSolve, next);
    }
}
```

i tak dalej.

Od razu mówie że ten kod pokazany wyżej może się do niczego nie nadawać, chodzi mi tu o przedstawienie idei.

1 użytkowników online, w tym zalogowanych: 0, gości: 1