AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Programm

Offene Frage von "schuetzejanett"
Ein Thema von schuetzejanett · begonnen am 12. Jan 2007 · letzter Beitrag vom 13. Jan 2007
Antwort Antwort
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#1

Problem mit Programm

  Alt 12. Jan 2007, 14:26
Hallo,

Weiß zwar nicht ob ich dafür das richtige forum ausgewählt habe, hoffe aber ihr könnt mir helfen.
ich bin langsam am Verzweifeln, ich bin gerade dabei einen dartrechner zu schreiben, aber irgendwie haben sich einige grobe fehler eingeschlichen die ich einfach nicht finde.

Das erste problem ist wenn ich ein Spiel mit einer ungeraden Anzahl von Spielern starte, hängt das programm sich auf, wenn man mit dem Debugger das ganze durchklickt läuft er durch allerdings kann ich das neuentstandene Formular trotzdem nicht anwählen.
Das nächste ist das egal mit wievielen Spielern man ein Spiel startet, ich das entstehende Spielformular nich schließen kann weder mit Formular schließen noch mit dem Spiel beenden button.

ich habe erstmal nur die Spielart X01 implementiert.
Nach jedem Spielzug soll derzeit kontrollhalber ein fenster aufgehen wie die züge des Spielers waren. Aber er zeigt immer nur den aktuellen als ersten an darum hatte ich schon mal ins forum gepostet aber der richtige fehler wurde leider nicht gefunden.

Und noch was kleines was aber eher erst mal unwichtig ist, was ich hoffentlich selber finde ist das er manchmal beim spielerwechsel spieler übersprigt, oder jemand doppelt dran ist.

So wäre schön wenn jemand mal ein bischen zeit hätte sich die probleme anzuschauen, weil ich das problem für die schule brauche und mir die zei langsam davon laüft.
Zum testen bitte Spielart x01 auswählen und als würfe bitte E,D oder T und danach eine Zahl oder 0 eingeben


hoffe jemand von euch hat etwas zeit.
Angehängte Dateien
Dateityp: rar dartspiel_135.rar (235,1 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Problem mit Programm

  Alt 12. Jan 2007, 14:35
Zu deinem Konzept: Das ist nicht gut bzw. ziemlich chaotisch. Un bei den globalen variablen ist es kein Wunder, dass da was durcheinander kommt und du mit dem Debuggen Probleme hast. Ich gucke mal, ob ich hier auf die Schnelle was braucbares für dich hinbekomme.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Problem mit Programm

  Alt 12. Jan 2007, 14:39
Hi,
dein Fehler (die Exception beim Beenden) resultiert daraus, dass du die APlayer einfach verwendest (aber nie initialisierst). Da es sich um ein Dyn. Array handelt, wird in dieser Variablen eine Adresse (des eigentlichen Arrays) gespeichert. Da du jetzt einfach auf Elemente einer nicht gültigen Adresse zugreifst, landest du auch irgendwo im Speicher (es ist gar nicht vorhersagbar was wann passiert).

Ansonsten gebe ich Luckie völlig recht, du solltest nochmal über Aufbau und Struktur nachdenken!

Gruß Der Unwissende

[Edit]
Mal als wichtige Ergänzung, ich meinte APlayer in der Unit Game, die Unit Start hab ich nicht weiter betrachtet!
[/edit]

[Edit2]
Und noch eine Anmerkung, wenn du eine eigene Klasse anlegst und einen eigenen Konstruktor verwendest, unbedingt als erste zeile ein inherited create(...); rein!!! (bezieh mich hier auf TPlayer). Ansonsten wird gar kein Speicher für deine Instanz alloziert (wieder ein völlig freier Fehler).
[/Edit2]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Problem mit Programm

  Alt 12. Jan 2007, 15:31
Fertig.

Mein Konzept: Es gibt zwei Klassen. Eine verwaltet einen Spieler und die zweite verwaltet die Spielerliste:

Spieler:
Delphi-Quellcode:
  TPlayer = class(TObject)
  private
    FName: String;
    FPunkte: Integer;
    FHasWon: Boolean;
    procedure SetName(Name: String);
    function GetName: String;
    procedure SetPunkte(Punkte: Integer);
    function GetPunkte: Integer;
    function GetHasWon: Boolean;
  public
    property Name: String read GetName write SetName;
    property Punkte: Integer read GetPunkte write SetPunkte;
    property HasWon: Boolean read GetHasWon;
  end;
Spielerliste:
Delphi-Quellcode:
  TPlayerCollection = class(TList)
  private
    function Get(Index: Integer): TPlayer;
  public
    procedure Add(Item: TPlayer);
    function Next(CurrentPlayer: Integer): TPlayer;
    function IndexOf(Item: TPlayer): Integer;
    procedure Free;
    property Items[Index: Integer]: TPlayer read Get;
  end;
Hat man das erstmal, ist die Programmierung kein Problem mehr und reduziert sich auf diese paar Zeilen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  SpielerListe := TPlayerCollection.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SpielerListe.Free;
end;

procedure TForm1.btnNamenClick(Sender: TObject);
var
  i: Integer;
  Spieler: TPlayer;
  NewItem: TListItem;
begin
  for i := 0 to SpinEdit1.Value - 1 do
  begin
    Spieler := TPlayer.Create;
    Spieler.Name := InputBox('Spielername ' + IntToStr(i+1), 'Name des Spilers', IntToStr(i+1));
    Spieler.Punkte := 201;
    SpielerListe.Add(Spieler);
  end;

  for i := 0 to SpielerListe.Count - 1 do
  begin
    NewItem := ListView1.Items.Add;
    NewItem.Caption := Spielerliste.Items[i].Name;
    NewItem.SubItems.Add(IntToStr(Spielerliste.Items[i].Punkte));
  end;
end;

procedure TForm1.btnStartClick(Sender: TObject);
begin
  CurrentPlayerIdx := 0;
  CurrentPlayer := SpielerListe.Items[CurrentPlayerIdx];
  lblCurrentPlayer.Caption := Format('Spieler: %s', [CurrentPlayer.Name]);
end;

procedure TForm1.btnOKClick(Sender: TObject);
begin
  CurrentPlayer.Punkte := CurrentPlayer.Punkte - sedtFirst.Value - sedtSecond.Value - sedtThird.Value;
  if CurrentPlayer.HasWon then
    ShowMessage(Format('Spieler %s hat gewonnen.', [CurrentPlayer.Name]));
  Listview1.Items[CurrentPlayerIdx].SubItems[0] := IntToStr(CurrentPlayer.Punkte);
  CurrentPlayer := SpielerListe.Next(CurrentPlayerIdx);
  CurrentPlayerIdx := SpielerListe.IndexOf(CurrentPlayer);
  lblCurrentPlayer.Caption := Format('Spieler: %s', [CurrentPlayer.Name]);
end;
Projekt im Anhang.

Nachtrag:
Jetzt könnte man sich noch eine Klasse TGame ausdenken von der man sich weitere Klassen für die verschiedenen Spiele ableitet, die sich dann um die Spielregeln kümmern.
Angehängte Dateien
Dateityp: zip luckiedart_288.zip (237,5 KB, 19x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#5

Re: Problem mit Programm

  Alt 12. Jan 2007, 17:08
Danke schön werde mir dein programm mal zu gemüte führen und dann meins daran anpassen.
Hoffe das meine Probleme dann verschwunden sind.

schönes wochenende
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Problem mit Programm

  Alt 12. Jan 2007, 19:34
Moin Michael,

irgendwie fehlt mir da der Destructor.

Delphi-Quellcode:
procedure TPlayerCollection.Free;
var
  i: Integer;
begin
  for i := 0 to self.Count - 1 do
    self.Items[i].Free;
  // Mindestens
  inherited Free;
end;
wäre besser
Delphi-Quellcode:
TPlayerCollection = class(TList)
//...
public
  destructor Destroy; override;
  // entfällt ersatzlos
  procedure Free;
//...

destructor TPlayerCollection.Destroy;
var
  i: Integer;
begin
  for i := 0 to self.Count - 1 do
    self.Items[i].Free;
  inherited;
end;
Zugegeben, bei TList spielt das keine grosse Rolle, da diese ja direkt von TObject abgeleitet ist, aber so ganz sauber ist es nicht

Warum eigentlich nicht gleich eine TObjectList?
Da OwnsObjects hier standardmässig auf true steht, würdest Du Dir die Freigabe der Objekte sparen können.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Problem mit Programm

  Alt 12. Jan 2007, 23:05
Zitat von Christian Seehase:
irgendwie fehlt mir da der Destructor.
Mir auch. Ich habe das nur mal eben so zwischen Tür und Angel runtergetippt, dabei ist wohl der Destruktor unten den Tisch gefallen.

Korrigierte Version hochgeladen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Problem mit Programm

  Alt 13. Jan 2007, 15:34
Ich wollte mal fragen, wie du mit meinem Code zurecht kommst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#9

Re: Problem mit Programm

  Alt 13. Jan 2007, 18:29
Hallo Luckie,

komme mit deinem code sehr gut zurecht. Danke dafür. Werde mein Spiel mit deinen Klassen nochmal schreiben, und dann versuchen etwas besser zu strukturieren.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz