Dienstag, 9. März 2010

Lass dein Handy Sudokus lösen!

Meine fünfte und letzte J2ME-Anwendung (Überblick über alle meine Handyprogramme hier) ist ein Sudokulöser für Handys, der vielleicht sogar dem einen oder anderen einmal nützlich sein könnte.
Die Benutzung gestaltet sich eigentlich ganz einfach: Über die Handy-Tastatur wird das Sudoku eingegeben, was zugegeben etwas umständlich ist, und per mehrmaligen Druck auf die Rautetaste (#) wird das Sudoku schrittweise gelöst (siehe Video).
Der Lösungsalgorithmus ist eigentlich auch recht simpel und orientiert sich an meiner Strategie Sudokus per Hand zu lösen:
  • Grundsätzlich kommen für jedes Feld die Zahlen von 1 bis 9 als "Kandidaten" in Frage.
  • Ich suche mir ein bestimmtes Feld aus und schaue welche Zahlen bereits in der gleichen Zeile, Spalte und "Box" (ihr wisst was gemeint ist, oder?) stehen und kann diese sofort als Kandidaten für dieses Feld ausschließen.
  • Bleibt nur ein solcher Kandidat übrig, ist das die richtige Zahl für dieses Feld.
  • So verfahre ich immer wieder mit jedem Feld bis das Sudoku gelöst ist.
Anmerkung: Natürlich verfahre ich nicht nur nach dem oben beschriebenen Verfahren, sondern nutze jede Menge "Abkürzungen", sonst würde man ja verrückt werden... :-)

Mathematisch könnte man das so beschreiben:
Ki,j sei die Kandidatenmenge des Feldes Fi,j in der Zeile i und Spalte j und ist zu Beginn Ki,j = {1...9}.
Z1...Z9 sind die Mengen der je in einer Zeile enthaltenen Zahlen.
S1...S9 sind die Mengen der je in einer Spalte enthaltenen Zahlen.
B1,1...B3,3 sind die Mengen der je in einer Box enthaltenen Zahlen.
Für die Kandidatenmenge des Feldes Fi,j gilt dann in jedem Iterationsschritt
Ki,j = Ki,j \ Zi  ∩  Ki,j \ Sj  ∩  Ki,j \ Bi,j oder kürzer Ki,j = Ki,j \ (Zi ∪  Sj ∪ Bi,j).
Sprich in jedem Iterationsschritt wird die Kandidatenmenge des Feldes um die Zahlen, die in der gleichen Zeile, Spalte und Box enthalten sind, reduziert.
In Java sieht das ganze so aus:

candidatesSet = new Set(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9});
candidatesSet.remove(colSet.merge(rowSet).merge(boxSet));

Wobei Set eine eigene Klasse ist und eine mathematische Menge repräsentiert. Die Methode Set.merge führt zwei Mengen zusammen und gibt die Vereinigungsmenge zurück.

Ich habe für die Darstellung des Sudokus das Lightweight UI Toolkit (LWUIT), da es im Standard-LCDUI kein Tabellen-Widget gibt.

Die App sollte auf so ziemlich allen Java-Handys laufen, wobei ich vermute, dass (obwohl kein Beschleunigungssensor verwendet wird) die Java-Plattform 8 vorausgesetzt wird. Getestet wie immer nur mit einem Sony Ericsson K850i, W980 und C902, mit neueren Geräten sollte es keine Probleme geben.
Hier könnt ihr euch die Anwendung herunterladen und über USB oder Bluetooth auf eurem Handy installieren. Viel Spaß damit!

Bei Interesse veröffentliche ich auch gerne Ausschnitte des Java-Quellcodes.

Dienstag, 2. März 2010

Mäxle: Trinkspiel für dein Handy

Maexle ist, wie der Name schon vermuten lässt, die Umsetzung meines liebsten Trinkspiels (neben Katongo, oder wenn's schnell gehen muss auch gerne Pajongo ;-)) Mäxle. Die Regeln und etliche Variationen können in diesem Wikipediaartikel nachgelesen werden, ebenso weitere Bezeichnungen für das Würfelspiel, wie z.B. Meiern (scheinbar der "offizielle" Name), Mäxchen, Meier, Lügenmax(-mäx), Schummelmax, Mexican, Mexico, Mäxchen Meier, Lügen, Riegen, Einundzwanzig und mein Favorit: Meterpeter :-)
Wie schon bei den letzten drei Teilen meiner Serie, handelt es sich hierbei wieder um eine J2ME-Anwendungen für geeignete Handys (siehe unten), die ich kostenlos zum Download anbiete.
Features:
  • Gewürfelt werden kann sowohl per Tastendruck, als auch viel natürlicher durch bloßes Schütteln des Handys (Beschleunigungssensor vorausgesetzt).
  • Bei jedem Wurf vibriert das Handy und es erklingt ein realistisches Würfelgeräusch. Erst wenn dieses verschwindet, kann der Nächste würfeln, sodass man nicht heimlich doppelt würfeln kann (zum Bescheißen aber gleich mehr ;-)).
  • Die Sterntaste (*) aktiviert den Cheat-Modus: Jetzt kann auf 1, 2, 3, 4, 5, 6 entsprechend ein 1er-, 2er-, 3-er, 4er-, 5-, 6-er Pasch und auf 0 ein Mäxle hingemogelt werden.
  • Die Rautetaste (#) deaktiviert den Cheat-Modus wieder, sodass deine Mitspieler nicht so schnell hinter dein Geheimnis kommen können.
  • Hält man die 0 Taste während des Schüttelns gedrückt, ändern sich die zwei Würfelaugen nicht, was bei strategischem Einsatz recht nützlich sein kann.
  • Die Würfel werden bei jedem Wurf gedreht.


Die technische Umsetzung basiert auf einer Vektorgrafik (SVG), die nach Registrierung des Schüttelns (1,5g ≈ 14,71500 m/s^2) die Würfelobbjekte ähnlich wie bei Gravitation dreht und über DOM-Operationen (SVG ist ein XML-Format) die durch Zufall bzw. (gewolltem ;-)) Zufall  bestimmten Würfelaugen ein- (visibility="visible") bzw. ausblendet (visibility="hidden"). Weitere Fragen können gerne in den Kommentaren gestellt werden.

Da auch dieses Spielchen wieder auf den Beschleunigungssensor des Handys zugreift, funktioniert es nur auf Geräten, die einen solchen besitzen und auf denen mindestens die Java-Plattform 8 läuft. Speziell das JSR 256 (Mobile Sensor API) muss unterstützt werden. Getestet wurde es mit einem der ersten Sony Ericsson Handys, das diese Bedingungen erfüllt, dem K850i. Außerdem getestet auf dem W980 und C902, mit neueren Geräten sollte es keine Probleme geben.
Wenn euer Handy diese Anforderungen erfüllt, könnt ihr euch die Anwendung hier herunterladen und über Bluetooth oder USB auf das Gerät laden. Viel Spaß damit!

Bei Interesse veröffentliche ich auch gerne Ausschnitte des Java-Quellcodes.

Eine kleine Anmerkung noch zum Schluss: Auf dem K850i muss der erste Wurf durch Tastendruck geschehen, da die Anwendung sonst einfriert. Danach kann dann auch durch Schütteln gewürfelt werden. Auf anderen Geräten ist mir dieser Bug noch nicht begegnet.