![]() |
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:
Gruß,
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. Schnittcher |
Re: Punkte bei Spiel gehen immer auf 0 zurück
Hallo versuche mal:
1.Vermutung
Delphi-Quellcode:
2. Vermutung:
// ändere
lbPunkte.Caption:= IntToStr(Zahlen.HolePunkte); // in lbPunkte.Caption:= IntToStr(FPunkte); 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. |
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 |
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 |
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:
Gruß,
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. Schnittcher |
Re: Punkte bei Spiel gehen immer auf 0 zurück
Hat es einen bestimmten Grund, warum du mit Interfaces arbeitest?
|
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 |
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.
|
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] |
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:
Das muss so sein:FPunkte:= Zahlen.HolePunkte;
Delphi-Quellcode:
Gruß,
FPunkte:= Fpunkte + Zahlen.HolePunkte;
Schnittcher |
Re: Punkte bei Spiel gehen immer auf 0 zurück
Na das ist doch schon eher eine Begründung.
|
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 |
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 |
Re: Punkte bei Spiel gehen immer auf 0 zurück
Richtig deine Zuweisung war wie folgt:
Delphi-Quellcode:
Damit hast du den Datenmüll immer mit der 1 überschrieben.
FPunkte:= Zahlen.HolePunkte;
Jetzt machst du aber folgendes:
Delphi-Quellcode:
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.
FPunkte:= FPunkte + Zahlen.HolePunkte;
MfG BAMatze |
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