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