• Keine Ergebnisse gefunden

A Java Project

N/A
N/A
Protected

Academic year: 2022

Aktie "A Java Project"

Copied!
37
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Projekt

„Su-do-ku Generator“

unter der Leitung von Univ.-Ass. Dr. Michael Hahsler

verfasst für

Abteilung für Informationswirtschaft Wirtschaftsuniversität Wien, UZA II – 3.Ebene

Augasse 2-6, A-1090 Wien, Austria

von Jasna Tusek

Email: jasna.tusek@wu-wien.ac.at Homepage: www.wu-wien.ac.at/~h9950128

Wien, 2006-12-21

(2)

Für Su-do-ku Fans

(3)

Inhaltsverzeichnis

1. PROJEKTPHASEN...5

1.1 PROBLEMDEFINITION...5

1.1.1 PROJEKTBESCHREIBUNG...5

1.1.2 SPIELREGELN...5

1.1.3 PROJEKTZIELE...6

1.1.4 IDEENFÜR UMSETZUNG...6

1.2 PROJEKTPLAN...7

1.3 MODELLIERUNG...8

1.3.1 KLASSENDIAGRAMM...9

1.3.2 SEQUENZDIAGRAMM...10

1.3.3 USE CASE DIAGRAMM...11

1.3.5 ZUSTANDSDIAGRAMM...14

1.4 IMPLEMENTIERUNG ...15

1.4.1 KLASSE SUDOKUZAHL...15

1.4.2 KLASSE GENERATOR...15

1.4.3 KLASSE MENÜ ...15

1.4.4 KLASSE GUI...15

1.4.5 KLASSE MAIN...15

1.5 TEST...16

1.5.1 FUNKTIONALITÄTIN DETAILS...16

1.5.2 FUNKTIONALITÄTUND BENUTZERFREUNDLICHKEITIN DETAILS...16

1.5.3 PLATTFORMUNABHÄNGKEIT...17

1.5.4 GETESTETE FUNKTIONEN...18

1.6 ABNAHMEUND PRÄSENTATION...19

2. PROJEKT-API...19

2.1 JAVA.UTIL.*;...19

2.2 JAVA.IO.*;...19

2.3 JAVA.AWT.*;...20

2.4 JAVAX.SWING.*;...20

2.5 JAVA.NET.*;...21

3 BESONDERHEITEN...21

3.1 AUSNAHMEBEHANDLUNG (= EXCEPTIONS)...21

3.2 ZWEIDIMENSIONALES ARRAY...22

4 GRAFISCHE BENUTZEROBERFLÄCHE...23

4.1 GUI-KOMPONENTEN...23

4.1.1 JFRAME...23

4.1.2 JMENU...23

4.1.3 JPANEL...23

4.1.4 JBUTTON...24

4.1.5 JFORMATTEDTEXTFIELD...24

4.1.6 JTEXTAREA...24

4.1.7 JTABBEDPANE...24

4.1.8 JOPTIONPANE...25

4.2 LAYOUT-MANAGER...25

4.2.1 GRIDLAYOUT...25

4.2.2 BOXLAYOUT...26

4.2.3 BORDERLAYOUT...26

(4)

5. BESCHREIBUNGDER PROJEKTKLASSEN...26

5.1 KLASSE SUDOKUZAHL...26

5.1.1 VARIABLEN...27

5.1.2 METHODEN...27

5.1.3 MODIFIZIERER...27

5.2 KLASSE GENERATOR...28

5.2.1 VARIABLEN...28

5.2.2 METHODEN...28

5.2.3 MODIFIZIERER...30

5.3 KLASSE MENÜ...31

5.3.1 VARIABLEN...31

5.3.2 METHODEN...31

5.3.3 MODIFIZIERER...32

5.4 KLASSE GUI...32

5.4.1 VARIABLEN...32

5.4.2 METHODEN...32

5.4.3 MODIFIZIERER...33

5.5 KLASSE MAIN ...33

6. INSTALLATIONUND WARTUNG...34

7. FAZIT...35

BILDVERZEICHNIS...36

TABELLENVERZEICHNIS...36

LITERATURVERZEICHNIS...37

(5)

1. Projektphasen

Das vorliegende Projekt wird in folgende Projektphasen gegliedert: Problemdefinition, Projektplan, Modellierung, Implementierung, Test und Präsentation.

1.1 Problemdefinition

Die Problemdefinition wird stets zu Beginn des Projekts erstellt und gibt die wesentlichen Ziele des Projekts vor.

1.1.1 Projektbeschreibung

Mit diesem Projekt wird ein Su-do-ku Generator modelliert und implementiert. Das mit Abstand beliebteste Rätsel der Welt besteht aus 81 Feldern, welche in einer 9 x 9 Matrix angeordnet sind.

Diese Matrix kann auch als ein einfaches Quadrat beschrieben werden, welches sich wiederum in neun weitere Subquadrate eingliedern lässt. Die Subquadrate entsprechen dann nur noch mehr einer 3 x 3 Matrix (siehe Bild 1). Daraus lässt sich auch ableiten, dass der ganze Su-do-ku Quadrat aus neun Zeilen und neun Spalten und jedes Subquadrat aus drei Zeilen und drei Spalten besteht.

Nun werden die Zahlen 1 bis 9 so eingefügt, dass in keiner Zeile, keiner Spalte und in keiner 3 x 3 Matrix eine Zahl doppelt vorkommt. Der Generator muss daher diese Bedingung prüfen, bevor er die Zahlen schließlich in einer Su-do-ku Benutzeroberfläche ausgibt. Das Programm wird permanent neue Su-do-ku Angaben generieren. Zudem wird das Programm auf Wunsch des Benutzers das generierte Su-do-ku lösen.

1.1.2 Spielregeln

Um das Programm etwas interessanter zu gestalten, wird zu der allgemeinen Regel auch eine spezielle Regel eingeführt. Der Su-do-ku Generator wird somit folgende Bedingungen erfüllen:

1. keine Zahl darf doppelt vorkommen (dies gilt für jedes Subquadrat, für jede Zeile und jede Spalte)

2. jede Zahl kommt auf eine und dieselbe Position nur einmal vor (gilt für alle 9 Subquadrate)

Bild 1 Su-do-ku Feld

(6)

Bild 1 zeigt das Su-do-ku Feld und markiert die Position 11. Diese Position liegt in jedem einzelnen Subquadraten stets in der ersten Zeile und ersten Spalte. Die zweite Regel besagt daher, dass die Zahlen 1 bis 9 auf diese neun Felder so verteilt werden müssen, dass keine Zahl in der Position 11 doppelt vorkommt. Dasselbe gilt für die restlichen Positionen.

Somit ist die Benutzeroberfläche des Su-do-ku Generators in folgende Positionen gegliedert:

Bild 2 Gliederung des Su-do-ku in Positionen

Erläuterung zu Bild 2:

p11 = Position in der ersten Zeile und ersten Spalte des jeweiligen Subquadrats p12 = Position in der ersten Zeile und zweiten Spalte des jeweiligen Subquadrats p13 = Position in der ersten Zeile und dritten Spalte des jeweiligen Subquadrats

p21 = Position in der zweiten Zeile und ersten Spalte des jeweiligen Subquadrats p22 = Position in der zweiten Zeile und zweiten Spalte des jeweiligen Subquadrats p23 = Position in der zweiten Zeile und dritten Spalte des jeweiligen Subquadrats

p31 = Position in der dritten Zeile und ersten Spalte des jeweiligen Subquadrats p32 = Position in der dritten Zeile und zweiten Spalte des jeweiligen Subquadrats p33 = Position in der dritten Zeile und dritten Spalte des jeweiligen Subquadrats

Anmerkung: Die einzelnen Subquadrate sind daher hinsichtlich ihrer Positionsstruktur ident.

1.1.3 Projektziele

Mit der Umsetzung des Su-do-ku Generators werden folgende Ziele verfolgt:

1. Die Funktionalität des Generators muss alle Bedingungen des Rätsels erfüllen.

2. Die Benutzoberfläche (GUI) hat eine besondere Benutzerfreundlichkeit zu gewährleisten.

3. Informationen und Hilfe werden vom Programm zur Verfügung gestellt.

1.1.4 Ideen für Umsetzung

1. Klassen: Zahl, Generator, GUI, Main 2. Verwendung von Java-API:

java.util.*; (Collections)

java.awt.*; (ActionEvent, ActionListener)

javax.swing.*; (GUI)

(7)

1.2 Projektplan

Da dieses Projekt zu den Standardprojekten zählt, werden folgende Phasen des Projekts in der Planung berücksichtigt:

Problemdefinition

Projektplan

Modellierung

Implementierung

Test

Abnahme und Präsentation

Der Projektplan wird anhand einer Zeittafel und nach eigener Schätzung erstellten Stundenprognose dargestellt. Die erstellten Tabellen spiegeln die wichtigsten Daten wieder und fassen wichtige Informationen (u.a Dauer der Aktivitäten) zusammen.

I ZEITTAFEL

Monat 1.Woche 2.Woche 3.Woche 4.Woche

Oktober 2006 --- Kick off Problemdefinition,

Modellierung

Projektplan, Modellierung, Umsetzung, Test November 2006 Umsetzung, Test Umsetzung, Test Umsetzung, Test Umsetzung

Dezember 2006 Umsetzung, Test Test --- ---

Januar 2007 --- Korrektur, Test Abnahme,

Präsentation

--- Tabelle 1 Zeittafel

II STUNDENPROGNOSE

Projektphasen Stunden pro Woche Anzahl an Wochen Gesamt

Kick off 2h 1 2h

Problemdefinition 1h 1 1h

Projektplan 1h 1 1h

Modellierung 2h 2 4h

Implementierung 10h 8 80h

Test 1h 6 6h

Abnahme, Präsentation 1h 1 1h

Summe 95h

Tabelle 2 Stundenprognose

Anschließend wird die Modellierung der gängigen Diagramme erstellt.

(8)

1.3 Modellierung

Entspreched der Grundlagenliteratur [BeSt04] werden die wesentlichen Modellierungsdiagramme erstellt, d.h das Klassendiagramm, Sequenzdiagramm, Use Case Diagramm und das Zustandsdiagramm. Die Wahl dieser Diagramme liegt insbesondere daran, dass es sich hier um eine objektorientierte Implementierung handelt.

Das Klassendiagramm stellt die wichtigsten Ansatzpunkte für die erfolgreiche Implementierung des Programms dar: die Klassen mit den dazugehörigen Variablen und Methoden sowie die Beziehung zwischen den Klassen.

Beim Sequenzdiagramm steht der zeitliche Ablauf von Kommandos im Mittelpunkt [BeSt04]. So ist das Lösen eines Sudoku-Beispiels immer dann möglich, wenn der Generator aktiviert ist, d.h wenn ein Sudoku-Beispiel generiert wurde.

Das Use Case Diagramm zeigt insbesondere die Rolle des Benutzers und die des Generators.

Sobald der Benutzer ein Kommando abgibt, d.h eine Funktion aktiviert, reagiert der Generator entsprechend darauf. Für das Abfangen möglicher Fehler wird die Ausnahmebehandlung berücksichtigt. Dabei werden entsprechende Exceptions (NullPointerException, NumberFormatException) vom Programm abgefangen.

Das Zustandsdiagramm basiert auf der Dynamik der Objekte und ihrer Zustände. Die genannten Diagramme werden anschließend dargestellt. Bild 3 stellt das Klassendiagramm dar. Bild 4 zeigt das Sequenzdiagramm. Das Use Case Diagramm ist im Bild 5 dargestellt und Bild 6 zeigt das Zustandsdiagramm an.

(9)

1.3.1 Klassendiagramm

Bild 3 Klassendiagramm

(10)

1.3.2 Sequenzdiagramm

Bild 4Sequenzdiagramm

(11)

1.3.3 Use Case Diagramm

Für das bessere Verständnis des Use Case Diagramms wird zunächst der Use Case beschrieben.

Use Case Name:

Su-do-ku Generator Akteure:

Spieler

Vorbedingungen:

PC oder Notebook mit JDK 5.0 (Java Development Kits), Empfehlung: Starten mit der freiverfügbaren Entwicklungsumgebung Eclipse (Free Download unter http://www.eclipse.org/) Nachbedingungen:

Ausreichend Akku-Kapazität oder Kabelanschluss (stellen sicher, dass der Use Case auch tatsächlich erfolgreich zu Ende durchgeführt werden kann)

Auslöser:

Spieler startet das Programm Ablaufbeschreibung:

Nach dem Programmstart kann der Spieler ein neues Su-do-ku generieren oder ein Su-do-ku aus einer Datei öffnen. Der Spieler kann nun das Su-do-ku vom Generator lösen lassen. Es versteht sich von selbst, dass hier die richtige Reihenfolge eingehalten werden soll, ansonsten tritt Ausnahmebehandlung ein (es werden sog. Exceptions ausgelöst). Das Programm kann jederzeit ohne oder mit vorheriger Aktivierung des Generators beendet werden.

Fehlsituationen:

Mögliche Erwartungsabweichungen hinsichtlich dem System können bei der Benutzeroberfläche des Su-do-ku Generators erkannt werden (lässt sich leicht mit der Umprogrammierung oder Ergänzung im Code beseitigen). Bei der Lösung des Rätsels durch den Spieler können Fehler auftreten, die der Spieler leicht beheben kann, indem er das Rätsel vom Generator kontrollieren lässt. Scheint das Rätsel zu schwierig zu sein, bietet das System Unterstützung in Form der Positions-Pointer. Ist der Benutzer mit dem Generator noch nicht vertraut, können Fehlsituationen entstehen, welche mittels gegebener Hilfestellung ebenfalls beseitigt werden.

Variationen:

Der Spieler kann ein neues Sudoku generieren, dieses selbst lösen oder es vom Generator lösen lassen.

Der Spieler kann das Sudoku aus einer bereits bestehenden Datei öffnen, diese selbst lösen oder vom Generator lösen lassen.

Der Spieler kann das generierte Sudoku oder auch das aus der Datei geöffnete Sudoku teilweise lösen und diese in dieselbe Datei oder in eine neue Datei speichern.

Der Spieler kann das teilweise gelöste Sudoku vom Generator kontrollieren lassen und nach der Fehlerbehebung weitermachen oder speichern um später weitermachen zu können.

Instanzen:

Dr. McCallister ließt täglich seine beliebte Tageszeitung. An einem frühen Morgen findet er wie gewohnt seine Zeitung auf dem Frühstückstisch. Nur dieses Mal wurde von der Redaktion der Su-do-ku Teil ausgelassen. Enttäuscht wendet er sich an seine Tochter. Auch seine Tochter ist

(12)

ein Su-do-ku Fan und hat für alle Fälle vorgesorgt: im Laufe des Anwendungsprojekts aus Java hat sie ein Su-do-ku Generator implementiert, welchen sie nun vom Vater testen lässt. Von nun an rätselt Dr. McCallister öfters als nur ein Mal am Tag.

Kevin löst gerne Rätsel, nur dass er nie genug davon bekommt. Zuletzt erhielt er von seinem Vater ein ganzes Buch voller Su-do-ku Rätsel und nun sind auch alle diese Rätsel komplett gelöst. Als er an einem ruhigen Abend das Telefonat seiner Schwester belauscht, erfährt er von dem Su-do-ku Generator und nutzt die erste Gelegenheit, die ihm geboten wird. Sobald seine Schwester das Wohnzimmer verlässt (auch wenn es nur für einige Sekunden ist), nimmt Kevin das Notebook seiner Schwester um nach dem Generator Programm zu suchen. Aber erst als ihm seine große Schwester zu Hilfe kommt, kann er das Programm finden. Kevin bekommt ein eigenes Notebook zu Weihnachten und seine Schwester wird ihm den Su-do-ku Generator gerne installieren.

Ergebnisse:

Nach Beendigung des Use Case lässt sich höhere Zufriedenheit des Spielers feststellen (insbesondere im Vergleich zu alternativen Möglichkeiten, wie z. B Rätsel aus Tageszeitungen).

Zudem können die zahlreichen Funktionen zum erneuten Programmstart motivieren und zu einer anderen Zeit weitere Neugier hervorrufen.

Nicht-funktionale Anforderungen:

Wie gründlich die Funktionen des Su-do-ku Generators vom Spieler erforscht werden, ist völlig dem Spieler überlassen. Der Use Case stellt Anforderungen hinsichtlich der Qualität der Funktionen und der Reihenfolge. Nicht destotrotz kann der Spieler die Funktionen völlig flexibel wählen und entscheidet selbst über die Dauer seines Spiels und über die Art und Weise wie er zur Lösung gelangt.

Autorin:

Jasna Tusek Ursprung:

Dokumentation des Projektes Su-do-ku Generator

(13)

Bild 5 zeigt den zuvor beschriebenen Use Case im Use Case Diagramm.

Bild 5 Use Case Diagramm

(14)

1.3.5 Zustandsdiagramm

Bild 6 Zustandsdiagramm

(15)

1.4 Implementierung

In diesem Kapitel wird die Funktionsweise der einzelnen Projektklassen beschrieben. Die detaillierte Beschreibung dieser Klassen erfolgt in Kapitel 5.

1.4.1 Klasse Sudokuzahl

Die Klasse Sudokuzahl erzeugt Zufallszahlen zwischen 1 und 9 und speichert diese in eine Liste um sicherzustellen, dass keine Zahl doppelt aufgenommen wird. Jede Zahl, die sich bereits in der Liste befindet, wird nicht mehr gespeichert. Stattdessen wird eine neue Zahl erzeugt.

1.4.2 Klasse Generator

Der Generator führt ein Positionsrandom durch und speichert die einzelnen Sudokuwerte in zweidimensionale Arrays, um die Werte leichter an die Benutzeroberfläche zu übergeben. Dabei werden mehrere Arrays initialisiert. Ein Array stellt das Sudokubeispiel dar, mit dem nächsten Array wird die gesamte Lösung festgehalten und ein drittes Array speichert die Werte aus einer geöffneten Sudoku-Datei.

1.4.3 Klasse Menü

Die Klasse Menü legt alle Funktionen fest, die in der Menüleiste angezeigt werden. Zu jeder Funktion wird das ActionCommand gesetzt und der ActionListener hinzugefügt. Um die einzelnen Funktionen auch über Tastatur auswählen zu können (mittels einer Tastenkombination), wird die Klasse KeyStroke aus dem Paket javax.swing.*; importiert. Anschließend kann die Tastenkombination mittels der Methode setAccelerator(KeyStroke tastenkombination) der entsprechenden Funktion zugewiesen werden.

1.4.4 Klasse GUI

Die grafische Benutzeroberfläche des Su-do-ku Generators wird mit der Klasse GUI realisiert.

Dabei werden die meisten Klassen (JFrame, JFormattedTextField, JPanel, JButton, JTextArea etc.) aus dem Paket importiert. Mit JFormattedTextField werden 81 Su-do-ku Felder implementiert. Das Menü wird an das Frame angehängt und die Methode actionPerformed(ActionEvent e) implementiert.

1.4.5 Klasse Main

Die Klasse Main führt die Hauptmethode aus, mit der das gesamte Programm gestartet wird.

(16)

1.5 Test

Im Rahmen des Projekts „Su-do-ku Generator“ werden folgende Klassen hinsichtlich ihrer Funktionalität bzw. der Benutzerfreundlichkeit getestet:

Klasse Sudokuzahl

Klasse Generator

Klasse GUI

Klasse Menü

Klasse Main (= ganzes Programm)

Tabelle 3 zeigt alle getesteten Klassen an, die den Test zufriedenstellend bestanden haben.

Monat Testgegenstand Testdatum Testdauer

Oktober 2006 Klasse Sudokuzahl 31.10.2006 1h

November 2006 Klasse Generator 20.11.2006 1h

November 2006 Klasse Menu + GUI 20.11.2006 1h

Dezember 2006 Ganzes Programm 04.12.2006 1h

Summe 4h

Tabelle 3 Getestete Klassen

1.5.1 Funktionalität in Details

Folgende Klassen werden hinsichtlich ihrer Funktionalität getestet:

Klasse Sudokuzahl generiert Zufallszahlen und prüft die erste Su-do-ku Regel. Wird eine Zufallszahl doppelt generiert, wird sie ausgelassen und stattdessen wird eine neue Zahl generiert.

Die ersten fünf von neun Zahlen sind Zufallszahlen, die restlichen vier Zahlen werden nacheinander in eine Liste aufgenommen (um eine Endlosschleife zu vermeiden). Diese Liste enthält bei jedem erneuten Durchlauf die Zahlen 1 bis 9 in jeweils unterschiedlicher Reihenfolge. Diese Funktionalitäten sind mit diesem Test bestätigt.

Klasse Generator initialisiert einen Durchlauf und speichert die dabei ermittelte Zahlenreihenfolge in eigene Methoden. Immer wenn der Generator aktiviert wird, werden die Sudokuzahlen in unterschiedlicher Reihenfolge gespeichert. Der Test bestätigt auch diese Funktionalität.

1.5.2 Funktionalität und Benutzerfreundlichkeit in Details

Folgende Klassen werden insbesondere hinsichtlich ihrer Benutzerfreundlichkeit, aber auch hinsichtlich ihrer Funktionalität getestet:

Klasse GUI stellt die notwendige Benutzeroberfläche dar. Daher werden insbesondere Funktionen, welche die Benutzerfreundlichkeit optimieren, berücksichtigt. Mit der Verwendung einer eigenen Menüleiste und dem KeyListener (siehe Klasse Menü) wird das Ziel verwirklicht. Das Programm wird erfolgreich implementiert und besteht den Test.

(17)

Klasse Menü erbt von JMenuBar die notwendigen Komponenten und sorgt für entsprechende Benutzerfreundlichkeit des Programms. Die Klasse Menü wird in das Frame der Klasse GUI eingefügt. Test bestätigt die vollständige Funktionalität.

Mit der Klasse Main werden sowohl die Funktionalität als auch die Benutzerfreundlichkeit, d.h.

das gesamte Programm getestet. Mit diesem Test werden die Mängel erkannt und beseitigt.

1.5.3 Plattformunabhängkeit

Der Generator wird auch auf Plattformunabhängigkeit getestet. Tabelle 4 zeigt das Ergebnis an.

Betriebssystem Voraussetzung Ergebnis Testdatum

Windows Java 5.0 OK 04.12.2006

Linux Java 5.0 OK 12.12.2006

Mac OS X Java 5.0 -- --

Mac OS X Tiger (already preinstalled) -- --

Tabelle 4 Plattformunabhängkeit

Der Screenshot im Bild 7 zeigt den Prototyp und im Hintergrund die Eclipse mit der das Programm implementiert wurde. Die Klassen, die für das Programm verwendet werden, sind in eigenen Subfenstern zu sehen, dabei ist die Klasse Main jene, die aktiv ist – da für den Start des Programms genau diese Klasse aufgerufen werden muss. Darunter ist die Console abgebildet, welche Informationen über das erfolgreiche Generieren von Sudokuzahlen liefert. Um die Details zu sehen, müsste man einfach hinaufscrollen. Um die Details des Codes gut nachzuvollziehen, ist es daher ratsam, dass Programm mit der Eclipse starten zu lassen um auch Zugriff zu den Informationen in der Console zu erhalten.

Bild 7 Prototyp mit Eclipse im Hintergrund

(18)

1.5.4 Getestete Funktionen

Die Tabelle 5 zeigt alle getesteten Funktionen in der Reihenfolge, in welcher sie auch in der Menüleiste angezeigt werden um sicherzustellen, dass keine Funktion ausgelassen wird.

Funktion Testergebnis Testdatum

Programmstart 04.12.2006

Menü: „DATEI“

Menü-Funktion: „Neu“ 04.12.2006

Menü-Funktion: „Datei öffnen“ 04.12.2006

Menü-Funktion: „Su-do-ku öffnen“ 04.12.2006

Menü-Funktion: „Su-do-ku speichern“ 04.12.2006

Menü-Funktion: „Übersicht“ 04.12.2006

Menü-Funktion: „Beenden“ 04.12.2006

Menü: „BEARBEITEN“

Menü-Funktion: „Su-do-ku generieren“ 04.12.2006

Menü-Funktion: „Su-do-ku vereinfachen“ 04.12.2006

Menü-Funktion: „Su-do-ku lösen“ 04.12.2006

Menü-Funktion: „Einträge kontrollieren“ 04.12.2006

Menü-Funktion: „Eingaben löschen“ 04.12.2006

Menü: „ANSICHT“

Menü-Funktion: „Position 11“ 04.12.2006

Menü-Funktion: „Position 12“ 04.12.2006

Menü-Funktion: „Position 13“ 04.12.2006

Menü-Funktion: „Position 21“ 04.12.2006

Menü-Funktion: „Position 22“ 04.12.2006

Menü-Funktion: „Position 23“ 04.12.2006

Menü-Funktion: „Position 31“ 04.12.2006

Menü-Funktion: „Position 32“ 04.12.2006

Menü-Funktion: „Position 33“ 04.12.2006

Menü-Funktion: „Alle Positionen aktivieren“ 04.12.2006

Menü-Funktion: „Info zu Positionen“ 04.12.2006

Menü: „OPTIONEN“

Menü-Funktion: „Hintergrund-Farben“ 04.12.2006

Menü-Funktion: „Hintergrund deaktivieren“ 04.12.2006

Menü-Funktion: „Info zu Hintergrund“ 04.12.2006

(19)

Funktion Testergebnis Testdatum

Menü-Funktion: „Welcome“ 04.12.2006

Menü-Funktion: „Hilfe“ 04.12.2006

Menü-Funktion: „Info zu Su-do-ku“ 04.12.2006

Button: „Neues Su-do-ku generieren“ 04.12.2006

Tabelle 5 Getestete Funktionen des Su-do-ku Generators

1.6 Abnahme und Präsentation

Der Termin wird mit dem Projektleiter festgelegt. Das Projekt wird zum gegeben Zeitpunkt, jedoch spätestens am 23.01.2007, präsentiert.

2. Projekt-API

Die Java-Bibliothek stellt zahlreiche Hilfspakete zur Verfügung. Für das vorliegende Projekt ist der Import von Klassen aus folgenden Paketen erforderlich:

1. java.util.*;

2. java.io.*;

3. java.awt.*;

4. javax.swing.*;

5. java.net.*;

2.1 Java.util.*;

Aus dem Paket Java.util.*; wird eine neue Instanz von LinkedList erzeugt.

LinkedList liste = new LinkedList();

Die verlinkte Liste wird in der Klasse Sudokuzahl implementiert um mit Hilfe dieser Liste einerseits sicherzustellen, dass keine Zahl doppelt in die Liste aufgenommen wird und andererseits eine entsprechende Reihenfolge der Sudokuzahlen zu gewährleisten.

2.2 Java.io.*;

Aus dem Paket Java.io.*; werden neue Objekte von FileReader und BufferedReader erzeugt.

File datei;

BufferedReader in = new BufferedReader(new FileReader(datei));

(20)

Der FileReader ließt jene Datei ein, die dem FileReader-Konstruktor übergeben wird. Diese Datei ist der übergebene Parameter von Typ File. Weiters wird die neu erzeugte FileReader-Instanz an BufferedReader übergeben. Der BufferedReader ließt nun den übergebenen Parameter ein.

In der Klasse Generator werden File, FileReader, BufferedReader und IOException importiert.

Für die Klasse GUI ist der Import von File, FileReader, FileWriter, BufferedReader und BufferedWriter erforderlich, da das Speichern und Öffnen von Dateien implementiert werden.

Zudem wird auch die Klasse IOException importiert um die beim Speichern und Öffnen auftretenden Fehler abzufangen. Das Programm kann somit mit Hilfe der Ausnahmebehandlung optimiert werden.

2.3 Java.awt.*;

Aus dem Paket Java.awt.*; werden die Klassen Event und Color importiert um die Menüleiste zu formatieren. Die Klasse Event wird als Hilfsklasse verwendet und wird insbesondere bei der Implementierung der Tastenkombination (siehe KeyStroke im Paket javax.swing.*;) herangezogen.

Das Paket Java.awt.*; stellt auch das Paket Java.awt.event.*; zur Verfügung. Aus dem Event-Paket werden ActionListener und KeyEvent importiert, welche insbesondere in der Klasse Menü zum Einsatz kommen. In der Klasse GUI werden die ActionListener und ActionEvent aus dem genannten Paket importiert.

2.4 Javax.swing.*;

Das Paket Javax.swing.*; stellt die wesentlichsten Komponenten zur Implementierung der Benutzeroberfläche dar. Für die Implementierung einer Menüleiste sind daher insbesondere JMenuBar, JMenu und JMenuItem erforderlich und werden daher aus dem genannten Paket importiert. Zudem werden auch ButtonGroup, JRadioButtonMenuItem und JCheckBoxMenuItem importiert. Eine Menüleiste wird mit Hilfe der Vererbung realisiert:

public class Menu extends JMenuBar{ ... }

Jedes einzelne Menüpunkt wird mit der Erzeugung einer neuen Instanz der Klasse JMenu implementiert.

JMenu menu;

menu = new JMenu("Datei");

menu = new JMenu("Bearbeiten");

menu = new JMenu("Ansicht");

menu = new JMenu("Optionen");

menu = new JMenu("Hilfe");

Einzelne Menüfunktionen werden mit Hilfe von JMenuItem initialisiert, indem jeweils eine neue Instanz von JMenuItem erzeugt wird:

JMenuItem welcome;

(21)

Die Erzeugung eines ButtonGroup Objekts ermöglicht das Selektieren jeweils eines einzelnen Objekts vom Objektdatentyp JRadioButton bzw. JRadioButtonMenuItem. Unter dem Menüpunkt Optionen kann die Hintergrundfarbe des Su-do-ku Generators verändert werden. Wird nun Silber eingestellt, kann nicht gleichzeitig auch Gold eingestellt werden. Bei jeweiligem Funktionsaufruf wird daher die Hintergrundfarbe geändert, in diesem Fall von Silber auf Gold. Die Klasse JCheckBoxMenuItem dient der Implementierung einer True-False Beziehung. Ist die entsprechende Funktion selektiert dann erhält die boolean-Variable den Wert true, sonst erhält sie den Wert false:

JCheckBoxMenuItem checkbox;

checkbox = new JCheckBoxMenuItem("Hintergrund nicht definiert", false);

Für die Menüleiste ist zudem der Import der Klasse KeyStroke erforderlich um die Tastenkombinationen der einzelnen Funktionen zu implementieren.

JMenuItem generieren;

generieren = new JMenuItem("Su-do-ku generieren");

generieren.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, Event.ALT_MASK));

Die Menüfunktion „Su-do-ku generieren“ kann mit der Tastenkombination ALT+1 aktiviert werden. Weitere aus dem genannten Paket importierte Klassen werden in Kaptel 4 näher erläutert, da die Beschreibung der grafischen Benutzeroberfläche für diesen Abschnitt zu umfangreich ist.

2.5 Java.net.*;

Aus dem Paket Java.net.*; wird der Uniform Resource Locator (=URL) importiert. Mithilfe der URL-Adresse können Objekte aus dem World Wide Web in das Programm eingefügt werden. Im Falle des Su-do-ku Generators wird ein PNG-Objekt eingefügt, d.h ein selbsterstelltes Su-do-ku Bild.

String name; //Name des Bildes (=icon.png) URL imgURL = GUI.class.getResource(name);

3 Besonderheiten

Die wesentlichsten Besonderheiten für den Su-do-ku Generator sind die Ausnahmebehandlung und die zweidimensionalen Arrays. Die Ausnahmebehandlung sorgt für das Abfangen von möglichen Fehlern. Die zweidimensionalen Arrays helfen bei der korrekten Generierung von Sudokuzahlen.

3.1 Ausnahmebehandlung (= Exceptions)

In der Klasse Generator wird die Ausnahmebehandlung mithilfe der Try-Catch Schleife

(22)

berücksichtigt.

String datei;

try{

BufferedReader in = new BufferedReader(new FileReader(datei));

...

}catch (IOException ex){

System.err.println(ex);

}

Beim Öffnen eines Su-do-ku aus einer bereits bestehenden Datei werden die Zahlen aus der Datei gelesen und vom Generator interpretiert. Die Zahl Null steht für ein leeres Feld, restliche Zahlen von 1 bis 9 werden übernommen, so dass der Generator nach erfolgreichem Einlesen das Su-do-ku auch selbstständig lösen kann.

In der Klasse GUI werden überall dort Try-Catch-Schleifen implementiert, wo eine Ausnahme (=Exception) auftreten kann.

Try{

...

}catch(NumberFormatException nf){

System.err.println(nf);

}catch(NullPointerException np){

System.err.println(np);

}

3.2 Zweidimensionales Array

In der Klasse Generator werden drei verschiedene Integer-Arrays implementiert. Alle drei sind zweidimensionale Arrays, die zumindest einer 9x9 Sudokumatrix entsprechen.

1. Integer[][] wert;

2. Integer[][] daten;

3. Integer[][] zahl;

Das erste Array „wert“ speichert die vom Generator erzeugten Werte in der richtigen Reihenfolge.

Dabei wird insbesondere die zweite Su-do-ku Bedingung berücksichtigt: keine Sudokuzahl darf auf einer und derselben Position doppelt vorkommen (egal in welchem Subquadraten sich die Zahl befindet). Das erste Array speichert alle 81 Werte in der richtigen Position und stellt daher auch die Lösung des Su-do-ku dar.

Das zweite Array „daten“ speichert die aus einer Datei gelesenen Werte, ebenfalls in der richtigen Reihenfolge und in der richtigen Position. Der Unterschied liegt nur darin, dass die Werte nicht generiert werden müssen.

Das dritte Array „zahl“ übernimmt nur einzelne Werte des ersten Arrays und gibt ein Su-do-ku Beispiel aus. Welche Sudokuzahlen nun ausgegeben werden und welche Felder leer bleiben, hängt daher zum Großteil vom dritten Array ab.

(23)

4 Grafische Benutzeroberfläche

Für eine benutzerfreundliche grafische Oberfläche werden zahlreiche Klassen aus dem Paket Javax.swing.*; importiert. Alle in diesem Kapitel angeführten Klassen werden in der Klasse GUI verwendet.

4.1 GUI-Komponenten

Die wesentlichsten Klassen sind JMenu, JFrame, JPanel, JButton, JFormattedTextField und JTextArea. Zusätzliche Komponenten werden implementiert um einerseits die Benutzeroberfläche zu optimieren (JTabbedPane) und andererseits Hilfestellung (JOptionPane) anzubieten.

4.1.1 JFrame

Die Klasse JFrame stellt das Fenster des Su-do-ku Generators dar. Der übergebene Parameter vom Typ String ist der Name des Fensters.

JFrame frame;

frame = new JFrame("Su-do-ku Generator");

4.1.2 JMenu

In der Klasse GUI wird eine neue Instanz vom Objektdatentyp Menü in einer eigenen Methode, newMenu() mit dem Rückgabewert Menü, erzeugt:

public Menu newMenu(){

menubar = new Menu(this);

return menubar;

}

Daraufhin wird das Menü an das Frame mit Hilfe der Methode setJMenuBar() angehängt:

frame.setJMenuBar(newMenu());

4.1.3 JPanel

Für die Benutzeroberfläche werden die notwendigen JPanels initialisiert.

JPanel mainPanel;

mainPanel = new JPanel();

...

(24)

4.1.4 JButton

Im vorliegenden Projekt wird nur ein JButton initialisiert, nämlich für die wesentlichste Funktion eines Generators: „neues Su-do-ku generieren“.

JButton taste = new JButton("Neues Su-do-ku generieren");

taste.addActionListener(this);

taste.setActionCommand("generieren");

Zudem wird der JButton an das JFrame angehängt.

frame.add(taste, BorderLayout.PAGE_END);

JButton mit dem Namen „taste“ wird an das Ende des Frames (PAGE_END) angehängt.

4.1.5 JFormattedTextField

Der Default-Konstruktor der Klasse JFormattedTextField erstellt ein einfaches JTextField, welches die Eingabe und Änderung von Textzeichen ermöglicht. Jedes Textfeld ermöglicht die Darstellung nur einer Zeile. In Verbindung mit den LayoutManagern (siehe Kapitel 4.2) ist die Größe dieser formatierten Felder mit der Größe des Fensters abstimmbar. Wird das JFrame-Fenster vergrößert, dann werden die einzelnen JFormattedTextFields größer und vice versa.

4.1.6 JTextArea

Mit der Klasse JTextArea wird ein Textbereich dargestellt, welches im Vergleich zu JTextField die Darstellung von vielen Zeilen ermöglicht. JTextArea wird für die Darstellung des Inhalts der geöffneten Su-do-ku Datei verwendet. Zudem wird auch der Willkommenstext im Textbereich dargestellt.

4.1.7 JTabbedPane

Die Benutzeroberfläche des Su-do-ku Generators beinhaltet zwei anklickbare Karten. Die erste Karte, die defaultmäßig selektiert wird (sudokuBorder), zeigt das Su-do-ku Gitter und die zweite Karte ist defaultmäßig im Hintergrund und zeigt den Textbereich (textBorder). Die erste Karte hat stets den Index 0, die zweite hat den Index 1 usw.

JTabbedPane tabbedPane;

tabbedPane = new JTabbedPane();

tabbedPane.addTab("Su-do-ku", icon2, sudokuBorder, null);

tabbedPane.addTab("Information", icon2, textBorder, null);

(25)

Anschließend wird JTabbedPane in das Fenster (frame) eingefügt und zentriert:

frame.add(tabbedPane, BorderLayout.CENTER);

4.1.8 JOptionPane

Der Su-do-ku Generator bietet nicht nur bei Ausnahmen Hilfestellung in Form von Standardialogen sondern auch Informationen und Spielregeln zu Farb-Sudoku. Die Standardialoge öffnen in einem neuen Fenster und zeigen die Information an. Welche Information nun wie angezeigt wird, hängt davon ab, welche Methode aufgerufen wird.

Im Rahmen des Su-do-ku Generators werden zwei Methoden aus der Klasse JOptionPane aufgerufen:

1. JOptionPane.showMessageDialog(frame, "\nProject: Su-do-ku Generator\nAuthor: Jasna Tusek\n\nFor Players Of All Countries\nGreetings from Croatia and Austria", "INFO zu SU-DO-KU Generator", JOptionPane.INFORMATION_MESSAGE);

2. JOptionPane.showConfirmDialog(frame, "Programm jetzt beenden?", "beenden", JoptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

Die erste Methode zeigt ein Dialog mit einer Nachricht. Die zweite Methode zeigt ein Dialog mit der Option. Dabei ist eine Bestätigung erforderlich. Der Su-do-ku Generator wird daher erst nach erfolgreicher Bestätigung geschlossen.

4.2 Layout-Manager

Das Design eines Programms wird überwiegend vom Layout-Manager bestimmt. Der Layout- Manager kann die Komponenten unterschiedlich anordnen, wie sie jeweils gut zusammenpassen.

Der Vorteil eines Layout-Managers liegt insbesondere an der automatischen Anpassung der Komponentengröße. Wird das Fenster verkleinert, dann werden proportional auch die einzelnen Komponenten verkleinert und vice versa.

Für das vorliegende Projekt werden folgende Layout-Manager verwendet: GridLayout, BoxLayout und BorderLayout.

4.2.1 GridLayout

Die Klasse GridLayout ordnet mehrere Komponenten in Zeilen und Spalten und bestimmt den Abstand zwischen den Komponenten.

JPanel sudokuPanel, panel1, panel2 .... panel9;

sudokuPanel = new JPanel(new GridLayout(3, 3, 15, 15));

sudokuPanel.add(panel1);

sudokuPanel.add(panel2); ....

sudokuPanel.add(panel9);

(26)

Die neun Panels werden an das sudokuPanel angehängt und in drei Zeilen und drei Spalten angeordnet mit dem horizontalen und vertikalen Abstand zwischen den Komponenten von 15. Jeder dieser Panels besitzt neun Textfelder, die ebenfalls in 3 Zeilen und 3 Spalten angeordnet sind. Das Resultat dieser Konstruktion ist das Su-do-ku Gitter bestehend aus 81 Textfeldern.

4.2.2 BoxLayout

Mit der Klasse BoxLayout werden Komponenten entweder in horizontaler (BoxLayout.X_AXIS) oder in vertikaler Richtung (BoxLayout.Y_AXIS) angeordnet. Zudem können weitere zwei Ausrichtungen bestimmt werden: BoxLayout.LINE_AXIS und BoxLayout.PAGE_AXIS.

JPanel sudokuBorder, textBorder;

sudokuBorder.setLayout(new BoxLayout(sudokuBorder, BoxLayout.PAGE_AXIS));

textBorder.setLayout(new BoxLayout(textBorder, BoxLayout.PAGE_AXIS));

4.2.3 BorderLayout

Mit dem BorderLayout wurde die Komponente „tabbedPane“ ins Zentrum des Fensters gerückt und die Komponente „taste“ an das Fensterende.

frame.add(tabbedPane, BorderLayout.CENTER);

frame.add(taste, BorderLayout.PAGE_END);

5. Beschreibung der Projektklassen

Die wesentlichen Merkmale der Projektklassen sind ihre Variablen, Methoden und Modifizierer.

Die Konstruktoren sind spezielle Methoden und werden daher unter Methoden zusammengefasst.

5.1 Klasse Sudokuzahl

Die Klasse Sudokuzahl besitzt zwei Variablen und folgende Methoden:

1. Sudokuzahl()

2. generiereZufallszahl() 3. generiereSudokuzahl() 4. restlicheWerte()

(27)

5.1.1 Variablen

Zunächst wird die Variable „zahl“ vom primitiven Datentyp integer deklariert und anschließend die Variable „liste“ vom Objektdatentyp List initialisiert.

private int zahl;

private List liste = new LinkedList();

5.1.2 Methoden

Der Default-Konstruktor der Klasse Sudokuzahl ruft die Methode generiereZufallszahl() auf.

public Sudokuzahl(){ ...}

Die Methode generiereZufallszahl() ruft aus der Klasse Math die Methode random() auf und generiert eine Zufallszahl zwischen 1 und 9. Diese Zufallszahl ist zugleich der Rückgabewert vom Typ integer.

public int generiereZufallszahl() {

zahl = (int)(9*Math.random()+1); //liefert eine Zahl zwischen 1 und 9 return zahl;

}

Die Methode generiereSudokuzahl() ruft die Methode generiereZufallszahl() auf und prüft ob die Zahl bereits in der Liste enthalten ist. Ist dies nicht der Fall wird die Zahl der Liste hinzugefügt.

Jede Zahl, die in die Liste hinzugefügt wird, ist zugleich auch der Rückgabewert dieser Methode vom Typ integer.

public int generiereSudokuzahl(){

...

return naechsteZahl;

}

Die Methode restlicheWerte() fügt jene Zahlen von 1 bis 9, die noch nicht in der Liste enthalten sind, der Reihe nach hinzu. Jene Zahl, die der Liste hinzugefügt wird, wird von der Methode zurückgegeben.

public int restlicheWerte(){

....

return zahl;

}

5.1.3 Modifizierer

Alle Methoden sind öffentlich zugänglich (public), das heißt aus anderen Klassen kann auf diese Methoden zugegriffen werden. Auf die Variablen zahl und liste kann nicht zugegriffen werden, da

(28)

dies auch nicht notwendig ist. Daher sind die deklarierten Variablen mit private versehen.

5.2 Klasse Generator

Die Klasse Generator besteht aus zahlreichen Variablen, jeweils neun Variablen für neun Sudokuzahlen und neun Positionen. Die implementierten Methoden sorgen für einen reibungslosen Programmablauf.

5.2.1 Variablen

Die zweidimensionalen Arrays vom Typ Integer zählen zu den wesentlichsten deklarierten Variablen. Die Arrays speichern die Sudokuwerte. Damit aber richtige Werte gespeichert werden, werden die generierten Sudokuzahlen vorübergehend in den Variablen a, b ... i festgehalten. Die Werte der einzelnen Positionen werden in den Variablen p1, p2 ... p9 gelagert.

private int a, b, c, d, e, f, g, h, i;

private boolean p1, p2, p3, p4, p5, p6, p7, p8, p9;

private Integer[][] wert;

private Integer[][] daten;

private Integer[][] zahl;

private Sudokuzahl sudokuzahl;

5.2.2 Methoden

Die Klasse Generator besitzt folgende Methoden:

1. Generator()

Der Default-Konstruktor erzeugt eine Instanz vom Objektdatentyp Sudokuzahl und ruft die Methoden generiereZahl(Sudokuzahl zahl) und bestimmePosition() auf.

public Generator(){

System.out.println("\nGenerator aktiviert");

sudokuzahl = new Sudokuzahl();

generiereZahl(sudokuzahl);

bestimmePosition();

System.out.println("\nGenerieren abgeschlossen");

}

2. Generator(File datei)

Der Konstruktor mit dem Parameter datei vom Typ File ließt den übergebenen Parameter ein und speichert die Werte in das zweidimensionale Array. Mit dem Aufruf der Methode setSudokuzahl(daten) werden die gespeicherten Werte in entsprechenden Variablen

(29)

public Generator(File datei){

...

try{

BufferedReader in = new BufferedReader(new FileReader(datei));

daten[zeile][spalte] = new Integer(aktuelleZeile.charAt(1..n)+"");

...

}

in.close();

}catch (IOException ex){

System.err.println(ex);

}

setSudokuzahl(daten);

}

3. setWerte()

setzt die richtigen Werte auf die richtige Stelle. Um eine Verwechslung zu vermeiden werden die Werte in ein neues Array gespeichert.

public void setWerte(){

wert = new Integer[10][10];

wert[1..9][1..9] = new Integer(zeigeErsteZahl() .... zeigeNeunteZahl());

...

}

4. setSudokuzahl(Integer[][] daten)

die Werte aus der Datei werden den Variablen zugewiesen um daraufhin auch die ungelösten Felder lösen zu können.

public void setSudokuzahl(Integer[][] daten){

...

if(daten[1..9][1..9].intValue() != 0){a, b, ... i = daten[1..9][1..9].intValue();}

}

Damit nun das ganze Sudokubeispiel gelöst werden kann, müssen die Sudokuzahlen 1, 2... 9 mindestens einmal in der Datei vorkommen.

5. zeigeSudoku(int zeile, int spalte)

Diese Methode wird immer dann aufgerufen, wenn ein Sudokuwert aus einer Datei angezeigt werden soll. Die übergebenen Parameter zeile und spalte vom Typ integer geben an, welcher Wert zurückgegeben werden soll.

public int zeigeSudoku(int zeile, int spalte){

int sudokuzahl= daten[zeile][spalte].intValue();

return sudokuzahl;

}

6. generiereBeispiel()

Mit der Methode generiereBeispiel() werden die Werte aus dem Array „wert“ einzeln selektiert und jene Werte, die im Beispiel angezeigt werden sollen, werden dem Array

„zahl“ zugewiesen.

(30)

7. generiereSudoku(int zeile, int spalte)

Diese Methode ruft die Methode generiereBeispiel() auf. Die Methode selbst wird von der Klasse GUI aufgerufen.

public int generiereSudoku(int zeile, int spalte){

generiereBeispiel();

int sudokuzahl = zahl[zeile][spalte].intValue();

return sudokuzahl;

}

8. loeseSudoku(int zeile, int spalte)

liefert die Lösung des Sudoku für jedes Feld. Der einmalige Aufruf gibt eine Sudokuzahl zurück. Die Lösung eines Sudokubeispiels besteht aus 81 Feldern, so dass die Methode 81 mal aufgerufen wird.

public int loeseSudoku(int zeile, int spalte){

int sudokuzahl= wert[zeile][spalte].intValue();

return sudokuzahl;

}

9. generiereZahl(Sudokuzahl zahl)

Wird ein Sudokubeispiel vom Generator generiert, dann wird die Methode generiereZahl(Sudokuzahl zahl) aufgerufen. Diese Methode weist die generierten Sudokuzahlen den Variablen a, b, ... i zu.

public void generiereZahl(Sudokuzahl zahl){

a = zahl.generiereSudokuzahl();

...

i = zahl.restlicheWerte();

}

10. bestimmePosition()

Zudem werden in der Methode bestimmePosition() die boolean Werte den einzelnen Positionen zugewiesen. Mittels einfachem Math.random wird bei fünf von neun Positionen der boolean Wert auf true geändert. Defaultmäßig haben die restlichen vier Positionen den boolean Wert false. Diese Methode entscheidet maßgeblich darüber welche Werte tatsächlich im Sudokubeispiel ausgegeben werden.

11. zeigeErsteZahl() .... zeigeNeunteZahl(); isP1, ... isP9, setP1, ... setP9

Für die Speicherung der neun Sudokuzahlen und neun Positionen dienen restliche Methoden:

zeigeErsteZahl(), zeigeZweiteZahl .... zeigeNeunteZahl() isP1, isP2 .... isP9

setP1, setP2 ... setP9

5.2.3 Modifizierer

(31)

weitere Klassen unsichtbar (private), während die Methoden auch von anderen Klassen abrufbar sein sollen (public).

5.3 Klasse Menü

Die Menüleiste des Su-do-ku Generators wird mit der Klasse Menü implementiert. Die zahlreichen Funktionen des Generators werden als eigene Variablen initialisiert, die meisten Variablen sind vom Objektdatentyp JMenu bzw. JMenuItem.

5.3.1 Variablen

Zusätzlich zu den Variablen vom Typ JMenu und JMenuItem ist es erforderlich folgende Variablen zu deklarieren:

ActionListener listener;

ButtonGroup buttongroup;

Der ActionListener-Parameter wird an den Konstruktor übergeben.

5.3.2 Methoden

Der Konstruktor mit dem Parameter vom Typ ActionListener ist die einzige notwendige Methode, mit der auch die gesamte Menüleiste implementiert werden kann. Besonderheiten sind die Implementierung der Tastenkombination, mit der ebenfalls Funktionen aufgerufen werden können.

JMenuItem neu;

neu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, Event.CTRL_MASK));

Damit die Funktion auch erkannt wird, wird ein Kommando gesetzt und der Listener (Zuhörer) hinzugefügt.

neu.setActionCommand("neu");

neu.addActionListener(listener);

Zudem muss die Hierarchie der Komponenten eingehalten werden. Die einzelnen Funktionen werden jeweils dem übergeordneten Menü (Datei, Bearbeiten, Ansicht, Optionen oder Hilfe) zugewiesen und diese Menüs werden wiederum einem übergeordneten Menü hinzugefügt.

JMenuItem gold, silber;

layout.add(gold);

layout.add(silber);

menu.add(layout);

Zum Beispiel werden die Variablen gold und silber zuerst dem übergeordneten JMenu layout

(32)

zugeordnet. Daraufhin wird layout wiederum dem übergeordneten JMenu menu zugewiesen.

5.3.3 Modifizierer

Die Variable listener vom Typ ActionListener wird außerhalb der Klasse Menü aufgerufen und enthält daher den Modifizierer „public“. Bei der Implementierung von serialisierbaren Komponenten (z.B Klassen mit dem Interface Serializable) wird stets die Deklaration der Variable static final serialVersionUID vom Typ long verlangt. In diesem Fall erbt die Klasse Menü die Komponenten der Klasse JMenuBar und zählt daher ebenfalls zur serialisierbaren Klasse.

5.4 Klasse GUI

Für das Design der grafischen Benutzeroberfläche muss die Hierarchie der Komponenten eingehalten werden. Textfelder und Textbereiche werden an JPanels angehängt, und mehrere JPanels werden einem übergeordneten JPanel zugewiesen, dieser JPanel wird wiederum an das übergeordnete JFrame angehängt. Die eingesetzten Layout-Manager sorgen dafür, dass die unterschiedlichen Komponenten auch in der gewünschten Reihenfolge angezeigt werden.

5.4.1 Variablen

Die Klasse GUI erbt von der Klasse JFrame und zählt somit genauso wie die Klasse Menü zu den serialisierbaren Klassen. Somit wird auch hier die Deklaration der Variable static final serialVersionUID notwendig. Die restlichen Variablen sind entweder vom primitiven Datentyp (int, boolean) oder vom Objektdatentyp (String, JFrame, Menu, JTextArea, JPanel, JFormattedTextField[][], JTabbedPane und Generator).

5.4.2 Methoden

Folgende Methoden (inkl. Default-Konstruktor) werden in der Klasse GUI implementiert:

1. GUI()

die wichtigsten Komponenten des Programms (JFrame, JPanel, JTabbedPane) werden schon im Konstruktor initialisiert. Auch notwendige Methoden (newMenu() und newSudokuPanel()) werden aufgerufen, so dass defaultmäßig ein leeres Sudoku-Gitter angezeigt wird.

2. newMenu()

erzeugt neue Instanz vom Typ Menü 3. newSudokuPanel()

liefert die grafische Benutzeroberfläche des Su-do-ku Gitters

(33)

aktiviert Generator, d.h neue Instanz vom Typ Generator wird erzeugt und die Sudokuwerte werden initialisiert

5. zeigeImageIcon(String name)

zeigt den übergebenen Parameter an, in diesem Fall ein PNG-Objekt 6. oeffneDatei(File datei)

öffnet den übergebenen Parameter vom Typ File. D.h nur Dateien mit der Endung .txt werden geöffnet, sonstige Dateien werden nicht geöffnet. Der Inhalt wird im Textbereich angezeigt.

7. oeffneSudoku(File datei)

öffnet zwar auch eine Datei, jedoch wird der Inhalt direkt im Sudoku Gitter angezeigt, so dass dieses Sudoku zugleich gelöst werden kann.

8. speichereSudoku(File datei)

speichert Sudoku in das übergebene Parameter vom Typ File.

9. zeigeHintergrund(int i)

zeigt die Hintergrundfarbe von der jeweiligen Position an. Der übergebene Parameter i bestimmt welche Position angezeigt wird. Der übergebene Parameter i kann die Werte 1 bis 9 einnehmen, da es neun verschiedene Positionen gibt.

10. actionPerformed(ActionEvent e)

behandelt alle Erreignisse. Jene Funktion, die vom Benutzer abgerufen wird, wird von der Methode erkannt, so dass anschließend der - diesem Kommando zugewiesene - Programmcode ausgeführt wird.

5.4.3 Modifizierer

Alle Methoden mit Ausnahme der zeigeImageIcon(String name) werden public deklariert. Die Klasse zeigeImageIcon(String name) kann auf bestimmte Objekte im World Wide Web zugreifen und wird daher vor unerlaubtem Zugriff außerhalb der Klasse geschützt, d.h protected.

protected static ImageIcon zeigeImageIcon(String name) { URL imgURL = GUI.class.getResource(name);

...

}

5.5 Klasse Main

Die Klasse Main dient der Dokumentationsfunktion und ergänzt somit die Javadoc. Zudem startet sie das gesamte Programm mithilfe der Hauptmethode. Die Deklaration von Variablen ist in dieser Klasse nicht notwendig. Zusätzlich wird der Default-Konstruktor implementiert. Um für die Javadoc ersichtlich zu werden, wird die Initialisierung der grafischen Benutzeroberfläche ebenfalls in einer eigenen Methode implementiert. Alle Methoden werden „public“ deklariert.

(34)

6. Installation und Wartung

Um das Programm starten zu können, ist die Java-Software erforderlich. Diese kann kostenlos runtergeladen und installiert werden.

Free Download der Software:

Java Entwicklungsumgebung http://java.sun.com/j2se/1.5.0/download.html

Editor http://www.eclipse.org/

Zusammengefasst besteht das Programm „Su-do-ku Generator“ aus folgenden JAVA-Klassen:

„Sudokuzahl“, „Generator“, „Menu“, „GUI“, und „Main“. Daher müssen diese Klassen zuerst installiert und kompiliert werden. Daraufhin ist der Benutzer aufgefordert die Hauptklasse aufzurufen. Mit dem Aufruf der Hauptklasse „Main“ wird das Programm gestartet.

An den einwandfreien Betrieb wurde bereits bei der Implementierung des Codes gedacht. So werden mögliche Fehler vom Programm abgefangen. Zudem wird dem Benutzer notwendige Hilfestellung geboten.

Funktionen wie das Speichern und Öffnen von Su-do-ku erfordert zudem eine genaue Einstellung des Verzeichnisses auf welches der Generator zugreifen soll. Im Original-Programmcode ist das Verzeichniss C:\\ eingestellt:

file.setDirectory("C:\\Dokumente und Einstellungen\\Admin\\workspace\\");

Wird mit dem Betriebssystem Windows XP gearbeitet, ist lediglich der Administratorname (Admin) anzupassen. Unter Mac OS X (Tiger) und Linux kann das Verzeichnis von Fall zu Fall variieren (z.B Name des Servers, persönliche Präferenzen und Einstellungen, etc.). Der Verzeichnisname unter Linux kann folgendermaßen lauten:

/srv/ai/xmbalrog/home/j99/j9950128/workspace/

Unabhängig davon auf welchem Betriebssystem gearbeitet wird, sollten alle Sudoku-Dateien in dem workspace-Ordner gespeichert werden, um einen reibungslosen Programmablauf zu garantieren. Der workspace-Ordner wird von der Eclipse automatisch erzeugt. Wird der workspace- Ordner umbenannt, muss auch dieser im Verzeichnisname angepasst werden.

Die Änderung des Verzeichnisses kann in der Methode actionPerformed(ActionEvent e) aus der Klasse GUI durchgeführt werden. Der Befehl zum Setzen des Zugriffsverzeichnisses lautet:

file.setDirectory("...\\ ...\\ ...\\workspace\\");

(35)

7. Fazit

Mit dem Programm „Su-do-ku Generator“ wurde ein eigens entwickeltes Algorithmus für Farb- Sudoku implementiert. Bei der Entwicklung des Algorithmus wurde von Bedingungen des Rätsels ausgegangen. Der Farb-Sudoku erfüllt im Vergleich zu dem gängigen Su-do-ku eine spezielle Bedingung: keine Zahl darf auf einer und derselben Farbe (d.h Position) doppelt vorkommen. Die eigentliche Herausforderung im Rahmen dieses Projekts lag in der Implementierung eines Algorithmus, der auch die spezielle Bedingung berücksichtigt.

Das gesamte Programm stellt Open Software dar und ist daher für private Zwecke frei nutzbar. Die Autorin wünscht viel Spaß mit dem Su-do-ku Generator.

Bild 8 Getestete Version des Su-do-ku Generators

(36)

Bildverzeichnis

Bild 1 Su-do-ku Feld ...5

Bild 2 Gliederung des Su-do-ku in Positionen ...6

Bild 3 Klassendiagramm ...9

Bild 4 Sequenzdiagramm ...10

Bild 5 Use Case Diagramm ...13

Bild 6 Zustandsdiagramm ...14

Bild 7 Prototyp mit Eclipse im Hintergrund...17

Bild 8 Getestete Version des Su-do-ku Generators ... 35

df

Tabellenverzeichnis

Tabelle 1 Zeittafel ...7

Tabelle 2 Stundenprognose ...7

Tabelle 3 Getestete Klassen ...16

Tabelle 4 Plattformunabhängigkeit ...17

Tabelle 5 Getestete Funktionen des Su-do-ku Generators ...18

(37)

Literaturverzeichnis

[Abts02]

Abts, Dietmar: Grundkurs JAVA – Von den Grundlagen bis zu Datenbank- und Netz- anwendungen, Friedr. Vieweg & Sohn Verlag GmbH, 3. Auflage, Braunschweig/Wiesbaden 2002.

[BeSt04]

Bernroider, Edward; Stix, Volker: Grundzüge der Modellierung – Anwendungen für die Softwareentwicklung, Facultas Verlag- und Buchhandels AG, Wien 2004.

[Diet01]

Dieterich, Ernst-Wolfgang: Java 2 – Von den Grundlagen bis zu Threads und Netzen, Oldenbourg Wirtschaftsverlag GmbH, 2. Auflage, München 2001.

[ScSc99]

Schader, Martin; Schmidt-Thieme, Lars: Java – Eine Einführung, Springer-Verlag, Heidelberg 1999.

Referenzen

ÄHNLICHE DOKUMENTE

Da für einen geübten Spieler bereits klar ist, wie gewisse Bereiche sich weiter entwickeln (ob der Gegner diese Gruppe umschliessen kann oder diese Gruppe 2 Augen bildet), wird

Die Variablen der Klasse sind nicht alle variabel. Die meisten wurden als konstant deklariert. Sie dienen nur dazu, das Spiel z.B. an mehr Karten anzupassen. Die zwei wichtigsten

Hier ist die Ausgabe nach dem Eingeben von Winkel und Geschwindigkeit, wenn das Target getroffen wurde. Installation

Der derzeit verhandelte Global Com- pact on Migration – aus dem die USA freilich ausge- stiegen sind – strebt eine (nicht-verbindliche) Kon- vention an, die im Sinne

Und die erste Lesung der Reihe „Literatur on Tour“ mit der Kelkheimerin Jutta Hajek wurde zu einem aufrüttelnden Erlebnis, weil Jutta Hajeks Buch „Siehst Du die Grenzen

Die Daten sprechen dafür, dass das Studium an der PHBern insgesamt als hochwertig beurteilt wird und sich die Ab- solventinnen und Absolventen nach einer gewissen

„Zukunftsschocks“ erleiden, die Ankunft einer hypermoder- nen Technologie oder Praxis nicht plötzlich ist: Die Zukunft hat uns jahrelang ins Gesicht gestarrt?. Zum

Auf Bildung als jenseitige Beschäftigung wird noch zurückzukommen sein. Bildung war aber natürlich auch Teil des irdischen Lebens, und das wird in der Festrede Gregors