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