Projekt Su-do-ku Generator



Ähnliche Dokumente
Java Projekt: Tic Tac Toe + GUI

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Lizenzen auschecken. Was ist zu tun?

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Swing Lernen am Code Teil 1

Anwendungspraktikum aus JAVA Programmierung im SS 2006 Leitung: Albert Weichselbraun. Java Projekt. Schiffe Versenken mit GUI

Datensicherung. Beschreibung der Datensicherung

Dokumentation des Projektes Tic Tac Toe

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen

TeamSpeak3 Einrichten

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Wie richten Sie Ihr Web Paket bei Netpage24 ein

Import, Export und Löschung von Zertifikaten mit dem Microsoft Internet Explorer

Installationsanleitung CLX.PayMaker Home

tentoinfinity Apps 1.0 EINFÜHRUNG

Artikel Schnittstelle über CSV

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE

Kommunikations-Management

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Installationsanleitung INFOPOST

Anleitungen zum Publizieren Ihrer Homepage

LPT1 Anschluss mit PCMCIA Karte

IDEP / KN8 für WINDOWS. Schnellstart

Installationsanleitung CLX.PayMaker Office

Bilder zum Upload verkleinern

Problemdefinition. Cash Flow Reminder. 1 Problembeschreibung: 2 Projektziel: 3 Aufgaben des Benutzers

4D Server v12 64-bit Version BETA VERSION

2. Die eigenen Benutzerdaten aus orgamax müssen bekannt sein

1. Einschränkung für Mac-User ohne Office Dokumente hochladen, teilen und bearbeiten

Dokumentation zum Spielserver der Software Challenge

DeltaVision Computer Software Programmierung Internet Beratung Schulung

SANDBOXIE konfigurieren

OpenVPN unter Linux mit KVpnc Stand: 16. Mai 2013

Bedienungsanleitung für den SecureCourier

Überprüfung der digital signierten E-Rechnung

Hilfe zur Dokumentenverwaltung

Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.

Anwenderdokumentation PersoSim

Um die Installation zu starten, klicken Sie auf den Downloadlink in Ihrer (Zugangsdaten für Ihre Bestellung vom...)

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Dokumentation IBIS Monitor

TrekStor - ebook-reader TrekStor (TS) Edition - Firmware-Update

Tapps mit XP-Mode unter Windows 7 64 bit (V2.0)

Informatik I Tutorial

Herzlich willkommen bei der Installation des IPfonie -Softclients!

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Informatik 1 Tutorial

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG

Wählen Sie bitte START EINSTELLUNGEN SYSTEMSTEUERUNG VERWALTUNG und Sie erhalten unter Windows 2000 die folgende Darstellung:

PDF-Erzeugung mit PDFCreator (nur für Windows, installiert universellen PDF-Druckertreiber) v11/01

Programmierkurs Java

GeoPilot (Android) die App

Whitepaper. Produkt: combit address manager / combit Relationship Manager. Datenabgleich zwischen Notebook und Desktop-PC / Server

Step by Step Webserver unter Windows Server von Christian Bartl

Outlook 2000 Thema - Archivierung

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

ARAkoll 2013 Dokumentation. Datum:

Live Update (Auto Update)

Einrichten des IIS für VDF WebApp. Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications

MO1 <logo otra empresa> MO1Sync Installationshandbuch MO1. MO1Sync Installationshandbuch -1-

Arbeiten mit dem Outlook Add-In

Installation von NetBeans inkl. Glassfish Anwendungs-Server

Der einfache Weg zum CFX-Demokonto

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Handbuch B4000+ Preset Manager

Installation des Authorware Webplayers für den Internet Explorer unter Windows Vista

Einkaufslisten verwalten. Tipps & Tricks

Handbuch. timecard Connector Version: REINER SCT Kartengeräte GmbH & Co. KG Goethestr Furtwangen

Anleitung zum Upgrade auf SFirm Datenübernahme

Anleitung zur Installation von Windows XP Professional und dem Multilanguage Interface

Anleitung zum Upgrade auf SFirm Datenübernahme

INSTALLATION VON INSTANTRAILS 1.7

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

FastViewer Remote Edition 2.X

Zeiterfassung-Konnektor Handbuch

ANLEITUNG ONECLICK WEBMEETING BASIC MIT NUR EINEM KLICK IN DIE WEBKONFERENZ.

1. fe.logon. 1.1 Konfigurationsprogramm SetLogonParams

Starten der Software unter Windows 7

1 Konto für HBCI/FinTS mit Chipkarte einrichten

Bedienung von BlueJ. Klassenanzeige

Nutzung von GiS BasePac 8 im Netzwerk

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

VB.net Programmierung und Beispielprogramm für GSV

Outlook Erstellen einer aus einer HTML - Vorlage INHALT

OS Anwendungsbeschreibung

Excel Pivot-Tabellen 2010 effektiv

HTW-Aalen. OpenVPN - Anleitung. Eine Installations- und Nutzungsanleitung zu OpenVPN

MSDE 2000 mit Service Pack 3a

SEP 114. Design by Contract

TeamViewer App für Outlook Dokumentation

Für Windows 7 Stand:

Version NotarNet Bürokommunikation. Bedienungsanleitung für den ZCS-Import-Assistenten für Outlook

Programmieren in Java

lññáåé=iáåé===pìééçêíáåñçêã~íáçå=

Kurzeinweisung. WinFoto Plus

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Signierte s mit Mozilla Thunderbird

Profi cash 10. Electronic Banking. Installation und erste Schritte. Ihre Spezialisten für den elektronischen Zahlungsverkehr und moderne Bezahlsysteme

Transkript:

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 1

Für Su-do-ku Fans 2

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 IDEEN FÜ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ÄT IN DETAILS...16 1.5.2 FUNKTIONALITÄT UND BENUTZERFREUNDLICHKEIT IN DETAILS...16 1.5.3 PLATTFORMUNABHÄNGKEIT...17 1.5.4 GETESTETE FUNKTIONEN...18 1.6 ABNAHME UND PRÄSENTATION...19 2. PROJEKT-API...19 2.1.UTIL.*;...19 2.2.IO.*;...19 2.3.AWT.*;...20 2.4 X.SWING.*;...20 2.5.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 3

5. BESCHREIBUNG DER 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. INSTALLATION UND WARTUNG...34 7. FAZIT...35 BILDVERZEICHNIS...36 TABELLENVERZEICHNIS...36 LITERATURVERZEICHNIS...37 4

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 5

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) java.io.serializable; (Interface) 6

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 Tabelle 2 Stundenprognose 95h Anschließend wird die Modellierung der gängigen Diagramme erstellt. 7

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. 8

1.3.1 Klassendiagramm Bild 3 Klassendiagramm 9

1.3.2 Sequenzdiagramm Bild 4 Sequenzdiagramm 10

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 11

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 12

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

1.3.5 Zustandsdiagramm Bild 6 Zustandsdiagramm 14

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. 15

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. 16

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 17

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 Menü: HILFE 18

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)); 19

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; welcome = new JMenuItem("Welcome"); 20

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 21

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. 22

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();... 23

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); tabbedpane.setselectedindex(0); 24

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); 25

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() 26

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 27

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 festgehalten. 28

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. 29

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: 5.2.3 Modifizierer zeigeerstezahl(), zeigezweitezahl... zeigeneuntezahl() isp1, isp2... isp9 setp1, setp2... setp9 Das einfache Prinzip wurde auch in der Klasse Generator umgesetzt. Die Variablen bleiben für 30

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 31

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 4. newgenerator() 32

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. 33

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 Editor http://java.sun.com/j2se/1.5.0/download.html http://www.eclipse.org/ Zusammengefasst besteht das Programm Su-do-ku Generator aus folgenden -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\\"); 34

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 35

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 dk 36

Literaturverzeichnis [Abts02] Abts, Dietmar: Grundkurs Von den Grundlagen bis zu Datenbank- und Netzanwendungen, 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. 37