HSG

Aktuelle Seite: HSG/Fächer/Informatik/Material

Zahlenraten - Implementierung in Delphi


program Zahlenraten;

uses
  Forms,
  uGUI in 'uGUI.pas' {GUI},
  uModel in 'uModel.pas';

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TGUI, GUI);
  Application.Run;
end.

unit uModel; { Zahlenraten , mk }

interface

type
  TEreignis    = procedure of object;             { 1. Methodenzeiger   }

  TZahl        = class(TObject)
                   private
                     FZahl     : byte;
                   public
                     OnChange : TEreignis;        { 2. Referenzvariable }
                     procedure SetZahl(z : byte);
                     procedure RandomZahl;
                     function GetZahl : byte;
                 end;

  TSpiel       = class(TObject)
                   private
                     FBotschaft : string;
                     ratezahl, geheimzahl : TZahl;
                     procedure SetBotschaft(s : string);
                   public
                     versuche : TZahl;
                     OnNeueBotschaft : TEreignis; { 2. Referenzvariable }
                     constructor create;
                     destructor Destroy;
                     function GetBotschaft : string;
                     procedure neuesSpiel;
                     procedure spielen(rz : byte);
                 end;

implementation

  procedure TZahl.SetZahl(z : byte);
  begin
    FZahl := z;
    if Assigned(OnChange) then OnChange;         { 3. auslösen Ereignis  }
  end;

  procedure TZahl.RandomZahl;
  begin
    FZahl := Random(100)+1;
    if Assigned(OnChange) then OnChange;         { 3. auslösen Ereignis  }
  end;

  function TZahl.GetZahl : byte;
  begin
    GetZahl := FZahl;
  end;

  constructor TSpiel.create;
  begin
    inherited create;               { den geerbten Konstruktor aufrufen }
    RateZahl := TZahl.create;
    Geheimzahl := TZahl.create; Randomize; Geheimzahl.RandomZahl;
    Versuche := TZahl.create; Versuche.SetZahl(0);
  end;

  destructor TSpiel.Destroy;        { siehe Hilfe bei TObject - Destroy }
  begin
    RateZahl.free;
    Geheimzahl.free;
    Versuche.free;
    inherited Destroy;              { den geerbten Destruktor aufrufen  }
  end;

  procedure TSpiel.SetBotschaft(s : string);
  begin
    FBotschaft := s;
    if Assigned(OnNeueBotschaft)
    then OnNeueBotschaft;                        { 3. auslösen Ereignis }
  end;

  function TSpiel.GetBotschaft : string;
  begin
    GetBotschaft := FBotschaft;
  end;

  procedure TSpiel.neuesSpiel;
  begin
    Versuche.SetZahl(0); Geheimzahl.RandomZahl; SetBotschaft('');
  end;

  procedure TSpiel.spielen(rz : byte);
  var
    g,v : byte;
  begin
    v := versuche.GetZahl; Inc(v); versuche.SetZahl(v);
    g := Geheimzahl.GetZahl;
    if rz  g then SetBotschaft('Ratezahl zu groß!');
    if rz = g then SetBotschaft('Ratezahl = Geheimzahl!');
  end;

end.

unit uGUI;  { Zahlenraten, mk }

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, uModel;                   { 1. Model-Unit einbinden           }

type
  TGUI = class(TForm)
    eRatezahl: TEdit; lRatezahl: TLabel; bEingeben: TButton;
    lVersuche: TLabel; lBotschaft: TLabel; bNeuesSpiel: TButton;
    procedure aktualisiereVersuche;   { 2. Ereignisbehandlungsroutinen    }
    procedure aktualisiereBotschaft;  {    deklarieren                    }
    procedure FormCreate(Sender: TObject);
    procedure bEingebenClick(Sender: TObject);
    procedure bNeuesSpielClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  end;

var
  GUI   : TGUI;
  Spiel : TSpiel;                     { 3. Referenzvariable deklarieren   }

implementation {$R *.DFM}

procedure TGUI.aktualisiereVersuche;  { 4. Ereignisbehandlung vorbereiten }
var
  v : integer;
  s : string;
begin
  v := Spiel.versuche.GetZahl;
  if v = 1 then s := ' Versuch' else s := ' Versuche';
  lVersuche.caption := IntToStr(v)+s;
end;

procedure TGUI.aktualisiereBotschaft; { 4. Ereignisbehandlung vorbereiten }
begin
  lBotschaft.caption := Spiel.GetBotschaft;
end;

procedure TGUI.FormCreate(Sender: TObject);
begin
  Spiel := TSpiel.Create;             { 5. Model-Objekte kreieren         }
                                      { 6. Ereignisbehandlungsroutinen    }
                                      {    zuweisen                       }
  Spiel.versuche.OnChange := aktualisiereVersuche;
  Spiel.OnNeueBotschaft := aktualisiereBotschaft;
end;

procedure TGUI.FormDestroy(Sender: TObject);
begin
  Spiel.free;                         { 7. Speicher wieder freigeben      }
end;

procedure TGUI.bEingebenClick(Sender: TObject);
begin
  Spiel.spielen(StrToInt(eRatezahl.text));
end;

procedure TGUI.bNeuesSpielClick(Sender: TObject);
begin
  Spiel.neuesSpiel;
end;

end.