1.2 |
Roboter einbauen und Button zur Steuerung aktivieren 1.c)
procedure TControlFrm.ItemsErzeugen;
//
-----------------------------------------------------------------------
// Zweck : Erzeugen und initialisieren aller (neuen) Items in einer Welt
// vorher : -
// nachher: Item ist erzeugt
// -----------------------------------------------------------------------
begin
RD1 := TRobot.Create;
// erzeugt RD1
RD1.SetPos('C',1);
// meldet RD1 mit Anfangsposition in der Welt an
Welt.AllesZeigen;
// in der letzten Zeile, auch wenn nichts
gesetzt ist
end;
2.)
procedure TControlFrm.VorBtnClick(Sender: TObject);
// ------------------------------------------------
begin
inherited; // ist vom System eingefügt
RD1.Vor;
// Aufruf der Roboter-Methode 'Vor'
end;
|
1.3 |
Buttons in das Formular einfügen
procedure
TControlFrm.RechtsBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
inherited;
RD1.RechtsDrehen;
end;
3a)
Rechts herum
Vor C 2
Vor C 3
RechtsDrehen C 3
Vor B 3
Vor A 3
RechtsDrehen A 3
Vor A 2
Vor A 1
RechtsDrehen A 1
Vor B 1
Vor C 1
Links herum
RechtsDrehen C 1
Vor B 1
Vor A 1
RechtsDrehen A 1
RechtsDrehen A 1
RechtsDrehen A 1
Vor A 2
Vor A 3
RechtsDrehen A 3
RechtsDrehen A 3
RechtsDrehen A 3
Vor B 3
Vor C 3
RechtsDrehen C 3
RechtsDrehen C 3
RechtsDrehen C 3
Vor C 2
Vor C 1
3b)
3 Mal nach RechtsDrehen
|
2.1 |
Sequenzen
procedure TControlFrm.ItemsErzeugen;
// -------------------------------------------------------------
begin
RD1 := TRobot.Create;
RD1.SetPos('C',1);
RD1.MacheSpur;
Welt.AllesZeigen;
end;
2 b)
procedure TControlFrm.UmDieBaeume;
// --------------------------------------------------------------
begin
RD1.Vor;
RD1.Vor;
RD1.Vor;
NachLinksDrehen;
RD1.Vor;
RD1.Vor;
NachLinksDrehen;
RD1.Vor;
RD1.Vor;
Rd1.RechtsDrehen;
RD1.Vor;
RD1.Vor;
RD1.RechtsDrehen;
RD1.Vor;
RD1.Vor;
NachLinksDrehen;
RD1.Vor;
RD1.Vor;
NachLinksDrehen;
RD1.Vor;
RD1.Vor;
RD1.RechtsDrehen;
RD1.Vor;
RD1.Vor;
RD1.RechtsDrehen;
RD1.Vor;end;
end;
Zwischenfrage: Warum kann man nicht RD1.LinskDrehen schreiben?
Roboter haben keine eigene Methode dafür.
e)
procedure
TControlFrm.GoBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
inherited;
UmDieBaeume;
end;
|
2.3 |
Auswahl, zweiseitig
1)
procedure TControlFrm.Vorwaerts3;
// -----------------------------------------------------------------------
begin
if RD1.VorneFrei
then RD1.Vor
else
begin
RD1.RechtsDrehen;
RD1.Vor;
NachLinksDrehen;
RD1.Vor;
RD1.Vor;
NachLinksDrehen;
RD1.Vor;
RD1.RechtsDrehen
end;
end;
2)
procedure
TControlFrm.Vorwaerts4;
// -----------------------------------------------------------------------
begin
NachLinksDrehen;
Vorwaerts3;
Vorwaerts3;
Vorwaerts3;
Vorwaerts3;
Vorwaerts3;
Vorwaerts3;
Vorwaerts3;
Vorwaerts3;
Vorwaerts3;
end; |
3.2 |
Vererbung
1.)
UNIT uMyRobot;
(* ******************************************************************** *)
(* K L A S S E : TMyRobot *)
(* -------------------------------------------------------------------- *)
(* Version : 0.9 *)
(* Autor : *)
(* Beschreibung: Die Klasse bildet den neuen verbesserten Roboter der *)
(* 3. Generation ab. *)
(* Compiler : Delphi 7 *)
(* Aenderungen : 0.9 05-APR-04 *)
(* ******************************************************************** *)
INTERFACE
// =======================================================================
uses
uRobot;
type
TMyRobot = class(TRobot) // erbt alles von Ur-Roboter
TRobot
public
constructor Create; override;
procedure Init;
procedure Vor;
procedure LinksDrehen;
private
end;
(* -------------------- B e s c h r e i b u n g -------------------------
Oberklasse : TRobot
Bezugsklassen : -
Methoden
--------
Create
Auftrag: Exemplar erzeugen und initilaisieren
vorher :
nachher:
Init
Auftrag: Anfangswerte setzen
vorher : -
nachher:
Vor
Auftrag: Exemplar geht 1 Feld in der aktuellen Richtung vorwärts, wenn
das Feld frei ist
LinksDrehen
Auftrag: Auf der aktuellen Position um 90 Grad nach links drehen
vorher : -
nachher: neue Richtung gesetzt
--------------------------------------------------------------------- *)
IMPLEMENTATION
// ====================================================================
USES graphics; // importiert TColor
constructor TMyRobot.Create;
// --------------------------------------------------------------------
begin
inherited;
Init;
end;
procedure TMyRobot.Init;
// --------------------------------------------------------------------
begin
SetFarbe(clYellow);
end;
procedure TMyRobot.Vor;
// --------------------------------------------------------------------
begin
if VorneFrei
then inherited Vor;
end;
procedure TMyRobot.LinksDrehen;
// --------------------------------------------------------------------
begin
RechtsDrehen;
RechtsDrehen;
RechtsDrehen;
end;
END. // -------- UNIT -------------
2.)
unit uControl;
(* ******************************************************************** *)
(* K L A S S E : TControlFrm - KarelD. Robot *)
(* -------------------------------------------------------------------- *)
(* Version : 2.2.1 *)
(* Autor : (c) 2004, Siegfried Spolwig *)
(* Beschreibung: Die Klasse hat Control-Funktion für die Welt und *)
(* die Akteure. *)
(* Compiler : Delphi 6.0 *)
(* Aenderungen : 2.2 21-JUL-04 s. Doc. *)
(* known bugs : bei schneller ClickFolge werden nicht alle Fußspuren *)
(* gesetzt. *)
(* ******************************************************************** *)
interface
// =======================================================================
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,StdCtrls, Buttons, uProtBox,
uFenster, // Oberklasse; zeigt die Welt
uKarel,
uRobot,
uMyRobot; // Fachklassen nach Bedarf
type
TControlFrm = class(TFensterFrm)
UserPnl : TPanel;
EndeBtn : TBitBtn;
GroupBox1 : TGroupBox;
VorBtn : TSpeedButton;
RechtsBtn : TSpeedButton;
LinksBtn : TSpeedButton;
GoBtn : TButton;
procedure EndeBtnClick(Sender: TObject);
procedure RechtsBtnClick(Sender: TObject);
procedure GoBtnClick(Sender: TObject);
procedure VorBtnClick(Sender: TObject);
procedure LinksBtnClick(Sender: TObject);
procedure ItemsErzeugen; // darf nicht gelöscht werden!
end;
var
ControlFrm : TControlFrm;
RD1 : TRobot;
Robby : TMyRobot;
implementation
{$R *.dfm}
// =======================================================================
procedure TControlFrm.ItemsErzeugen;
// -----------------------------------------------------------------------
// Zweck : Erzeugen und initialisieren aller (neuen) Items in einer Welt
// vorher : -
// nachher: Item ist erzeugt
// -----------------------------------------------------------------------
begin
Robby := TMyRobot.Create;
Robby.SetPos('C',1);
Welt.AllesZeigen; // in der letzten Zeile, auch wenn nichts gesetzt ist
end;
procedure TControlFrm.EndeBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
// Zweck : Entfernt alle Items aus dem Speicher, speichert und schließt
// die ProtBox und zum Schluss das ControlFrm.
// nachher: Programm beendet.
// -----------------------------------------------------------------------
begin
Welt.AlleItemsEntfernen;
ProtokollFrm.Close;
Close;
end;
procedure TControlFrm.VorBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
inherited;
Robby.Vor;
end;
procedure TControlFrm.RechtsBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
inherited;
Robby.RechtsDrehen;
end;
procedure TControlFrm.LinksBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
inherited;
Robby.LinksDrehen;
end;
procedure TControlFrm.GoBtnClick(Sender: TObject);
// -----------------------------------------------------------------------
begin
inherited;
// UmDieBaeume;
// Vorwaerts2;
// Vorwaerts3;
// vorwaerts4
// ZumBaum1;
// ZumBaum2;
// BaumSuchen;
end;
END. //--- Unit -- 4)
Weitere neue Methoden für den Roboter könnten sein:
LinksDrehen; RechtsFrei; LinksFrei; Prüfen, ob er vor dem Abgrund (Offlimits)
steht; u. a. ... |
4.2 |
Aggregation
UNIT uMyWorld;
(* ******************************************************************** *)
(* K L A S S E : TMyWorld
*)
(* -------------------------------------------------------------------- *)
(* Version : 2.2
*)
(* Autor :
*)
(* Beschreibung: Die Klasse bildet die Welt 'MyWorld'mit einem Haus und *)
(*
einem Monster ab. *)
(* Compiler : Delphi 6
*)
(* Aenderungen : 0.9 28-MAR-04
*)
(* ******************************************************************** *)
INTERFACE
// =======================================================================
uses
uWelt,
uHaus,
uCritter; // und was man man sonst gern drin hätte
type
TMyWorld = class(TWelt)
protected
Haus : THaus;
Critter : TCritter;
public
constructor Create; override;
procedure Init;
end;
(* -------------------- B e s c h r e i b u n g -------------------------
Oberklasse : TWelt
Bezugsklassen : - import:
Methoden
--------
Create
Auftrag: Haus, Critter erzeugen und init.
Alle Objekte der vorigen
Welt entfernen
vorher :
nachher: done.
Init
Auftrag: Anfangswerte setzen
vorher :
nachher: Bäume, Mauern, Haufen, Häuser gesetzt
Set...
Auftrag: Attribut schreiben
vorher :
nachher: Attribut ist gesetzt
Get...
Auftrag: Attribut aus dem Objekt lesen
vorher :
nachher: -
--------------------------------------------------------------------- *)
IMPLEMENTATION
// ====================================================================
USES graphics,
uFenster; // importiert Welt und was gebraucht wird
constructor TMyWorld.Create;
// --------------------------------------------------------------------
begin
inherited Create;
Welt.AlleItemsEntfernen; // alten Kram weg
Haus := THaus.Create; // die aggregierten Objekte erzeugen
Haus.SetPos('H',2);
Critter := TCritter.Create;
Critter.SetPos('A',8);
Critter.SetBild('.\bilder\monster.bmp');
Init;
Welt.AllesZeigen;
end;
procedure TMyWorld.Init;
// --------------------------------------------------------------------
begin
SetFuellFarbe(clgreen);
Rasterlinie.SetFarbe(clSilver);
end;
END. // -------- UNIT -------------
|