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.