AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Programm stoppt

Ein Thema von Fallenzer · begonnen am 1. Apr 2020 · letzter Beitrag vom 2. Apr 2020
Antwort Antwort
Seite 1 von 2  1 2   
Fallenzer

Registriert seit: 3. Aug 2019
Ort: Wernigerode, Sachsen-Anhalt, DE
29 Beiträge
 
Delphi 10.3 Rio
 
#1

Programm stoppt

  Alt 1. Apr 2020, 12:26
Hallo und guten Tag,

Ich habe vor kurzem ein kleines Spiel in Delphi geschrieben, welches Pfeilfänger heißt:
Mithilfe einer TImage-Componente werden Labels aufgefangen, wodurch man sich dann die Punkte kassiert...

Nur bloß irgendwann (letzte Label's bei Spielsessions sind unterschiedlich) hören die Label auf sich überhaupt zu bewegen...

Hier der Vollständige Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Imaging.pngimage,
  Vcl.Menus, Vcl.StdCtrls, Vcl.Buttons;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Label3: TLabel;
    SpeedButton1: TSpeedButton;
    Label7: TLabel;
    Label14: TLabel;
    Label13: TLabel;
    Label12: TLabel;
    Label11: TLabel;
    Label10: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label9: TLabel;
    Label8: TLabel;
    Label2: TLabel;
    Label1: TLabel;
    Label4: TLabel;
    Timer1: TTimer;
    Memo1: TMemo;
    Memo2: TMemo;
    Label15: TLabel;
    Label16: TLabel;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure SpeedButton1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure labelmove(labe: Tlabel);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  gamestarted: boolean; gamestartclick, punktetemporär, imagetop, buttonspace, labelspace, imagespace, zeit, zufallslabel: integer;
implementation
  uses Unit2;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  memo1.Lines.Clear;
  memo2.Lines.Clear;
  memo1.Lines.LoadFromFile('languages\session-language.txt');
  memo2.Lines.LoadFromFile('languages\' + memo1.Lines[0] + '.lang');
  Form1.Caption:=memo2.Lines[0];
  Speedbutton1.Caption:=memo2.Lines[1];
  Schlieen1.Caption:=memo2.Lines[3];
  Spiel1.Caption:=memo2.Lines[2];
  Einstellungen1.Caption:=memo2.lines[4];
  N1.Caption:=memo2.lines[5];
  Spieleinstellungen1.Caption:=memo2.Lines[6];
  Hilfe1.Caption:=memo2.lines[7];
  Benutzung1.Caption:=memo2.lines[8];
  ber1.Caption:=memo2.lines[9];


  gamestartclick:=0;
  timer1.interval:=50;
  zeit:=0;
  punktetemporär:=0;
  randomize;
  imagetop:=Image1.Top;
  imagespace:=Image1.Left + Image1.Width;
  buttonspace:=Speedbutton1.Width;
  labelspace:=label1.Left;
  Label1.Font.Color:=clblack;
  Label2.Font.Color:=clblack;
  Label3.Font.Color:=clblack;
  Label4.Font.Color:=clblack;
  Label5.Font.Color:=clblack;
  Label6.Font.Color:=clblack;
  Label7.Font.Color:=clblack;
  Label8.Font.Color:=clblack;
  Label9.Font.Color:=clblack;
  Label10.Font.Color:=clblack;
  Label11.Font.Color:=clblack;
  Label12.Font.Color:=clblack;
  Label13.Font.Color:=clblack;
  Label14.Font.Color:=clblack;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: word;
  Shift: TShiftState);
begin
if gamestarted=true then
  begin
   case Key of
    VK_UP:
      if image1.Top - 50 <0 then
      begin
      image1.Top := image1.Top;
      end else image1.Top := image1.Top - 50;
    VK_DOWN:
      if image1.Top + 475 > Form1.Height then
      begin
      image1.Top := image1.Top
      end else image1.Top := image1.Top + 50;
    end;
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  gamestartclick:= gamestartclick + 1;
  if ((gamestarted=False) and (gamestartclick mod 2 = 1)) then
  begin
  gamestarted:=True;
  timer1.Enabled:=True;
  Speedbutton1.Enabled:=False;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i, hochzählen: integer;
begin
  zeit:=zeit+1;
  if zeit = 40 then
  begin
    zufallslabel:=random(14)+1;
  end;
    if zufallslabel=1 then
    begin
    labelmove(Label1);
     if ((((Label1.Left <= imagespace) and (Label1.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*8)) or (Image1.Top=imagetop+(50*7)))) then
     begin
       Label1.Left:=labelspace;
       Label1.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=2 then
    begin
    if ((((Label2.Left <= imagespace) and (Label2.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*8)) or (Image1.Top=imagetop+(50*7)) or (Image1.Top=imagetop+(50*6)) or (Image1.Top=imagetop+(50*5)))) then
     begin
       Label2.Left:=labelspace;
       Label2.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=3 then
    begin
    labelmove(Label3);
    if ((((Label3.Left <= imagespace) and (Label3.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*8)) or (Image1.Top=imagetop+(50*7)) or (Image1.Top=imagetop+(50*6)) or (Image1.Top=imagetop+(50*5)) or (Image1.Top=imagetop+(50*4)))) then
     begin
       Label3.Left:=labelspace;
       Label3.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=4 then
    begin
    labelmove(Label4);
    if ((((Label4.Left <= imagespace) and (Label4.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*8)) or (Image1.Top=imagetop+(50*7)) or (Image1.Top=imagetop+(50*6)) or (Image1.Top=imagetop+(50*5)) or (Image1.Top=imagetop+(50*4)) or (Image1.Top=imagetop+(50*3)) or (image1.Top=imagetop+(50*2)))) then
     begin
       Label4.Left:=labelspace;
       Label4.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=5 then
    begin
    labelmove(Label5);
    if ((((Label5.Left <= imagespace) and (Label5.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*6)) or (Image1.Top=imagetop+(50*5)) or (Image1.Top=imagetop+(50*4)) or (Image1.Top=imagetop+(50*3)) or (Image1.Top=imagetop+(50*2)) or (Image1.Top=imagetop+(50*1)))) then
     begin
       Label5.Left:=labelspace;
       Label5.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=6 then
    begin
    labelmove(Label6);
    if ((((Label6.Left <= imagespace) and (Label6.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*5)) or (Image1.Top=imagetop+(50*4)) or (Image1.Top=imagetop+(50*3)) or (Image1.Top=imagetop+(50*2)) or (Image1.Top=imagetop+(50*1)) or (Image1.Top=imagetop+(50*0)) or (Image1.Top=imagetop+(50*(-1))))) then
     begin
       Label6.Left:=labelspace;
       Label6.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=7 then
    begin
    labelmove(Label7);
    if ((((Label7.Left <= imagespace) and (Label7.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*3)) or (Image1.Top=imagetop+(50*2)) or (Image1.Top=imagetop+(50*1)) or (Image1.Top=imagetop+(50*0)) or (Image1.Top=imagetop+(50*(-1))) or (Image1.Top=imagetop+(50*(-2))))) then
     begin
       Label7.Left:=labelspace;
       Label7.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=8 then
    begin
    labelmove(Label8);
    if ((((Label8.Left <= imagespace) and (Label8.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*2)) or (Image1.Top=imagetop+(50*1)) or (Image1.Top=imagetop+(50*0)) or (Image1.Top=imagetop+(50*(-1))) or (Image1.Top=imagetop+(50*(-2))) or (Image1.Top=imagetop+(50*(-3))) or (Image1.Top=imagetop+(50*(-4))))) then
     begin
       Label8.Left:=labelspace;
       Label8.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=9 then
    begin
    labelmove(Label9);
    if ((((Label9.Left <= imagespace) and (Label9.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*0)) or (Image1.Top=imagetop+(50*(-1))) or (Image1.Top=imagetop+(50*(-2))) or (Image1.Top=imagetop+(50*(-3))) or (Image1.Top=imagetop+(50*(-4))) or (Image1.Top=imagetop+(50*(-5))))) then
     begin
       Label9.Left:=labelspace;
       Label9.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=10 then
    begin
    labelmove(Label10);
    if ((((Label10.Left <= imagespace) and (Label10.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*(-1))) or (Image1.Top=imagetop+(50*(-2))) or (Image1.Top=imagetop+(50*(-3))) or (Image1.Top=imagetop+(50*(-4))) or (Image1.Top=imagetop+(50*(-5))) or (Image1.Top=imagetop+(50*(-6))) or (Image1.Top=imagetop+(50*(-7))))) then
     begin
       Label10.Left:=labelspace;
       Label10.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=11 then
    begin
    labelmove(Label11);
    if ((((Label11.Left <= imagespace) and (Label11.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*(-3))) or (Image1.Top=imagetop+(50*(-4))) or (Image1.Top=imagetop+(50*(-5))) or (Image1.Top=imagetop+(50*(-6))) or (Image1.Top=imagetop+(50*(-7))) or (Image1.Top=imagetop+(50*(-8))))) then
     begin
       Label11.Left:=labelspace;
       Label11.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=12 then
    begin
    labelmove(Label12);
    if ((((Label12.Left <= imagespace) and (Label12.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*(-4))) or (Image1.Top=imagetop+(50*(-5))) or (Image1.Top=imagetop+(50*(-6))) or (Image1.Top=imagetop+(50*(-7))) or (Image1.Top=imagetop+(50*(-8))))) then
     begin
       Label12.Left:=labelspace;
       Label12.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=13 then
    begin
    labelmove(Label13);
   if ((((Label13.Left <= imagespace) and (Label13.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*(-6))) or (Image1.Top=imagetop+(50*(-7))) or (Image1.Top=imagetop+(50*(-8))))) then
     begin
       Label13.Left:=labelspace;
       Label13.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
    if zufallslabel=14 then
    begin
    labelmove(Label14);
    if ((((Label14.Left <= imagespace) and (Label14.Left >= (imagespace-32)))) and ((Image1.Top=imagetop+(50*(-7))) or (Image1.Top=imagetop+(50*(-8))))) then
     begin
       Label14.Left:=labelspace;
       Label14.Font.Color:=clblack;
       punktetemporär:=punktetemporär + 10;
       Label16.Caption:=' ' + inttostr(punktetemporär);
       zufallslabel:=random(14)+1;
     end;
    end;
end;

procedure TForm1.labelmove(labe: Tlabel);
begin
  labe.Font.Color:=clbtnface;
    if labe.Left>buttonspace then
    begin
    labe.Left:=labe.Left - 33;
    end;
    if labe.Left<=buttonspace then
    begin
      Timer1.Enabled:=False;
      gamestarted:=False;
      punktetemporär:=0;
      Label16.Caption:=' 0';
      gamestartclick:=0;
      zeit:=0;
      zufallslabel:=0;
      showmessage('Sie haben verloren.');
      Speedbutton1.Enabled:=True;
      Speedbutton1.Caption:='Spiel starten';
      image1.Top:=imagetop;
      Label1.Left:=labelspace;
      Label2.Left:=labelspace;
      Label3.Left:=labelspace;
      Label4.Left:=labelspace;
      Label5.Left:=labelspace;
      Label6.Left:=labelspace;
      Label7.Left:=labelspace;
      Label8.Left:=labelspace;
      Label9.Left:=labelspace;
      Label10.Left:=labelspace;
      Label11.Left:=labelspace;
      Label12.Left:=labelspace;
      Label13.Left:=labelspace;
      Label14.Left:=labelspace;
      Label1.Font.Color:=clblack;
      Label2.Font.Color:=clblack;
      Label3.Font.Color:=clblack;
      Label4.Font.Color:=clblack;
      Label5.Font.Color:=clblack;
      Label6.Font.Color:=clblack;
      Label7.Font.Color:=clblack;
      Label8.Font.Color:=clblack;
      Label9.Font.Color:=clblack;
      Label10.Font.Color:=clblack;
      Label11.Font.Color:=clblack;
      Label12.Font.Color:=clblack;
      Label13.Font.Color:=clblack;
      Label14.Font.Color:=clblack;
    end;

end;

end.
Ich hoffe ihr könnt mir helfen...

Vielleicht ist das Thema nicht richtig benannt, aber mir ist dabei nichts anderes eingefallen...

Freuen würde ich mich auch auf schnellsten Rat von euch,
Vielen Dank
Danilo Bleul (existiert seit 2005)

Geändert von Fallenzer ( 1. Apr 2020 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.091 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Programm stoppt

  Alt 1. Apr 2020, 13:08
1. Falsches Forum
2. Erwartest Du im Ernst, dass sich jemand durch diesen Spaghetti-Code durchwuselt, in dem nicht einmal anständige Bezeichner verwendet werden und der von DRY nur so strotzt?
3. Der Debugger ist Dein Freund, notfalls eine Log-Datei erstellen und da reinschauen, welche Werte beim Auftreten des Problems gesetzt sind.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.462 Beiträge
 
Delphi 7 Professional
 
#3

AW: Programm stoppt

  Alt 1. Apr 2020, 13:30
Naja, sagen wir mal so: Da wird ein Timer verwendet. Ist das Timerinterval kürzer als die Zeit zum Abarbeiten der bei OnTimer aufgerufenen Routine, kann sowas schon passieren.

Bei der Nutzung von Timern mache ich im OnTimer als erstes immer ein Timer1.Enabled = false; und am Ende, sofern der Timer weiterlaufen soll, ein Timer1.Enabled := true; .

Dadurch erhöht sich jedoch defakto das Timerinterval um die Laufzeit der Timerroutine.

Eventuell suchst Du mal nach "überflüssigem" Code und entfernst ihn. Mir erschließt sich nicht, was z. B. ein image1.Top := image1.Top; bezwecken soll.
  Mit Zitat antworten Zitat
Fallenzer

Registriert seit: 3. Aug 2019
Ort: Wernigerode, Sachsen-Anhalt, DE
29 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Programm stoppt

  Alt 1. Apr 2020, 13:46
Danke für alle Tips...

Aber ich arbeite IMMER mit Standardbezeichnern bei Vcl-Komponenten...

Und ich bin extra in dieses Forum eingestiegen, da ich sehr gute Tips erhofft habe (die auch MEISTENS oder FAST IMMER gegeben werden)

Und da ist noch etwas: ich programmiere schon mein zweites Jahr mit Delphi (ich bin 14 Jahre alt) und kann doch nicht alles darüber wissen... Daher denke ich immer zuerst nach, wo der Fehler liegt... Da es nach meinen Erkundungen keine Compiler-Fehler gibt, suche ich zunächst im Internet nach Lösungen der Fehler beim Programmcode, und wenn ich überhaupt nicht weiterkomme, besuche ich Delphi-PRAXiS mit meiner Frage...

Entschuldigt bitte für die unnützlichen Infos, obwohl sie für Verständnis ziemlich nützlich sein könnten...

Ich werde die gegebenen Tipps nun versuchen einzusetzen...
DANKE
Danilo Bleul (existiert seit 2005)
  Mit Zitat antworten Zitat
Fallenzer

Registriert seit: 3. Aug 2019
Ort: Wernigerode, Sachsen-Anhalt, DE
29 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Programm stoppt

  Alt 1. Apr 2020, 13:51
Tut mir Leid, aber Delphi.Narium's Tipp hat nicht geklappt...
Danilo Bleul (existiert seit 2005)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.462 Beiträge
 
Delphi 7 Professional
 
#6

AW: Programm stoppt

  Alt 1. Apr 2020, 14:20
Ok, mit 14 Jahren muss Du noch nicht allzuviel Erfahrung haben Das kommt schon mit der Zeit.

Was mich ein bisserl irritiert:((Image1.Top=imagetop+(50*6)) or (Image1.Top=imagetop+(50*5)) or (Image1.Top=imagetop+(50*4)) or (Image1.Top=imagetop+(50*3)) or (Image1.Top=imagetop+(50*2)) or (Image1.Top=imagetop+(50*1)))) then
50 * 6 ist immer 300
50 * 5 ist immer 250
50 * 4 ist immer 200
50 * 3 ist immer 150
50 * 2 ist immer 100
50 * 1 ist immer 50
und
50 * 0 ist immer 0

Statt jedesmal rechnen zu lassen, schreib dort einfach jeweils die Ergebnisse hin. Spart (vermutlich) Rechenzeit (ein bisserl ) und macht den Quelltext lesbarer.

Kannst Dafür aber auch Konstanten definieren, die Du dann im ganzen Programm benutzen kannst. Sollte dann mal eine Änderung nötig sein, so musst Du nur die Konstanten ändern und nicht im ganzen Programm nach den Stellen im Quelltext suchen, in denen Du letztlich immer die gleichen Berechnungen vorgenommen hast. Sollte es also mal erforderlich sein, statt der 50 eine 60 zu nehmen, so kannst Du einfach Deine Konstanten ändern und musst nicht nach "tausenden" 50 im Programm suchen und sie durch 60 ersetzen.

Bei der VCL immer de Standardnamen zu verwenden, kann man so machen. Das hab' ich mir aber längst abgewöhnt. Label heißen bei mir z. B. immer lbEineaussagekräftigeBezeichnung. Desgleichen für Edits, Buttons ...
Ich will halt beim Lesen des Quelltextes auch bei Controls der VCL immer wissen, wofür sie da sind und nicht erst immer im Formular nachschauen müssen oder mir merken wofür Label1 ist, wofür Label2 ist. Spätestens wenn man mal in mehreren Programmen "unterwegs" ist, kann man sich die Standardnamen und ihren Verwendungszweck nicht mehr merken. Ist jetzt Label1 in diesem Programm für Aufgabe X oder war das in dem anderen Programm so und hier ist es für Aufgabe Y ...

Wenn die Labels aufhören sich zu bewegen, ist dann im Taskmanager noch zu sehen, ob das Programm arbeitet oder ist dort die CPU-Last niedrig.

Könnte es sein, dass bei den Berechnungen irgendwann ein Punkt erreicht ist, bei dem die Berechnungsergebnisse einfach nicht mehr zu einer Bewegung der Labels führen?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.990 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Programm stoppt

  Alt 1. Apr 2020, 14:50
Statt jedesmal rechnen zu lassen, schreib dort einfach jeweils die Ergebnisse hin. Spart (vermutlich) Rechenzeit (ein bisserl ) und macht den Quelltext lesbarer
Das ist gar nicht nötig - das erledigt bereits der Compiler (übrigens auch wenn die 50 als Konstante deklariert ist).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.462 Beiträge
 
Delphi 7 Professional
 
#8

AW: Programm stoppt

  Alt 1. Apr 2020, 14:56
Ok, keine Rechenzeit gespart (nur (marginal?)) Kompilierzeit

Aber der Gewinn an Lesbarkeit dürfte erhalten bleiben
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.577 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: Programm stoppt

  Alt 1. Apr 2020, 15:01
Moin...
Zitat:
1. Falsches Forum
damit meint er nicht die DP...da bist du schon richtig, sondern das Unterforum.

Du hast es in "Neuen Beitrag zur Code-Library hinzufügen" eingestellt. Besser wäre aber "Programmieren allgemein"...oder so.

Zitat:
Ok, mit 14 Jahren muss Du noch nicht allzuviel Erfahrung haben
...alles wird gut. Trotzdem kannst du dir mal die wichtigsten Programmierregeln durchlesen:

DRY: https://de.wikipedia.org/wiki/Don%E2...epeat_yourself
KISS: https://de.wikipedia.org/wiki/KISS-Prinzip
Später SOLID: https://de.wikipedia.org/wiki/Prinzi...LID-Prinzipien

Geändert von haentschman ( 1. Apr 2020 um 15:10 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.656 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Programm stoppt

  Alt 1. Apr 2020, 15:08
Keine Idee ob das das Problem löst, aber in der Timer-Prozedur fehlt das "labelmove(Label2);" das analog für alle anderen Labels vorhanden ist.

Bist du bereit was zu lernen und für Vorschläge wie man "sauberer" programmiert offen?
Dein Code würde kürzer und übersichtlicher werden und solche Fehler würden schneller auffallen.

Beispiel:
Diesen Block verwendest du (nur mit einem anderen Label) immer wieder im der Timer-Prozedur:
Delphi-Quellcode:
 
  begin
    Label1.Left:=labelspace;
    Label1.Font.Color:=clblack;
    punktetemporär:=punktetemporär + 10;
    Label16.Caption:=' ' + inttostr(punktetemporär);
    zufallslabel:=random(14)+1;
  end;
das könnte man in eine Prozedur auslagern und muss dass nicht immer wiederholen:

Delphi-Quellcode:
 
  procedure ResetLabelAndIncreasePoints(labe:TLabel)
  begin
    Labe.Left:=labelspace;
    Labe.Font.Color:=clblack;
    punktetemporär:=punktetemporär + 10;
    Label16.Caption:=' ' + inttostr(punktetemporär);
    zufallslabel:=random(14)+1;
  end;
und in der TimerProzedur stünde z.B.:
Delphi-Quellcode:
//...
if zufallslabel=1 then
    begin
    labelmove(Label1);
    if ((((Label1.Left <= imagespace) and (Label1.Left >= (imagespace-32)))) and
       ((Image1.Top=imagetop+(50*8)) or (Image1.Top=imagetop+(50*7)))) then
     begin
     ResetLabelAndIncreasePoints(label1)
     end;
    end;
Nur als erster Ansatz einer Verbesserung.
Noch einfacher würde es im nächsten Schritt, wenn du alle Labels in einer Liste oder einem Array speicherst (bei Programmstart) und dann kannst du über einen Index auf ein Label zugreifen und die TimerProzedur sähe nur noch so aus:

Delphi-Quellcode:
//...
zufallszahl:=random(14)+1; //eigentl. auch neue Prozedur ala GenerateNextZufallszahl
//...
zufallslabel:=TLabel(ListeMitLabels[zufallszahl]);
if movelabel(zufallslabel) then //movelabel wird Funktion die True zurückgibt wenn Spielende noch nicht erreicht
  begin
  if SeltsameBedingungErfüllt then
    begin
    ResetLabel;
    IncreasePoints;
    DisplayPoints;
    zufallszahl:=random(14)+1;
    end;
  end
else
  begin
  SendGameOverMessage;
  ResetGame;
  end;
Sorry für das Denglisch
Ralph

Geändert von Jumpy ( 1. Apr 2020 um 15:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf