Robot Karol für Delphi: Entwicklerhandbuch
Robot Karol für Delphi: Entwicklerhandbuch
Robot Karol für Delphi: Entwicklerhandbuch
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Robot</strong> <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong>: <strong>Entwicklerhandbuch</strong><br />
Reinhard Nitzsche, OSZ Handel I<br />
Version 0.1 vom 24. Januar 2003<br />
Zusammenfassung<br />
Dieses Handbuch beschreibt die <strong>Delphi</strong>-Klasse c<strong>Karol</strong> <strong>für</strong> Entwickler<br />
und Entwicklerinnen von Anwendungen mit <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong>.<br />
Inhaltsverzeichnis<br />
1 <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong> 2<br />
1.1 Unterschiede zwischen dem Original <strong>Robot</strong> <strong>Karol</strong> und <strong>Karol</strong><br />
<strong>für</strong> <strong>Delphi</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
1.2 <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong> einbinden . . . . . . . . . . . . . . . . . . . 2<br />
2 Schnittstellenbeschreibung 3<br />
2.1 Exemplare von <strong>Karol</strong> erzeugen und löschen . . . . . . . . . . 3<br />
2.2 <strong>Karol</strong> bewegen . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
2.3 <strong>Karol</strong>s Sensoren . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
2.4 Ablaufsteuerung . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
2.5 Erweiterungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
3 Laufzeitfehler 6<br />
4 Bekannte Fehler 7<br />
1
1 <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong><br />
1.1 Unterschiede zwischen dem Original <strong>Robot</strong> <strong>Karol</strong> und <strong>Karol</strong><br />
<strong>für</strong> <strong>Delphi</strong><br />
<strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong> orientiert sich weitgehend an <strong>Robot</strong> <strong>Karol</strong>. In folgenden<br />
unwesentlichen Punkten weicht <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong> jedoch vom Original ab:<br />
• Die Höhe der Welt wird nicht berücksichtigt.<br />
• Das Spielfeld von <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong> hat keine frei wählbare Höhenbeschränkung,<br />
die Ziegelstapel dürfen bis zu 32725 Steine hoch werden.<br />
• Es bestehen keinerlei Beschränkungem von <strong>Karol</strong>s Tragekapazität.<br />
<strong>Karol</strong> hat auch immer genügend Ziegel dabei.<br />
• Es ist keine 3D-Darstellung verfügbar.<br />
• Die maximal mögliche Sprunghöhe von <strong>Karol</strong> kann nicht verändert<br />
werden.<br />
• Alle wesentlichen Einstellungen, die beim Original-<strong>Karol</strong> im Menupunkt<br />
„Einstellungen“ zu tätigen waren, sind Methoden von <strong>Karol</strong><br />
<strong>für</strong> <strong>Delphi</strong> geworden oder wurden nicht implementiert.<br />
• Die Methoden Schritt(〈n〉), Hinlegen(〈n〉) und Aufheben(〈n〉)<br />
sind nicht implementiert.<br />
• Erweiterungen siehe Abschnitt 2.5.<br />
1.2 <strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong> einbinden<br />
<strong>Karol</strong> <strong>für</strong> <strong>Delphi</strong> befindet sich in der Unit u<strong>Karol</strong>. Sie wird in die Liste<br />
importierter Units im Interface-Abschnitt der eigenen Unit aufgenommen.<br />
Die Unit u<strong>Karol</strong> stellt die Klasse c<strong>Karol</strong> zur Verfügung, deren Methoden<br />
und Eigenschaften in diesem Dokument beschrieben werden.<br />
Beim Erzeugen eines <strong>Karol</strong>-Exemplars wird automatisch ein Formular geöffnet,<br />
in dem <strong>Karol</strong> und seine Welt angezeigt werden.<br />
2
2 Schnittstellenbeschreibung<br />
2.1 Exemplare von <strong>Karol</strong> erzeugen und löschen<br />
Create(〈owner〉: TForm;<br />
〈breite〉, 〈hoehe〉: Word;<br />
〈posx〉, 〈posy〉: Word);<br />
CreateFromFile(〈owner〉:TForm;<br />
const 〈f 〉: string);<br />
Create und CreateFromFile erzeugen einen neuen <strong>Karol</strong> inklusive<br />
Spielfeld und zeigen das Spielfeld sofort an. Die Größe von <strong>Karol</strong>s Spielfeld<br />
lässt sich im Nachhinein nicht mehr ändern.<br />
〈owner〉 ist das Formular, an das <strong>Karol</strong> gebunden sein soll. In der Regel wird<br />
dies das Hauptfenster der Anwendung sein.<br />
Bei Create hat das Spielfeld die Breite 〈breite〉 und die Höhe 〈hoehe〉. <strong>Karol</strong><br />
steht auf dem Feld (〈posx〉/〈posy〉) mit Blick nach Süden. Werden 〈posx〉<br />
und 〈posy〉 nicht angegeben, so wird <strong>Karol</strong> in die linke obere Ecke gesetzt<br />
(0/0).<br />
Beispiel:<br />
Create(NavigatorFrm, 20, 10);<br />
Erstellt einen neuen <strong>Karol</strong>. Seine Welt hat die Breite 20 und die Höhe 10.<br />
Weil 〈posx〉 und 〈posy〉 nicht angegeben sind, steht <strong>Karol</strong> in der Nordostecke<br />
seiner Welt.<br />
Bei CreateFromFile wird das Spielfeld aus der Datei mit dem Pfad und<br />
dem Namen 〈f 〉 ausgelesen. Diese Datei muss zuvor von <strong>Karol</strong> 2 deutsch<br />
(Freiberger/Krško) gespeichert worden sein.<br />
Beispiel:<br />
CreateFromFile(NavigatorFrm, ’test.kdw’);<br />
Erstellt einen neuen <strong>Karol</strong> und liest die im Arbeitsverzeichnis liegende Datei<br />
test.kdw ein.<br />
Dies ist die einzige Möglichkeit Quader in <strong>Karol</strong>s Welt zu platzieren!<br />
Destroy;<br />
Löscht das <strong>Karol</strong>-Exemplar.<br />
Bitte Abschnitt 4 beachten! <br />
3
2.2 <strong>Karol</strong> bewegen<br />
Schritt;<br />
Schritt(〈n〉: Byte);<br />
<strong>Karol</strong> macht einen Schritt (bzw. 〈n〉 Schritte) nach vorne.<br />
Mögliche Fehler: Sofern <strong>Karol</strong> dabei zu hoch oder zu tief springen oder in <br />
einen Quader oder durch eine Wand laufen müsste, wird der Schritt nicht<br />
ausgeführt. Fehlerbehandlung siehe Abschnitt 3.<br />
LinksDrehen;<br />
RechtsDrehen;<br />
<strong>Karol</strong> dreht sich nach links bzw. rechts.<br />
Hinlegen;<br />
Aufheben;<br />
<strong>Karol</strong> legt einen Ziegel auf das Feld vor sich bzw. nimmt von dort einen<br />
auf. Anders als im Original gibt es keine Beschränkung von <strong>Karol</strong>s Tragfähigkeit.<br />
<strong>Karol</strong> hat also immer genügend Platz im Rucksack und immer<br />
noch einen Ziegel verfügbar.<br />
Mögliche Fehler: Die Methode wird nicht ausgeführt, wenn <strong>Karol</strong> vor ei- <br />
ner Wand oder vor einem Quader steht oder bei Aufheben kein Ziegel<br />
vorhanden ist. Fehlerbehandlung siehe Abschnitt 3.<br />
Die Höhe der Ziegelstapel ist auf 32 725 Ziegel begrenzt. Hinlegen über- <br />
prüft nicht auf das Überschreiten dieser Grenze!<br />
MarkeSetzen;<br />
MarkeLoeschen;<br />
<strong>Karol</strong> setzt bzw. löscht Marken. Bereits markierte Felder dürfen nochmals<br />
markiert werden. Ebenso dürfen die „Marken“ unmarkierte Felder gelöscht<br />
werden.<br />
2.3 <strong>Karol</strong>s Sensoren<br />
Die Eigenschaften dieses Abschnittes können vom Entwickler nicht direkt<br />
verändert werden (read-only). Sie repräsentieren sozusagen <strong>Karol</strong>s Sensoren.<br />
4
IstZiegel: Boolean;<br />
IstZiegel(〈n〉:Byte): Boolean;<br />
Wahr, wenn <strong>Karol</strong> auf einen Ziegelstapel schaut. Die zweite Version der<br />
Eigenschaft ist wahr, wenn der Ziegelstapel genau die Höhe 〈n〉 hat.<br />
IstWand: Boolean;<br />
Wahr, wenn <strong>Karol</strong> auf eine Wand oder einen Quader schaut.<br />
IstMarke: Boolean;<br />
Wahr, wenn <strong>Karol</strong> auf einem markierten Feld steht.<br />
IstVoll: Boolean;<br />
IstLeer: Boolean;<br />
Wahr, wenn <strong>Karol</strong>s Rucksack voll bzw. leer ist. Diese beiden Eigenschaften<br />
liefern zur Zeit immer „wahr“ (true).<br />
IstSueden: Boolean;<br />
IstNorden: Boolean;<br />
IstWesten: Boolean;<br />
IstOsten: Boolean;<br />
Diese Eigenschaften sind wahr, wenn <strong>Karol</strong> in die entsprechende Richtung<br />
schaut.<br />
2.4 Ablaufsteuerung<br />
Diese Methoden sind im Original-<strong>Karol</strong> Teil der Benutzeroberfläche bzw.<br />
der Programmiersprache.<br />
Schnell;<br />
Die Aktualisierung der Anzeige wird ausgeschaltet. Bei Fehlern (siehe Abschnitt<br />
3) wird die Anzeige in jedem Fall aktualisiert.<br />
Langsam;<br />
Die Aktualisierung der Anzeige wird wieder angeschaltet. Nach jeder Veränderung<br />
von <strong>Karol</strong> oder seiner Welt wird die Anzeige aktualisiert.<br />
5
SetVerzoegerung(〈t〉: LongInt);<br />
function GetVerzoegerung: LongInt;<br />
Setzt bzw. liefert die Wartezeit, die vor dem Neuzeichnen von <strong>Karol</strong> verstreicht.<br />
Sofern <strong>Karol</strong> auf „Schnell“ geschaltet wurde, hat dieser Wert keine<br />
Bedeutung!<br />
2.5 Erweiterungen<br />
Pos_x: Word;<br />
Pos_y: Word;<br />
Diese beiden Eigenschaften liefern die Koordinaten, an denen <strong>Karol</strong> sich<br />
gerade befindet. Sie können nur gelesen, nicht aber geschrieben werden!<br />
Repaint;<br />
Repaint(〈komplett〉: Boolean);<br />
Diese Methoden sind nur zur Korrektur von etwaigen Fehlern von <strong>Karol</strong><br />
<strong>für</strong> <strong>Delphi</strong> wichtig. Sie zeichnen <strong>Karol</strong> und seine Welt neu. Standardmäßig<br />
(Repaint und Repaint(false)) wird nur derjenige Teil der Welt neu<br />
gezeichnet, der sich seit der letzten Operation verändert haben könnte. 1<br />
Nur der Aufruf Repaint(true) führt zu einem kompletten Neuzeichnen<br />
der gesamten Welt.<br />
3 Laufzeitfehler<br />
In bestimmten Fehlersituationen ist es notwendig, dass der Benutzer <strong>Karol</strong><br />
sagt, was er tun soll, weil <strong>Karol</strong> selbst diese Entscheidung nicht treffen<br />
kann. Diese Situationen können jederzeit während der Laufzeit des Programms<br />
auftreten:<br />
1. <strong>Karol</strong> steht vor einer Wand oder einem Quader und soll einen Schritt<br />
nach vorne machen.<br />
2. <strong>Karol</strong> soll einen zu hohen Sprung ausführen.<br />
3. <strong>Karol</strong> soll einen Ziegel aufheben und es ist keiner da.<br />
In allen diesen Situationen wird wie folgt verfahren:<br />
1 Also das Feld auf dem <strong>Karol</strong> steht und alle direkt benachbarten Felder.<br />
6
1. Die Anzeige wird aktualisiert.<br />
2. Der Benutzer bekommt eine entsprechende Meldung angezeigt und<br />
wird aufgefordert zu entscheiden, ob <strong>Karol</strong> weiter machen oder das<br />
Programm beendet werden soll.<br />
4 Bekannte Fehler<br />
• Die Größe der Welt (Spielfeld) ist derzeit auf 20 mal 20 Felder be- <br />
grenzt. Bei größeren Welten gab es Programmabstürze beim Erzeugen<br />
der Welt. Die verfügbare Größe erscheint <strong>für</strong> die meisten Anwendungen<br />
ausreichend.<br />
• Beim Löschen und anschließenden Wiederherstellen von <strong>Karol</strong> über <br />
den Konstruktor Create kommt es zum Programmabsturz. 2<br />
• Die Fehlerbehandlung beim Erstellen von <strong>Karol</strong> ist äußerst lücken- <br />
haft (z. B. kann <strong>Karol</strong> außerhalb seiner Welt stehen.).<br />
2 Der Grund ist unbekannt. Besonders merkwürdig: Das Problem tritt bei<br />
CreateFromFile nicht auf, obwohl dabei intern auf Create zurückgegriffen wird.<br />
7