Ich bin gerade dabei ein "kleines Spiel" aus lange Weile zu programmieren.
Ich habe dazu einen Start-Button erstellt, der 2 verschiedene Timer auslöst. Die Beiden Timer sollen aber unterschiedliche Intervalle haben. Ich habe es bereits mit Random() probiert.
Ist zu erwarten, Timer sind nicht sehr präzise, alles unter 20-50ms oder so ist mehr oder weniger gleich schnell.. Deine update zyklen sind zwischen 1 und 11 ms, in der region ist nicht mal sleep akkurat
Wie wärs wenn du statt dem update zyklus einfach die geschwindigkeit zufällig wählst?
Übrigens statt anzunehmen das die Zahlen nicht zufällig wären, hast du sie dir denn einfach mal ausgegeben um zu schauen ob sie auch wirklich zufällig sind?
Ich habe 30 als Parameter der Random-Funktion eingesetzt und da laufen die beiden Shapes (die ich als "Auto" genommen habe) unterschiedlich schnell. Allerdings können die beiden Werte zufallsbedingt relativ ähnlich ausfallen, so dass man wieder keinen Unterschied sieht. Wenn dir das wichtig ist, kannst du solange Zufallszahlen ziehen bis der Unterschied ein Minimum überschreitet:
uses
Math;
var
z1, z2: Integer;
begin
repeat
z1 := Random(30);
z2 := Ranodm(30) ;
until (abs(z1-z2) > 20;
...
Um die Timer anzuhalten, solltest du deren Enabled auf FALSE setzen, statt das Interval auf 0. Das solltest du auch schon zu Anfang so setzen, damit die Autos nicht gleich beim Start loslaufen.
procedure TForm1.Timer1Timer(Sender: TObject);
var left1: integer;
begin
left1 := Image1.Left;
for left1 := 1 to 920 do
begin
Image1.Left := Image1.Left + 1;
end;
end;
Na überleg mal: Sagen wir, das Auto ist 100 Pixel lang. Bei deinem Code fährt das Auto so weit nach rechts, das seine linke Seite auf der Ziellinien bei 920 ist. Wie weit muss es fahren, dass die RECHTE Seite an der Ziellinie ist? Das hängt doch "irgendwie" von der Länge des Autos ab.
Ach ich seh gerade, du hast die For-Schleife in den Timer-Event gepackt. Warum das denn?
- Erhöhe den Wert für Auto.Left, wie bisher.
- Wenn die Ziellinie erreicht ist (also wenn Auto.Left + Auto.Width = ZielPosition) dann schalte den Timer aus.
OK, aber während der Entwicklungszeit eines Programms ist es normalerweise hinderlich, wenn bei jedem Debugger-Lauf andere Bedingungen herrschen. Daher lasse ich Randomize während der Entwicklung weg, bzw. ersetze es durch "RandSeed := irgendein_integer", so dass reproduzierbare Zufallszahlen erhalten werden.