Labyrinthe bauen
Es ist erstaunlich einfach, ein Labyrinth zu bauen, und man findet dazu auch eine Menge Anleitungen. Ich möchte hier die Beschreibung von MazeWorks aufgreifen und in Java umsetzen.
Im Rohzustand besteht das Labyrinth aus einer Anzahl von Zellen, die alle von vier Wänden begrenzt sind. Darin entstehen dann die Gänge, indem man an einer beliebigen Stelle startet und dann die folgenden Schritte so lange wiederholt, bis man in allen Zellen einmal gewesen ist:
- Wähle eine beliebige Nachbarzelle, in der Du noch nicht warst.
- Wenn Du eine findest, dann entferne die Zwischenwand zu dieser Zelle und begebe Dich dorthin. Wenn Du keine solche Nachbarzelle findest, gehe zurück zur letzten besuchten Zelle.
Klingt ganz einfach, und die Umsetzung ist auch nicht schwer.
Framework zum Spielen?
Gleich vorweg: Nein, das Play Framework dient nicht der Spieleprogrammierung. Es geht um ganz normale Webanwendungen, und zwar in Java. Damit bekommt die immer länger werdende Kette von Webframeworks eine weitere Perle angehängt, und nach erster Betrachtung scheint es sich um ein sehr interessantes und sehenswertes Exemplar zu handeln! Jedenfalls, wenn man Wert auf eine flache Lernkurve, gute Toolunterstützung und Effizienz legt. Java sollte man schon beherrschen, aber viel mehr braucht man eigentlich nicht.
Wenn ich ein neues Framework anschaue, frage ich mich zuerst, ob ich damit schneller zum Ergebnis komme als mit Grails. Der nächste wichtige Punkt ist, wie schnell sich Änderungen am Datenmodell und in der Benutzeroberfläche vornehmen lassen (Erweiterung, Refactoring, Deployment). Und nicht zuletzt geht es auch darum, wie klar und übersichtlich man den Quellcode strukturieren kann. Was erzwingt das Framework, was kann man nach eigenen Vorstellungen organisieren?
Eine tierische Basic-to-Java Übersetzung
Kürzlich habe ich zwei Bücher im Web wiedergefunden, die mich vor langer Zeit mal beschäftigt haben: BASIC Computer Games und More BASIC Computer Games. Alle Quellcodes sind als GIFs enthalten, so dass man genau wie früher abtippen muss. Sehr nostalgisch...
Dabei helfen die vielen GOTO-Anweisungen nicht gerade beim Verständnis. Nach der Lektüre von Clean Code tun einem die BASIC-Programme geradezu in den Augen weh - und das liegt nicht nur an der niedrigen Scanauflösung der GIFs. Programme sollten beim Durchlesen auch zu verstehen sein, und das mit möglichst wenigen Kommentaren.
Ich habe eines der Spiele herausgepickt und in Java neu geschrieben. Gespielt wird in der Textkonsole, und als kleines Bonbon speichert das Programm seine gesammelten Erfahrungen am Ende des Spiels in eine Neodatis-Datenbank.
Tutorial: Erste GUI-Anwendungen mit Scala
Dank Programming in Scala stellen sich nach und nach erste Erfolgserlebnisse mit dieser Programmiersprache ein, und sie macht alles in allem richtig Spaß – obwohl die Unterstützung in den gängigen IDEs bislang nur rudimentär ist.
Was mich besonders verblüfft: Die extrem kompakte Art, mit Scala grafische Benutzeroberflächen auf Swing-Basis aufzubauen. Vorher hatte ich schon mit JavaFX und Groovy SwingBuilder experimentiert, aber keines von beiden war so überzeugend.
Hier ein paar grundlegende Schritte zur GUI-Erzeugung.
Scala-Anwendungen außerhalb von Netbeans starten
Ein Stolperstein, auf den vermutlich jeder schnell trifft, der Scala mit Netbeans ausprobieren möchte: Außerhalb der IDE bekommt man beim Starten der produzierten JAR-Datei eine Fehlermeldung wie
Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject
at java.lang.ClassLoader.defineClass1(Native Method)
(...)
... 13 more
Das kann man sehr leicht lösen, indem man dem Netbeans-Projekt noch die Datei "scala-library.jar" als Library hinzufügt. Diese Datei befindet sich in "lib" im Installationsverzeichnis von Scala.
Wenn man das Scala-Projekt in Netbeans dann nochmal neu kompiliert, enthält auch das "dist"-Verzeichnis die Scala-Library und das Programm kann per Befehlszeile (z.B. java -jar "ScalaApplication.jar") gestartet werden.
JPEG Resizer
Neulich brauchte ich ein Java-Programm, um eine Menge JPEG-Dateien möglichst schnell und automatisiert zu verkleinern. Dazu habe ich ein paar Code-Schnipsel aus verschiedenen Foren zusammengetragen und das hier daraus gemacht:
Code:
package jpegresizer; | |
| |
import com.sun.image.codec.jpeg.JPEGCodec; | |
import com.sun.image.codec.jpeg.JPEGEncodeParam; | |
import com.sun.image.codec.jpeg.JPEGImageEncoder; | |
import java.awt.Graphics; | |
import java.awt.Image; | |
import java.awt.image.BufferedImage; | |
import java.io.File; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import javax.imageio.ImageIO; | |
import javax.swing.ImageIcon; | |
| |
/** | |
* JPEG Resizer | |
* @author Jean-René Thies | |
*/ | |
public class Resizer { | |
| |
/** | |
* Resize a JPEG file and save it. | |
* Either the new width or the new heigth must be greater than zero. | |
* If the width is greater than zero, the new height will be calculated. | |
* If the width is zero and the height is greater than zero, the width will be calculated. | |
* | |
* @param inputfile complete path to original jpeg file | |
* @param outputfile complete save path | |
* @param newWidth width in pixel | |
* @param newHeight height in pixel | |
* @return success of resize and save | |
*/ | |
public static boolean resize(String inputfile, String outputfile, int newWidth, int newHeight) { | |
if (newWidth > 0 || newHeight > 0) { | |
try { | |
Image img = new ImageIcon(ImageIO.read(new File(inputfile))).getImage(); | |
| |
if (newWidth > 0) { | |
float faktor = (float) newWidth / img.getWidth(null); | |
newHeight = (int) (img.getHeight(null) * faktor); | |
} else { | |
float faktor = (float) newHeight / img.getHeight(null); | |
newWidth = (int) (img.getWidth(null) * faktor); | |
} | |
| |
Image scaledImage = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); | |
BufferedImage outImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); | |
Graphics g = outImg.getGraphics(); | |
g.drawImage(scaledImage, 0, 0, null); | |
g.dispose(); | |
| |
JPEGImageEncoder jpegImageEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(outputfile)); | |
JPEGEncodeParam param = jpegImageEncoder.getDefaultJPEGEncodeParam(outImg); | |
param.setQuality(0.9F, true); | |
jpegImageEncoder.encode(outImg, param); | |
return true; | |
} catch (IOException e) { | |
e.printStackTrace(); | |
return false; | |
} | |
} else { | |
return false; | |
} | |
} | |
} |
Die "resize"-Methode nimmt den Pfad der Originaldatei und den der zu speichernden Datei an, außerdem die gewünschte Breite oder Höhe - eine der beiden Angaben kann 0 sein, dann wird der andere Wert angenommen und entsprechend proportional skaliert. Die Bildqualität des Outputs ist in der Methode selbst anpassbar.
Wie die Importe zeigen, ist eine Java-Version von Sun nötig.
:: Nächste >>