Uploaded by not Aylin

Sudoku

advertisement
Sudoku-Solver
PROJEKT FÜR DAS PRAKTIKUM
Aylin Tasci | Programmiersprachen II | SS 2022
Sudoku-Solver | Aylin Tasci
Inhaltsverzeichnis
1. Einleitung
a. Was ist Sudoku?
b. Projekterklärung
c. Meilensteinplan
2. Projektbeschreibung
a. Grobkonzept
i. Aufbau und Funktionen
3. Projektmodellierung/-Umsetzung
a. Feinkonzept
i. Backtracking-Algorithmus
ii. Klassendiagramm
b. Code
4. Testung
a. Funktionsfähigkeit – Bugs, Glitch vorhanden?
5. Abschluss
SEITE 1
Sudoku-Solver | Aylin Tasci
1. Einleitung
a. Was ist Sudoku?
ungelöst
 Bei einem Sudoku Rätsel handelt es sich um ein Zahlenrätsel. Das
Rätsel ist aus einem Raster von 9 x 9 Feldern aufgebaut. Ziel ist es alle
leeren Kästchen zu füllen. Am Anfang sind einige der 81 Ziffern
vorgegeben. Dabei dürfen die Zahlen von 1 bis 9 jeweils nur einmal in
den Quadraten vorkommen, sowie auch in jeder Spalte und in jeder
Zeile.
Je mehr Zahlen vorgegeben sind, desto leichter ist das Rätsel zu lösen.
Das gegebene Beispiel ist ein Rätsel mit einem schweren
Schwierigkeitsgrad.
gelöst
 So sieht ein gelöstes Sudoku Rätsel aus. Die roten Zahlen stellen die
Zahlen dar, die vorgegeben waren und die schwarzen die gefundenen
Zahlen.
SEITE 2
Sudoku-Solver | Aylin Tasci
b. Projekterklärung
Das Ziel dieses Projekts ist es, ein Programm zu entwickeln, das Sudoku-Rätsel lösen kann.
Der Benutzer hat die Möglichkeit über ein grafisches Interface zu interagieren. Das grafische
Interface bietet dem Benutzer die Möglichkeit Eingaben in gewählte Slots einzufügen. Das
Programm prüft daraufhin die getätigte Eingabe, ob es sinngemäß zum Lösen des Rätsels
passt.
Das Lösen eines Sudoku Rätsels erfolgt durch einen Algorithmus, welcher prüfen muss, ob die
Zahlen in der selben Reihe vertikal oder horizontal und in den Quadraten jeweils nur einmal
vorkommt.
Das Programm wird hierbei mit der Programmiersprache Java programmiert und realisiert.
c. Meilensteinplan
Mit dem Meilensteinplan wird eine klare Übersicht gegeben, welche Ziele erreicht werden
sollen und die Ereignisse mit besonderer Bedeutung werden hervorgehoben.
Der folgende Meilensteinplan besteht aus 5 Phasen: Definition, Feinkonzept, Umsetzung,
Testung und Abschluss. Die erfolgenden Ereignisse unter diesen Punkten sind unter diesen
Punkten in der Tabelle beschrieben.
Manche dieser Punkte sind mit einem Datum versehen, welches das Datum ist, bis wann der
aufgelistete Punkt nach Plan fertig sein soll.
Definition
Feinkonzept
Umsetzung
Testung
Abschluss
1. Meilenstein
2. Meilenstein
3. Meilenstein
4. Meilenstein
5. Meilenstein
Ideenbetrachtung,
Ideengewinnung, durch
Vergleiche mit anderen
Programmen aus dem
Internet.
Entscheiden, was nun
zum Projekt
übernommen wird
Code (bis 15.06.2022)
Umfangreiches Testing
der Schnittstellen
Abschlussbericht
Projekterklärung, Was
ist Sudoku?;
Ausarbeitung der
Grobkonzepte zu
umsetzungsfähigen
Feinkonzepten
Testing der
Schnittstellen
Grobkonzept
Prototyp


Aufbau
Funktionen



End-To-EndTests der
Funktionen
Fehler verbessern, auf
Bugs untersuchen
(Spätestens bis
30.07.2022)
Präsentation
(30.07.2022)
Klassendiagramm
(15.04.2022)
UserInterface (bis
30.04.2022)
SEITE 3
Sudoku-Solver | Aylin Tasci
2. Projektbeschreibung
a. Grobkonzept
i. Aufbau und Funktionen
Nach Starten des Programmes soll dem Benutzer mit einem benutzerfreundlichen
grafischen Interface die Möglichkeit gegeben werden, zwischen 3 Schwierigkeitsstufen
zu entscheiden: „Leicht“, „Mittel“ und „Schwer“.
Nach der Wahl des Benutzers soll das Programm, je nach gewählter Schwierigkeitsstufe
dem Benutzer das passende Rätsel generiert werden. Hier wird ein Zufallsgenerator
genutzt, um ein beliebiges freies Feld zu ermitteln und eine Zahl für dieses Feld zu
würfeln. Diese Zahl darf die Regeln des Spiels nicht brechen. Das geht dann immer so
weiter, bis es genau eine Lösung gibt. Wenn es keine Lösung gibt, geht der Generator
einen Schritt zurück und versucht sein Glück mit einer anderen Ziffer. Dieses
Programm lässt sich rekursiv programmieren. Nach Start des Rätsels geht ein Timer los,
damit der Benutzer schauen kann, wie lange er/sie für das Rätsel gebraucht hat.
Daraufhin steht es dem Benutzer nun frei Eingaben in die Felder einzufügen. Wenn
diese korrekt eingefügt wurden, wird das Programm nichts machen. Wenn es aber
falsch eingefügt wurde, wird das Programm den Benutzer darauf hinweisen, dass die
Eingabe nicht korrekt ist.
Das Programm weiß anhand eines Algorithmus, wie das Rätsel zu lösen ist. Das
Lösungsprogramm sucht zunächst das erste freie Feld und probiert dann nacheinander
alle Ziffern beginnend mit der 1 aus. Wenn eine Ziffer gefunden wurde, die die Regeln
nicht verletzt, dann wird der Algorithmus beim nächsten freien Feld wiederholt. Wenn
es kein freies Feld mehr gibt, dann ist das Rätsel gelöst. Falls jedoch keine der Ziffern 19 in das Feld passt, dann geht das Programm ein Feld zurück und wiederholt das ganze
mit der nächsten dort möglichen Ziffer. Der Algorithmus lässt sich auch hier rekursiv
formulieren, also es gibt dann eine Methode (bspw. solve()), die sich immer wieder
selbst aufruft.
Falls der Benutzer nicht weiterkommt wird ihm die Möglichkeit geboten, einen
Hinweis zu bekommen.
Nachdem der Benutzer das Rätsel gelöst hat, wird der Timer gestoppt und kann wenn
er/sie mag, ein neues Rätsel anfangen, oder das Programm schließen.
SEITE 4
Sudoku-Solver | Aylin Tasci
3. Projektmodellierung/-umsetzung
a. Feinkonzept
i. Backtracking-Algorithmus
Das Ganze kann mit einem Algorithmus realisiert werden, indem man Nutzen vom
Backtracking-Algorithmus macht. Der Backtracking-Algorithmus ist ein rekursiver
Algorithmus, der versucht, ein gegebenes Problem zu lösen, indem er alle möglichen Wege zu
einer Lösung testet, bis eine Lösung gefunden wird. Jedes Mal, wenn ein Pfad getestet wird
und keine Lösung gefunden wird, geht der Algorithmus zurück, um einen anderen möglichen
Pfad zu testen, und so weiter, bis eine Lösung gefunden wird oder alle Pfade getestet wurden.
Das typische Szenario, in dem ein Backtracking-Algorithmus verwendet wird, ist, wenn man
versucht, in einem Labyrinth einen Ausweg zu finden. Jedes Mal, wenn man eine Sackgasse
erreicht, geht man zurück, um einen anderen Weg zu versuchen, bis man den Ausgang findet
oder alle Wege erkundet wurden.
Also: Wenn keine Regel verletzt wird, geht der Algorithmus zur nächsten Zelle, füllt alle
möglichen Lösungen aus und wiederholt alle Prüfungen.
Wenn ein Verstoß vorliegt, wird der Zellenwert erhöht. Sobald der Wert der Zelle 9 erreicht
und immer noch eine Verletzung vorliegt, geht der Algorithmus zurück zur vorherigen Zelle
und erhöht den Wert dieser Zelle.
Es versucht alle möglichen Lösungen, bis es zur Lösung des gesamten Rätsels kommt.
ii. Klassendiagramm
GUI
Sudoku
SEITE 5
Sudoku-Solver | Aylin Tasci
Hilfe
1.
GUI
Soll ein Fenster mit einem 9x9 Gitter zur Eingabe von Ziffern in das Rätsel öffnen. Das
Sudoku wird als 9x9 Integer Array abgespeichert. Es gibt mehrere Schaltflächen, ein
Ausgabefeld, (evtl. Hinweisfeld) und eine Auswahlleiste. Die GUI verwaltet das
angegebene Sudoku-Rätsel und benutzt dabei die statischen Methoden der anderen
Klasse.
2. Sudoku
3. Hilfe (evtl.)
GUI —benutzt—> Sudoku —benutzt—> Hilfe <—benutzt— GUI
))
SEITE 6
Download