Einzelnen Beitrag anzeigen

Benutzerbild von faCee
faCee

Registriert seit: 24. Feb 2014
Ort: Sauerland
7 Beiträge
 
Delphi 2010 Professional
 
#1

RandomRange() oder Random() beim Bewegen einer Komponente

  Alt 24. Feb 2014, 13:39
Moin,

habe zur Zeit folgendes Problem:

Ich versuche den Klassiker Pong mit Pascal nachzuprogrammieren.
Das Spiel hat bei mir zwei Modi, "klassisch" und "auf Zeit".

Zum Verständnis:

Die beiden Balken und der Ball sind Shapes.

Der "auf Zeit"-Modus ist soweit implementiert. In jenem Modus spielt der Spieler auf Zeit gegen den Gegner-Balken, der immer den Ball abfängt.

Mein Problem liegt nun im "klassisch"-Modus. Da im "auf Zeit"-Modus der Ball immer im selben Winkel von den Wänden abprallt (und so auch praktisch immer das gleiche Bewegungsmuster hat), wollte ich ihm hier mit einem zufälligen Wert für die horizontale Geschwindigkeit an den Leib rücken.
Jedoch scheint dieser Wert immer gleich 0 zu sein, da der Ball sich nur hoch und runter bewegt.
Ich habe es mit Random() und RandomRange versucht.

Hier der Code der Timer-Prozedur, die die Steuerung des Balles übernimmt:
Delphi-Quellcode:
//Sorgt für die Bewegung des Balls und achtet auf die Spielregeln
procedure TForm1.tmrBewegerTimer(Sender: TObject);
begin

   //vZufallLinks := RandomRange(6, 24);
   //vZufallRechts := RandomRange(6, 24);

  //Falls der Ball steht
  if (vBallSteht = True) then
   begin
     //shpBall.Top := shpBall.Top + 1; //Spielt dem Spieler bei Spielbeginn den Ball zu
     vBallAufschlag := True;
     vBallSteht := False;
   end;

  //Falls der Aufschlag kommt; zum Spieler!
  if (vBallAufschlag = True) then
   begin

     vAnfang := Now;
     tmrZaehler.Enabled := True;

     shpBall.Top := (shpBall.Top + 12);
     if (shpBall.Top = shpSP1.Top) then
      begin

         if (shpBall.Left >= shpSP1.Left) and (shpBall.Left <= (shpSP1.Left + 100)) then
           begin
             vBallNachOben := True;
             vBallAufschlag := False;

             vZufall := Random(2);
             if (vZufall = 1) then
              begin
               vBallNachRechts := True;
               vBallNachLinks := False;
              end
             else
              begin
               vBallNachRechts := False;
               vBallNachLinks := True;
              end;

           end;

      end;

   end;

  //Falls der Ball nach unten fliegen soll
  if (vBallNachUnten = True) then
   begin

     shpBall.Top := (shpBall.Top + 12);
     if (shpBall.Top = shpSP1.Top) then
      begin

         if (shpBall.Left >= shpSP1.Left) and (shpBall.Left <= (shpSP1.Left + 100)) then
           begin
             vBallNachOben := True;
             vBallNachUnten := False;

             if (vBallNachLinks = True) then
              begin
                 vBallNachRechts := False;
              end
             else
              begin
                 vBallNachLinks := False;
                 vBallNachRechts := True
              end;

           end;

      end;

   end;

  //Falls der Ball nach oben fliegen soll
  if (vBallNachOben = True) then
   begin

      shpBall.Top := (shpBall.Top - 12);
      if (shpBall.Top = shpCPU.Top + 10) then
       begin

          if (shpBall.Left >= shpCPU.Left) and (shpBall.Left <= (shpCPU.Left + 100)) then
           begin
             vBallNachOben := False;
             vBallNachUnten := True;

             if (vBallNachLinks = True) then
              begin
                 vBallNachRechts := False
              end
             else
              begin
                 vBallNachLinks := False;
                 vBallNachRechts := True;
              end;

           end;

       end;

   end;

   //Falls der Ball nach rechts fliegen soll
   if (vBallNachRechts = True) then
    begin

     if (rdbKlassik.Checked = True) then
      begin
        shpBall.Left := (shpBall.Left + vZufallRechts);
      end
     else
      begin
        shpBall.Left := (shpBall.Left + 12);
      end;

    end;

   //Falls der Ball nach links fliegen soll
   if (vBallNachLinks = True) then
    begin

      if (rdbKlassik.Checked = True) then
      begin
        shpBall.Left := (shpBall.Left - vZufallLinks);
      end
     else
      begin
        shpBall.Left := (shpBall.Left - 12);
      end;

    end;

   //Falls der Ball von unten an die rechte Wand stößt
   if (shpBall.Left >= 590) and (vBallNachOben = True) then
    begin

      vZufallLinks := RandomRange(6, 24);

      vBallNachRechts := False;
      vBallNachLinks := True;

    end;

   //Falls der Ball von unten an die linke Wand stößt
   if (shpBall.Left <= 10) and (vBallNachOben = True) then
    begin

      vZufallRechts := RandomRange(6, 24);

      vBallNachRechts := True;
      vBallNachLinks := False;

    end;

   //Falls der Ball von Oben an die rechte Wand stößt
   if (shpBall.Left >= 590) and (vBallNachUnten = True) then
    begin

      vZufallLinks := RandomRange(6, 24);

      vBallNachRechts := False;
      vBallNachLinks := True;

    end;

   //Falls der Ball von Oben an die linke Wand stößt
   if (shpBall.Left <= 10) and (vBallNachUnten = True) then
    begin

      vZufallRechts := RandomRange(6, 24);

      vBallNachRechts := True;
      vBallNachLinks := False;

    end;

   //Beendet die Runde, falls der Ball den unteren Rand übertritt!
   if (shpBall.Top >= 400) then
    begin

      vBeginne := False;
      vBallNachUnten := False;
      vBallNachOben := False;
      vBallNachLinks := False;
      vBallNachRechts := False;
      vBallSteht := False;
      vBallAufschlag := False;

      tmrBeweger.Enabled := False;
      tmrZaehler.Enabled := False;
      tmrCPU.Enabled := False;

      shpSP1.Left := 250;
      shpCPU.Left := 250;
      shpBall.Left := 296;
      shpBall.Top := 200;

      vZeit := lblZeit.Caption;

      ShowMessage('Spiel verloren! Deine erreichte Zeit: '+ vZeit +' Sekunden');

      beep;

      btnSpielen.Enabled := True;

    end;

end;
Ich hoffe, dass jemand da eine Idee hat.
David

Geändert von faCee (24. Feb 2014 um 13:42 Uhr)
  Mit Zitat antworten Zitat