| Path: | scrabble.rb |
| Last Update: | Mon Jan 07 00:27:08 +0100 2008 |
Dies ist ein Beitrag zum Dynamic Languages Shootout. Das Programm implementiert einen Algorithmus, der auf einem 15x15 Felder grossen Spielfeld Wörter nach den von Scrabble bekannten Regeln platziert. Die verschiedenen Buchstaben geben je nach Häufigkeit ihres Vorkommens in der deutschen Sprache Punkte, es wird also versucht, möglichste teure Wörter zu legen. Es werden 5 Runden gespielt und das Spielbrett jeweils visualisiert.
Ich habe zwei Varianten implementiert, eine für Standard Ruby sowie eine für JRuby, welche ein GUI mit Swing besitzt. Ausserdem lassen sich die Klassen mit JRuby zu Java Bytecode kompilieren und mit den JRuby Libraries zusammen in ein Jar packen, welches dann entweder direkt oder per Java Web Start ausgeführt werden kann. Es gibt also folgende Möglichkeiten:
Es wird erwartet, dass das Wörterbuch als de_DE.dic im Verzeichnis liegt. Die Swing-Variante besitzt aber auch die Möglichkeit, es aus dem Internet nachzuladen, da ich noch nicht herausgefunden habe wie ich mit JRuby Dateien aus dem Jar lese.
Eine Anmerkung zur Webstart Variante: Es dauert leider recht lange, bis das erste Frame erscheint, die Ursache dafür habe ich noch nicht gefunden.
Der Lösungsansatz für das Scrabble-Problem ist recht simpel: Das Wörterbuch wird jede Runde nach allen Wörtern durchsucht, welche mit dem aktuellen Vorrat und den bereits gesetzten Buchstaben gebildet werden können. Dabei werden einfach die bereits verwendeten Buchstaben mit in den Pool geworfen und alle gültigen Wörter herausgesucht, nach ihrer Wertigkeit sortiert und danach stupide versucht, auf dem Brett zu platzieren, bis eines passt. Dabei werden natürlich alle Kriterien beachtet, also ob das Wort ein bestehendes ergänzt und es wird sichergestellt, dass immer nur gültige Wörter liegen.
Falls das jar erstellt werden soll, müssen einige Punkte beachtet werden:
Viel Spass!
Mirko Stocker, me@misto.ch
Der gesamte Code ist unter den Bedingungen der LGPL v2 oder höher freigegeben.