2 Random Zahlen

Rund um die LCL und andere Komponenten
Antworten
benderboxer
Beiträge: 12
Registriert: Sa 21. Dez 2019, 20:55

2 Random Zahlen

Beitrag von benderboxer »

Hallo Zusammen!

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.

Hier mein Code:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
  SynHighlighterPHP;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
var z1,z2: integer;
begin
 
  z1 := Random(10+1);
  z2 := Random(10+1);
 
  Timer1.Interval := z1;
  Timer2.Interval := z2;
 
  Button1.Enabled := false;
  Button2.Enabled := true;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Interval := 0;
  Timer2.Interval := 0;
 
  Button1.Caption := 'FORTSETZEN';
  Button1.Enabled := true;
  Button2.Enabled := false;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Left := Image1.Left + 1;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Image2.Left := Image2.Left + 1;
end;
 
end.
 


DAS RESULTAT: ES FAHREN BEIDE AUTOS (=BILDER) GLEICH SCHNELL...

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: 2 Random Zahlen

Beitrag von Warf »

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?

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: 2 Random Zahlen

Beitrag von wp_xyz »

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:

Code: Alles auswählen

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.

benderboxer
Beiträge: 12
Registriert: Sa 21. Dez 2019, 20:55

Re: 2 Random Zahlen

Beitrag von benderboxer »

OK. Du hast zwar kleine Fehler bei dir aber ich habe die berichtigt.

Ich habe jetzt noch eine letzte Sache: Ich habe ein Ziellinien-Bild bei mir auf Position Left: 920 eingestellt.

Kann ich machen, dass das Auto nur bis dort fährt?

Ich habe es hiermit probiert, aber damit funktioniert es nicht

Code: Alles auswählen

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;

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: 2 Random Zahlen

Beitrag von wp_xyz »

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.

benderboxer
Beiträge: 12
Registriert: Sa 21. Dez 2019, 20:55

Re: 2 Random Zahlen

Beitrag von benderboxer »

Ich will doch kein "richtiges" Spiel programmieren, aber mich trotzdem in Lazarus ausprobieren.

Kam dabei zufällig durch ein ähnliches Video auf diese Idee.

Außerdem ist die Strecke lang genug, dass man das rechtzeitig erkennen kann.
Kann ich nicht auch den Wert vom Ende der Schleife auf

Image3.Left - Image1.Width nehmen? Also...
920 - 24

Dann ist doch schonmal das Bild, was ich benutze egal. Und an welcher Position das Ziel ist auch.

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: 2 Random Zahlen

Beitrag von wp_xyz »

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.

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Left := Image1.Left + 1;
  if Image1.Left + Image1.Width >= ZielLinie.Left then Timer1.Enabled := false;
end;

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: 2 Random Zahlen

Beitrag von fliegermichl »

Vor dem ersten Aufruf von Random sollte Randomize aufgerufen werden.

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: 2 Random Zahlen

Beitrag von wp_xyz »

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.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: 2 Random Zahlen

Beitrag von fliegermichl »

Ja nur dass das dann keine Zufallszahlen mehr sind :-)

Antworten