Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Punkte bei Spiel gehen immer auf 0 zurück (https://www.delphipraxis.net/139965-punkte-bei-spiel-gehen-immer-auf-0-zurueck.html)

Schnittcher 9. Sep 2009 10:06


Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

kann mir jemand sagen wieso ich hier immer nur einen Punkt bekomme?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, zahlen;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edZahl1: TEdit;
    edZahl2: TEdit;
    edZahl3: TEdit;
    Button1: TButton;
    lbPunkte: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    FPunkte: integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Zahlen: IZahlen;
  SpielerZahlen: TMeineZahlen;
begin
  SpielerZahlen[0] := StrToInt(edZahl1.Text);
  SpielerZahlen[1] := StrToInt(edZahl2.Text);
  SpielerZahlen[2] := StrToInt(edZahl3.Text);
  Zahlen := TBackupClassesFactory.Zahlen;
  Zahlen.SpielerZahl := SpielerZahlen;
  Zahlen.set_ComputerZahlen;
  FPunkte:= Zahlen.HolePunkte;
  Zahlen.vergleichen;
  Zahlen.get_Punkte(FPunkte);
  lbPunkte.Caption:= IntToStr(Zahlen.HolePunkte);
end;
end.
Delphi-Quellcode:
unit zahlen;

interface
type

  TMeineZahlen = array[0..2] of Integer;

  IZahlen = interface(IInterface)
    ['{EAA23356-FA98-49A6-B3D3-62362FF46485}']
    procedure set_ComputerZahlen;
    procedure set_SpielerZahl(const Value: TMeineZahlen);
    property SpielerZahl: TMeineZahlen write set_SpielerZahl;
    function vergleichen: string;
    function get_Punkte(const Punkte: Integer): Integer;
    function get_HolePunkte: Integer;
    property HolePunkte: Integer read get_HolePunkte;
  end;

  TBackupClassesFactory = class(TObject)
  public
    class function Zahlen: IZahlen;
  end;

implementation
type

  TZahlen = class(TInterfacedObject, IZahlen)
  private
    FComputerZahl1, FComputerZahl2, FComputerZahl3, FSpielerZahl1,
      FSpielerZahl2, FSpielerZahl3: Integer;
    FHolePunkte: Integer;
    FPunkte, Fpunkte2: Integer;
    procedure set_ComputerZahlen;
  protected
    function get_HolePunkte: Integer;
    function get_Punkte(const Punkte: Integer): Integer;
    procedure set_SpielerZahl(const Value: TMeineZahlen);
    function vergleichen: string;
    property HolePunkte: Integer read get_HolePunkte;
    property SpielerZahl: TMeineZahlen write set_SpielerZahl;

  end;

procedure TZahlen.set_ComputerZahlen;
begin
  randomize;
  FComputerZahl1 := 1; //random(6);
  FComputerZahl2 := random(6);
  FComputerZahl3 := random(6);
end;

procedure TZahlen.set_SpielerZahl(const Value: TMeineZahlen);
begin
  FSpielerZahl1 := Value[0];
  FSpielerZahl2 := Value[1];
  FSpielerZahl3 := Value[2];
end;

function TZahlen.vergleichen: string;
var
  punkte: integer;
begin
  if FSpielerZahl1 = FComputerZahl1 then
  begin
    FPunkte := FPunkte + 1;
    Result := 'Sie haben gewonnen!';
  end
  else
    Result := 'Sie haben verloren';
  // TODO -cMM: TZahlen.vergleichen default body inserted
end;

function TZahlen.get_Punkte(const Punkte: Integer): Integer;
begin
  FPunkte := FPunkte + Punkte;
end;

function TZahlen.get_HolePunkte: Integer;
begin
  Result := FPunkte;
end;

class function TBackupClassesFactory.Zahlen: IZahlen;
begin
  Result := TZahlen.Create;
end;

end.
Gruß,
Schnittcher

BAMatze 9. Sep 2009 10:14

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo versuche mal:

1.Vermutung
Delphi-Quellcode:
// ändere
lbPunkte.Caption:= IntToStr(Zahlen.HolePunkte);
// in
lbPunkte.Caption:= IntToStr(FPunkte);
2. Vermutung:
deine Deklarartion Zahlen: IZahlen global und nicht Lokal machen, weil die lokale nach dem Buttonklick wieder verschwindet und somit beim erneuten Klicken wieder von vorne anfängt zu zählen.

Schnittcher 9. Sep 2009 10:16

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

ich denke deine 2. Vermutung stimmt, das Problem hatte ich doch mal bei etwas anderem.
Ich versuche es. Danke.

Edit: Es geht beides nicht. :(

Gruß,
Schnittcher

hoika 9. Sep 2009 10:26

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

du hast was geändert ? -> was ?

Zeig noch mal den kompletten Code.

F5 hast du schon probiert ?


Heiko

Schnittcher 9. Sep 2009 10:28

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

ich habe das geändert, was BAMatze gesagt hat.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, zahlen;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edZahl1: TEdit;
    edZahl2: TEdit;
    edZahl3: TEdit;
    Button1: TButton;
    lbPunkte: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    FPunkte: integer;
    Zahlen: IZahlen;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  SpielerZahlen: TMeineZahlen;
begin
  SpielerZahlen[0] := StrToInt(edZahl1.Text);
  SpielerZahlen[1] := StrToInt(edZahl2.Text);
  SpielerZahlen[2] := StrToInt(edZahl3.Text);
  Zahlen := TBackupClassesFactory.Zahlen;
  Zahlen.SpielerZahl := SpielerZahlen;
  Zahlen.set_ComputerZahlen;
  FPunkte:= Zahlen.HolePunkte;
  Zahlen.vergleichen;
  Zahlen.get_Punkte(FPunkte);
  lbPunkte.Caption:= IntToStr(Zahlen.HolePunkte);
end;
end.
Delphi-Quellcode:
unit zahlen;

interface
type

  TMeineZahlen = array[0..2] of Integer;

  IZahlen = interface(IInterface)
    ['{EAA23356-FA98-49A6-B3D3-62362FF46485}']
    procedure set_ComputerZahlen;
    procedure set_SpielerZahl(const Value: TMeineZahlen);
    property SpielerZahl: TMeineZahlen write set_SpielerZahl;
    function vergleichen: string;
    function get_Punkte(const Punkte: Integer): Integer;
    function get_HolePunkte: Integer;
    property HolePunkte: Integer read get_HolePunkte;
  end;

  TBackupClassesFactory = class(TObject)
  public
    class function Zahlen: IZahlen;
  end;

implementation
type

  TZahlen = class(TInterfacedObject, IZahlen)
  private
    FComputerZahl1, FComputerZahl2, FComputerZahl3, FSpielerZahl1,
      FSpielerZahl2, FSpielerZahl3: Integer;
    FPunkte: Integer;
    procedure set_ComputerZahlen;
  protected
    function get_HolePunkte: Integer;
    function get_Punkte(const Punkte: Integer): Integer;
    procedure set_SpielerZahl(const Value: TMeineZahlen);
    function vergleichen: string;
    property HolePunkte: Integer read get_HolePunkte;
    property SpielerZahl: TMeineZahlen write set_SpielerZahl;

  end;

procedure TZahlen.set_ComputerZahlen;
begin
  randomize;
  FComputerZahl1 := 1; //random(6);
  FComputerZahl2 := random(6);
  FComputerZahl3 := random(6);
end;

procedure TZahlen.set_SpielerZahl(const Value: TMeineZahlen);
begin
  FSpielerZahl1 := Value[0];
  FSpielerZahl2 := Value[1];
  FSpielerZahl3 := Value[2];
end;

function TZahlen.vergleichen: string;
var
  punkte: integer;
begin
  if FSpielerZahl1 = FComputerZahl1 then
  begin
    FPunkte := FPunkte + 1;
    Result := 'Sie haben gewonnen!';
  end
  else
    Result := 'Sie haben verloren';
  // TODO -cMM: TZahlen.vergleichen default body inserted
end;

function TZahlen.get_Punkte(const Punkte: Integer): Integer;
begin
  FPunkte := FPunkte + Punkte;
end;

function TZahlen.get_HolePunkte: Integer;
begin
  Result := FPunkte;
end;

class function TBackupClassesFactory.Zahlen: IZahlen;
begin
  Result := TZahlen.Create;
end;

end.
Gruß,
Schnittcher

Luckie 9. Sep 2009 10:29

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hat es einen bestimmten Grund, warum du mit Interfaces arbeitest?

Schnittcher 9. Sep 2009 10:29

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

ja ich sollte es machen, also es wurde mir nur gesagt, dass ich es tun soll.

Gruß,
Schnittcher

Luckie 9. Sep 2009 10:39

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Das ist eigentlich kein Grund. Ich frage nur, weil du dir mit Interfaces eine zusätzliche Komplexibilität ins Programm holst, die eventuell überflüssig ist und zu Fehlern führen kann.

hoika 9. Sep 2009 10:40

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

total verworren der Code ;)

Setze Breakpoints und debugge das ( F5, F7, F8 )


Heiko

[edit=Luckie]Smilies deaktiviert. Mfg, Luckie[/edit]

Schnittcher 9. Sep 2009 10:42

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

ich soll lernen mit Interfaces zu arbeiten. Ich bin in einer Ausbildung und deswegen mache ich das mit Interfaces.

Aber ich habe meinen Fehler gefunden. :)

Delphi-Quellcode:
 
FPunkte:= Zahlen.HolePunkte;
Das muss so sein:
Delphi-Quellcode:
FPunkte:= Fpunkte + Zahlen.HolePunkte;
Gruß,
Schnittcher

Luckie 9. Sep 2009 10:43

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Na das ist doch schon eher eine Begründung.

BAMatze 9. Sep 2009 10:47

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Nur mal ne kleine Frage, weil mich das gerade irritiert, setzt du (in beiden Funktionen wo du FPunkte verwendest) diese auch mal irgendwie am Anfang auf 0? also ala FPunkte := 0; oder so? ich meine sonst könnte doch (ihr dürft mich gern verbessern) oder besser es sollte sonst irgendein Datenmüll auf der Variablen liegen und wenn dieser dann 0 ergibt, ist das eher Zufall.

MfG
BAMatze

Schnittcher 9. Sep 2009 10:49

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Hallo,

ich glaube den Titel muss ich mal ändern. Nicht 0 sondern immer 1.

Ich habe den Wert wohl immer wieder iwie mit 1 überschrieben.

Gruß,
Schnittcher

BAMatze 9. Sep 2009 10:56

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Richtig deine Zuweisung war wie folgt:
Delphi-Quellcode:
FPunkte:= Zahlen.HolePunkte;
Damit hast du den Datenmüll immer mit der 1 überschrieben.

Jetzt machst du aber folgendes:
Delphi-Quellcode:
FPunkte:= FPunkte + Zahlen.HolePunkte;
Das heißt du überschreibst den Datenmüll nicht mehr mit "1" sondern addierst zu ihm einfach eine eins was aber auch wieder Datenmüll ergeben sollte. Also musst du da irgendwo das FPunkte mal 0 setzen, denke ich.

MfG
BAMatze

Blup 9. Sep 2009 11:55

Re: Punkte bei Spiel gehen immer auf 0 zurück
 
Die Interface-Variable Zahlen in den private-Abschnitt der Form zu verschieben ist nur dann sinnvoll, wenn die Lebensdauer des entsprechenden Objektes über den einmaligen Funktionsaufruf hinaus gehen soll. Dann könnte diese Variable z.B. im OnCreate initialisiert werden. Da hier aber beim jedem Buttonclick wieder ein neues Objekt erzeugt und der Variablen zugewiesen wird, war dies nicht notwendig.

Zu dem Interface fehlt eigentlich eine ordentliche Beschreibung, welche Aufgaben die Methoden haben.
Mich erstaunt, daß in der Methode Vergleichen nur die erste Computerzahl mit dem ersten Tip des Spielers verglichen wird.
Sollte es nicht unterschiedlich viele Punkte geben, abhängig wie viele Zahlen richtig getippt wurden?

Ob und wann die Punkte wieder auf 0 gesetzt werden, ist ein ganz anderes Problem.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz