OSZ Handel I
Informatik

Karel D. Robot
Anhang - Lösungen

S. Spolwig
5.2

[ Informatik | Unterrichtsmaterialien | Karel ]
Startseite

Kapitel
1.2
1.3
1.5
2.1
2.2
2.3
3.2
 
4.2

 

 

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

 

1.5 Interne GUI-Methode im Formular schreiben und mit Button aufrufen

1 a), b)

type
  TControlFrm = class(TFensterFrm)
   UserPnl : TPanel;
   EndeBtn : TBitBtn;
   GroupBox1 : TGroupBox;
   VorBtn : TSpeedButton;
   RechtsBtn: TSpeedButton;
   LinksBtn: TSpeedButton;

   procedure EndeBtnClick(Sender: TObject);
   procedure RechtsBtnClick(Sender: TObject);
   procedure VorBtnClick(Sender: TObject);
   procedure LinksBtnClick(Sender: TObject);

   procedure NachLinksDrehen;
   procedure ItemsErzeugen; // darf nicht gelöscht werden!
end;
 

 

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.2

Auswahl, einseitig - Bedingungen

c)

procedure TControlFrm.GoBtnClick(Sender: TObject);
// --------------------------------------------------------------
begin
  inherited;
  Vorwaerts2;
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 -------------
 

 

©  05. April 2006    Siegfried Spolwig

page_top