unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Math, LCLTranslator, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, ComCtrls, Types;

type

  { TForm1 }

  TForm1 = class(TForm)
    Ball1: TShape;
    Ball2: TShape;
    Ball3: TShape;
    Ball4: TShape;
    Ball5: TShape;
    LabelZeit: TLabel;
    ButtonWeiter: TButton;
    ButtonCursorZeigen: TButton;
    TextfeldBaelle: TEdit;
    FarbeHintergrund: TButton;
    FarbeBall: TButton;
    ColorDialog1: TColorDialog;
    LabelAnzeigeGeschwindigkeit: TLabel;
    LabelAnzahlBaelle: TLabel;
    RadioGroupPaddle: TRadioGroup;
    Trennlinie: TShape;
    TextfeldBreitePaddle: TEdit;
    BildEinstellungen: TImage;
    BildInfo: TImage;
    LabelBreitePaddel: TLabel;
    LabelFarben: TLabel;
    LabelInfoText: TLabel;
    RadioGroupForm: TRadioGroup;
    ButtonStopp: TButton;
    TextfeldGeschwindigkeit: TEdit;
    TextfeldZeitintervall: TEdit;
    LabelEinstellungen: TLabel;
    LabelGeschwindigkeit: TLabel;
    LabelZeitintervall: TLabel;
    ButtonStart: TButton;
    Rahmen: TShape;
    LabelSpielEnde: TLabel;
    LabelSpielstandAnzeigen: TLabel;
    Paddle: TShape;
    Timer1: TTimer;
    UpDownBaelle: TUpDown;
    UpDownGeschwindigkeit: TUpDown;
    UpDownIntervall: TUpDown;
    UpDownBreitePaddle: TUpDown;
    procedure PaddleMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure RahmenMouseEnter(Sender: TObject);
    procedure ButtonWeiterClick(Sender: TObject);
    procedure ButtonCursorZeigenClick(Sender: TObject);
    procedure FarbeBallClick(Sender: TObject);
    procedure FarbeHintergrundClick(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure PaddleBewegen(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure BildEinstellungenClick(Sender: TObject);
    procedure PaddleMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
    procedure RadioGroupFormClick(Sender: TObject);
    procedure RadioGroupPaddleClick(Sender: TObject);
    procedure SpielStart(Sender: TObject);
    procedure SpielstandZeigen;
    procedure ButtonStartClick(Sender: TObject);
    procedure ButtonStoppClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure EndeSpiel;
    procedure UpDownBaelleClick(Sender: TObject; Button: TUDBtnType);
    procedure UpDownGeschwindigkeitClick(Sender: TObject; Button: TUDBtnType);
    procedure UpDownIntervallClick(Sender: TObject; Button: TUDBtnType);
    procedure UpDownBreitePaddleClick(Sender: TObject; Button: TUDBtnType);
    procedure GeschwindigkeitAnzeigen;
  private

  public

  end;

var
  Form1: TForm1;
  Treffer: Integer;
  GeschwindigkeitX, GeschwindigkeitY: array [1..5] of Integer;
  Ball: array [1..5] of TShape;
  AnzahlBaelle, Zaehler: Integer;
  StartZeit: Double;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
   SetDefaultLang('de');
   TextfeldGeschwindigkeit.Text:= IntToStr(UpDownGeschwindigkeit.Position);
   TextfeldZeitintervall.Text:= IntToStr(Timer1.Interval);
   TextfeldBreitePaddle.Text:= IntToStr(UpDownBreitePaddle.Position);
   TextfeldBaelle.Text:= IntToStr(UpDownBaelle.Position);
   AnzahlBaelle:= UpDownBaelle.Position;
   LabelSpielEnde.Visible:= false;
   LabelAnzeigeGeschwindigkeit.Caption:= 'Geschwindigkeit: ' + IntToStr(UpDownGeschwindigkeit.Position);
   Ball[1] := Ball1;
   Ball[2] := Ball2;
   Ball[3] := Ball3;
   Ball[4] := Ball4;
   Ball[5] := Ball5;

   // Geschwindigkeit festlegen
   // AnzahlBaelle:= 5;
   for Zaehler:= 1 to AnzahlBaelle do
   begin
      GeschwindigkeitX[Zaehler]:= UpDownGeschwindigkeit.Position;
      GeschwindigkeitY[Zaehler]:= UpDownGeschwindigkeit.Position;
   end;
   StartZeit := GetTickCount64;
end;

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
  WertX: Integer;
begin
  for Zaehler:= 1 to AnzahlBaelle do
  begin
     // Testen ob GeschwindigkeitX negativ ist
     if GeschwindigkeitX[Zaehler] > 0 then WertX:= GeschwindigkeitX[Zaehler]
     else WertX:= -GeschwindigkeitX[Zaehler];

     if WertX > 1 then
     begin
        if (GeschwindigkeitX[Zaehler] > 0) and (GeschwindigkeitY[Zaehler] > 0) then
        begin
          dec(GeschwindigkeitX[Zaehler]);
          dec(GeschwindigkeitY[Zaehler]);
          //GeschwindigkeitAnzeigen;
        end;

        if (GeschwindigkeitX[Zaehler] > 0) and (GeschwindigkeitY[Zaehler] < 0) then
        begin
          GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
          dec(GeschwindigkeitX[Zaehler]);
          dec(GeschwindigkeitY[Zaehler]);
          //GeschwindigkeitAnzeigen;
          GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
        end;

        if (GeschwindigkeitX[Zaehler] < 0) and (GeschwindigkeitY[Zaehler] > 0) then
        begin
          GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
          dec(GeschwindigkeitX[Zaehler]);
          dec(GeschwindigkeitY[Zaehler]);
          // GeschwindigkeitAnzeigen;
          GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
       end;

       if (GeschwindigkeitX[Zaehler] < 0) and (GeschwindigkeitY[Zaehler] < 0) then
       begin
          GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
          GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
          dec(GeschwindigkeitX[Zaehler]);
          dec(GeschwindigkeitY[Zaehler]);
          // GeschwindigkeitAnzeigen;
          GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
          GeschwindigkeitY[Zaehler]:=-GeschwindigkeitY[Zaehler];
        end;
     end;
  end;
  GeschwindigkeitAnzeigen;
end;

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  for Zaehler:= 1 to AnzahlBaelle do
  begin
     if (GeschwindigkeitX[Zaehler] > 0) and (GeschwindigkeitY[Zaehler] > 0) then
     begin
        inc(GeschwindigkeitX[Zaehler]);
        inc(GeschwindigkeitY[Zaehler]);
        //GeschwindigkeitAnzeigen;
      end;

      if (GeschwindigkeitX[Zaehler] > 0) and (GeschwindigkeitY[Zaehler] < 0) then
      begin
         GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
         inc(GeschwindigkeitX[Zaehler]);
         inc(GeschwindigkeitY[Zaehler]);
         //GeschwindigkeitAnzeigen;
         GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
      end;

      if (GeschwindigkeitX[Zaehler] < 0) and (GeschwindigkeitY[Zaehler] > 0) then
      begin
        GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
        inc(GeschwindigkeitX[Zaehler]);
        inc(GeschwindigkeitY[Zaehler]);
        //GeschwindigkeitAnzeigen;
        GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
      end;

      if (GeschwindigkeitX[Zaehler] < 0) and (GeschwindigkeitY[Zaehler] < 0) then
      begin
        GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
        GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
        inc(GeschwindigkeitX[Zaehler]);
        inc(GeschwindigkeitY[Zaehler]);
        //GeschwindigkeitAnzeigen;
        GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
        GeschwindigkeitY[Zaehler]:=-GeschwindigkeitY[Zaehler];
      end;
   end;
   GeschwindigkeitAnzeigen;
end;

procedure TForm1.FarbeBallClick(Sender: TObject);
begin
   if ColorDialog1.Execute then
   begin
      ColorDialog1.Title:= 'Wähle eine Farbe ...';
      Paddle.Brush.Color:= ColorDialog1.Color;
      for zaehler:= 1 to AnzahlBaelle do Ball[Zaehler].Brush.Color:= ColorDialog1.Color;
      LabelSpielstandAnzeigen.Font.Color:= ColorDialog1.Color;
      LabelAnzeigeGeschwindigkeit.Font.Color:= ColorDialog1.Color;
   end;
end;

procedure TForm1.ButtonCursorZeigenClick(Sender: TObject);
begin
   // Cursor nicht sichtbar
   if Form1.Cursor= crNone then
   begin
      ButtonCursorZeigen.Caption:= 'Maus verbergen';
      Form1.Cursor:= crDefault;
   end
   // Cursor sichtbar
   else
   begin
      ButtonCursorZeigen.Caption:= 'Maus zeigen';
      Form1.Cursor:= crNone;
   end;
end;

procedure TForm1.ButtonWeiterClick(Sender: TObject);
begin
  Paddle.Top:= ClientHeight - Paddle.Height;
  SpielStart(Sender);
end;

procedure TForm1.RahmenMouseEnter(Sender: TObject);
begin
  Paddle.Top:= ClientHeight - Paddle.Height;
end;

procedure TForm1.PaddleMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FormClick(Sender);
end;


procedure TForm1.FarbeHintergrundClick(Sender: TObject);
begin
   if ColorDialog1.Execute then
   begin
      ColorDialog1.Title:= 'Wähle eine Farbe ...';
      Form1.Color:= ColorDialog1.Color;
   end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
   // Spiel pausieren
   if Timer1.Enabled= true then Timer1.Enabled:= false
   else Timer1.Enabled:= true;
   // Einstellungsfenster angezeigt -> ausblenden
   if Rahmen.Visible= true then
   begin
      LabelSpielEnde.Visible:= false;
      FarbeBall.Visible:= false;
      ButtonCursorZeigen.Visible:= false;
      ButtonStart.Visible:= false;
      LabelEinstellungen.Visible:= false;
      UpDownGeschwindigkeit.Visible:= false;
      UpDownIntervall.Visible:= false;
      UpDownBreitePaddle.Visible:= false;
      Rahmen.Visible:= false;
      LabelGeschwindigkeit.Visible:= false;
      LabelZeitintervall.Visible:= false;
      LabelBreitePaddel.Visible:= false;
      LabelFarben.Visible:= false;
      LabelInfoText.Visible:= false;
      BildInfo.Visible:= false;
      TextfeldGeschwindigkeit.Visible:= false;
      TextfeldZeitintervall.Visible:= false;
      TextfeldBreitePaddle.Visible:= false;
      ButtonStopp.Visible:= false;
      RadioGroupPaddle.Visible:= false;
      RadioGroupForm.Visible:= false;
      LabelZeitintervall.Visible:= false;
      LabelBreitePaddel.Visible:= false;
      FarbeHintergrund.Visible:= false;
      Trennlinie.Visible:= false;
      LabelAnzahlBaelle.Visible:= false;
      UpDownBaelle.Visible:= false;
      TextfeldBaelle.Visible:= false;
      ButtonWeiter.Visible:= false;
   end;
end;

procedure TForm1.PaddleBewegen(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   // linke Ecke des Paddles
   Paddle.Left:= X - Paddle.Width div 2;
   Paddle.Top:= ClientHeight- Paddle.Height;
end;

procedure TForm1.BildEinstellungenClick(Sender: TObject);
begin
   // LabelEinstellungen anzeigen
   ButtonStart.Visible:= true;
   FarbeBall.Visible:= true;
   LabelEinstellungen.Visible:= true;
   ButtonCursorZeigen.Visible:= true;
   UpDownGeschwindigkeit.Visible:= true;
   UpDownIntervall.Visible:= true;
   UpDownBreitePaddle.Visible:= true;
   Rahmen.Visible:= true;
   LabelGeschwindigkeit.Visible:= true;
   LabelZeitintervall.Visible:= true;
   LabelBreitePaddel.Visible:= true;
   LabelFarben.Visible:= true;
   LabelInfoText.Visible:= true;
   LabelAnzahlBaelle.Visible:= true;
   UpDownBaelle.Visible:= true;
   TextfeldBaelle.Visible:= true;
   BildInfo.Visible:= true;
   FarbeHintergrund.Visible:= true;
   TextfeldGeschwindigkeit.Visible:= true;
   TextfeldZeitintervall.Visible:= true;
   TextfeldBreitePaddle.Visible:= true;
   LabelFarben.Visible:= true;
   ButtonStopp.Visible:= true;
   RadioGroupForm.Visible:= true;
   RadioGroupPaddle.Visible:= true;
   Trennlinie.Visible:= true;
   ButtonWeiter.Visible:= true;
   // Ball sichtbar platzieren
   Ball[Zaehler].Top:= ClientWidth div 2;
   Ball[Zaehler].Left:= ClientHeight div 2;
   // aktuelle Geschwindigkeit anzeigen
   if GeschwindigkeitX[1] < 0 then
   begin
      TextfeldGeschwindigkeit.Text:= IntToStr(-GeschwindigkeitX[1])
   end
   else
   begin
      TextfeldGeschwindigkeit.Text:= IntToStr(GeschwindigkeitX[1]);
   end;
   UpDownGeschwindigkeit.Position:= GeschwindigkeitX[1];
   // Timer stoppen
   Timer1.Enabled:= false;
   LabelZeit.Visible:= false;
   Paddle.Top:= ClientHeight - Paddle.Height;
end;

procedure TForm1.PaddleMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   // Aufruf
   PaddleBewegen(Sender, Shift, X + Paddle.Left, Y + Paddle.Top);
end;

procedure TForm1.RadioGroupFormClick(Sender: TObject);
begin
  case RadioGroupForm.ItemIndex of
     0: for Zaehler:= 1 to AnzahlBaelle do Ball[Zaehler].Shape:= stCircle;
     1: for Zaehler:= 1 to AnzahlBaelle do Ball[Zaehler].Shape:= stSquare;
     2: for Zaehler:= 1 to AnzahlBaelle do Ball[Zaehler].Shape:= stDiamond;
     3: for Zaehler:= 1 to AnzahlBaelle do Ball[Zaehler].Shape:= stStar;
  end;

end;

procedure TForm1.RadioGroupPaddleClick(Sender: TObject);
begin
    case RadioGroupPaddle.ItemIndex of
     0: Paddle.Shape:= stEllipse;
     1: Paddle.Shape:= stRectangle;
     2: Paddle.Shape:= stTriangle;
     3: Paddle.Shape:= stDiamond;
  end;
end;

procedure TForm1.SpielstandZeigen;
begin
   LabelSpielstandAnzeigen.Caption:= 'Treffer: ' + IntToStr(Treffer);
   if Treffer > 0 then
   begin
      if Treffer mod (AnzahlBaelle * 10) = 0 then
      begin
         for Zaehler:= 1 to AnzahlBaelle do
         begin
            // negative GeschwindigkeitX
            if GeschwindigkeitX[Zaehler] < 0 then dec(GeschwindigkeitX[Zaehler])
            else inc(GeschwindigkeitX[Zaehler]);
            if GeschwindigkeitY[Zaehler] < 0 then dec(GeschwindigkeitY[Zaehler])
            else inc(GeschwindigkeitY[Zaehler]);
            if  GeschwindigkeitX[Zaehler] < 0 then LabelAnzeigeGeschwindigkeit.Caption:= 'Geschwindigkeit: ' + IntToStr(-GeschwindigkeitX[Zaehler])
            else LabelAnzeigeGeschwindigkeit.Caption:= 'Geschwindigkeit: ' + IntToStr(GeschwindigkeitX[Zaehler]);
         end;
      end;
   end;
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  StartZeit := GetTickCount64;
  SpielStart(Sender);
end;

procedure TForm1.ButtonStoppClick(Sender: TObject);
begin
   Application.Terminate;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  for Zaehler:= 1 to AnzahlBaelle do
  begin
     Ball[Zaehler].Left:= Ball[Zaehler].Left + GeschwindigkeitX[Zaehler];
     Ball[Zaehler].Top:= Ball[Zaehler].Top + GeschwindigkeitY[Zaehler];
     // Game Over -> Ball am unteren Ende
     if Ball[Zaehler].Top + Ball[Zaehler].Height >= ClientHeight then
     begin
        EndeSpiel;
     end;

     // rechts und links
     if (Ball[Zaehler].Left<= 0) or (Ball[Zaehler].Left + Ball[Zaehler].Width>= ClientWidth) then GeschwindigkeitX[Zaehler]:=- GeschwindigkeitX[Zaehler];
     // oben -> Geschwindigkeit rückwärts
     if (Ball[Zaehler].Top<= 0) then
     begin
       GeschwindigkeitY[Zaehler]:=- GeschwindigkeitY[Zaehler];
       inc(Treffer);
       SpielstandZeigen;
     end;
     // Ball berührt Paddle
     // linker Rand -> Ball.Left + Ball.Width>= Paddle.Left
     // rechter Rand -> Ball.Left<= Paddle.Left + Paddle.Width
     // oberer Rand -> Ball.Top + Ball.Height>= Paddle.Top
     //if Paddle.Top + Paddle.Height < Ball[Zaehler].Top  then
     //begin
     if (Ball[Zaehler].Left + Ball[Zaehler].Width>= Paddle.Left) and (Ball[Zaehler].Left<= Paddle.Left + Paddle.Width)
     and (Ball[Zaehler].Top + Ball[Zaehler].Height>= Paddle.Top) then
     begin
       if Paddle.Top + Paddle.Height >= Ball[Zaehler].Top then
       begin
          // Paddle getroffen -> Geschwindigkeit rückwärts
          GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
       end;
     end;
     LabelZeit.Visible:= true;
     LabelZeit.Caption:= FloatToStr(RoundTo((GetTickCount64 - StartZeit) / 1000, -1)) + ' s';
  end;

  //end;
end;

procedure TForm1.EndeSpiel;
begin
   LabelSpielEnde.Visible:= true;
   Timer1.Enabled:= false;
end;

procedure TForm1.UpDownBaelleClick(Sender: TObject; Button: TUDBtnType);
begin
  for Zaehler:= 1 to 5 do
  begin
     Ball[Zaehler].Visible:= false;
  end;

  AnzahlBaelle:= UpDownBaelle.Position;
  for Zaehler:= 1 to AnzahlBaelle do
  begin
     Ball[Zaehler].Visible:= true;
  end;
  TextfeldBaelle.Caption:= IntToStr(UpDownBaelle.Position);
end;

procedure TForm1.UpDownGeschwindigkeitClick(Sender: TObject; Button: TUDBtnType);
begin
  for Zaehler:= 1 to AnzahlBaelle do
  begin
     inc(GeschwindigkeitX[Zaehler]);
     inc(GeschwindigkeitY[Zaehler]);
  end;
  TextfeldGeschwindigkeit.Text:= IntToStr(UpDownGeschwindigkeit.Position);
  LabelAnzeigeGeschwindigkeit.Caption:= 'Geschwindigkeit: ' + IntToStr(UpDownGeschwindigkeit.Position);
end;

procedure TForm1.UpDownIntervallClick(Sender: TObject; Button: TUDBtnType);
begin
   TextfeldZeitintervall.Text:= IntToStr(UpDownIntervall.Position);
   Timer1.Interval:= Timer1.Interval + 1;
end;

procedure TForm1.UpDownBreitePaddleClick(Sender: TObject; Button: TUDBtnType);
begin
  TextfeldBreitePaddle.Text:= IntToStr(UpDownBreitePaddle.Position);
  if Paddle.Width < ClientWidth then Paddle.Width:= UpDownBreitePaddle.Position;
end;

procedure TForm1.GeschwindigkeitAnzeigen;
begin
  if TextfeldGeschwindigkeit.Visible = true then
  begin
      if GeschwindigkeitX[Zaehler] < 0 then
      begin
         TextfeldGeschwindigkeit.Text:= IntToStr(-GeschwindigkeitX[Zaehler]);
         UpDownGeschwindigkeit.Position:= -GeschwindigkeitX[Zaehler];
      end
      else
      begin
         TextfeldGeschwindigkeit.Text:= IntToStr(GeschwindigkeitX[Zaehler]);
         UpDownGeschwindigkeit.Position:= GeschwindigkeitX[Zaehler];
      end;
  end;

  if GeschwindigkeitX[Zaehler] < 0 then LabelAnzeigeGeschwindigkeit.Caption:= 'Geschwindigkeit: ' + IntToStr(-GeschwindigkeitX[Zaehler])
  else LabelAnzeigeGeschwindigkeit.Caption:= 'Geschwindigkeit: ' + IntToStr(GeschwindigkeitX[Zaehler]);
end;

procedure TForm1.SpielStart(Sender: TObject);
var
  Zaehler, ZufallRichtung: Integer;
begin
  // zufällige Startposition > Hälfte der Höhe
   Randomize;
   Paddle.Top:= ClientHeight - Paddle.Height;
   AnzahlBaelle:= UpDownBaelle.Position;
   for Zaehler:= 1 to AnzahlBaelle do
   begin
      Ball[Zaehler].Left:= Random(ClientWidth - Ball[Zaehler].Height);
      Ball[Zaehler].Top:= Random((ClientHeight - Ball[Zaehler].Width) div 2);
   end;
   // Treffer nur beim Neustart zurücksetzen
   if Sender = ButtonStart then Treffer:= 0;
   // Elemente LabelEinstellungen ausblenden
   LabelSpielEnde.Visible:= false;
   FarbeBall.Visible:= false;
   ButtonCursorZeigen.Visible:= false;
   ButtonStart.Visible:= false;
   LabelEinstellungen.Visible:= false;
   UpDownGeschwindigkeit.Visible:= false;
   UpDownIntervall.Visible:= false;
   UpDownBreitePaddle.Visible:= false;
   Rahmen.Visible:= false;
   LabelGeschwindigkeit.Visible:= false;
   LabelZeitintervall.Visible:= false;
   LabelBreitePaddel.Visible:= false;
   LabelFarben.Visible:= false;
   LabelAnzahlBaelle.Visible:= false;
   UpDownBaelle.Visible:= false;
   TextfeldBaelle.Visible:= false;
   LabelInfoText.Visible:= false;
   BildInfo.Visible:= false;
   TextfeldGeschwindigkeit.Visible:= false;
   TextfeldZeitintervall.Visible:= false;
   TextfeldBreitePaddle.Visible:= false;
   ButtonStopp.Visible:= false;
   RadioGroupPaddle.Visible:= false;
   RadioGroupForm.Visible:= false;
   LabelZeitintervall.Visible:= false;
   LabelBreitePaddel.Visible:= false;
   FarbeHintergrund.Visible:= false;
   Trennlinie.Visible:= false;
   ButtonWeiter.Visible:= false;
   DoubleBuffered:= true;
   // Timer starten
   Timer1.Enabled:= true;
   // Geschwindigkeit lesen und festlegen
   for Zaehler:= 1 to AnzahlBaelle do
   begin
      GeschwindigkeitX[Zaehler]:= UpDownGeschwindigkeit.Position;
      GeschwindigkeitY[Zaehler]:= UpDownGeschwindigkeit.Position;
      // zufällige Richtung
      ZufallRichtung:= Random(2);
      if ZufallRichtung = 1 then
      begin
         GeschwindigkeitY[Zaehler]:= -GeschwindigkeitY[Zaehler];
         GeschwindigkeitX[Zaehler]:= -GeschwindigkeitX[Zaehler];
      end;
   end;

   // Breite des Paddles
   Paddle.Width:= UpDownBreitePaddle.Position;
   SpielstandZeigen;
   GeschwindigkeitAnzeigen;
end;


end.

