Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   RandomRange() oder Random() beim Bewegen einer Komponente (https://www.delphipraxis.net/179269-randomrange-oder-random-beim-bewegen-einer-komponente.html)

faCee 24. Feb 2014 17:24

AW: RandomRange() oder Random() beim Bewegen einer Komponente
 
Zitat:

Zitat von DeddyH (Beitrag 1249377)
Zitat:

Delphi-Quellcode:
if (shpBall.Top = (shpSP1.Top - 10)) then

Bist Du sicher, dass der Abstand exakt 10 Pixel betragen muss? Was ist denn, wenn er kleiner wird (durch ungünstige Schrittweite z.B.)?

Habe aus dem = ein >= gemacht. Jetzt prallt er ab. :D

Danke dir. :D Ich gehe mich jetzt in die Ecke schämen ;D

DeddyH 24. Feb 2014 17:25

AW: RandomRange() oder Random() beim Bewegen einer Komponente
 
Denk mal nicht, dass Du der Erste bist, der diesen Fehler gemacht hat ;)

faCee 25. Feb 2014 19:56

AW: RandomRange() oder Random() beim Bewegen einer Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
So,

habe die vielen Ratschläge nun möglichst beherzigt und bin mit dem Spiel quasi fertig. Den "auf Zeit"-Modus habe ich verworfen und somit ein klassisches Pong-Spiel programmiert.

Die Schläger sind jetzt in 4 Bereiche unterteilt, die den Ball mit einer jeweils anderen X-Geschwindigkeit fliegen lassen.

Hier mal der Quelltext des ganzen Programms:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Math, StdCtrls;

type
  TForm1 = class(TForm)
    shpFeld: TShape;
    shpSP1: TShape;
    shpCPU: TShape;
    btnSpielen: TButton;
    shpBall: TShape;
    tmrBeweger: TTimer;
    tmrCPU: TTimer;
    tmrZaehler: TTimer;
    lblSpieler: TLabel;
    lblCPU: TLabel;
    lblPunkteSpieler: TLabel;
    lblPunkteCPU: TLabel;

    procedure btnSpielenClick(Sender: TObject);
    procedure OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure tmrBewegerTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure tmrCPUTimer(Sender: TObject);
    procedure tmrZaehlerTimer(Sender: TObject);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  vBeginne: Boolean;

  vX, vY: Integer; //horizontale u. vertikale Geschw.


implementation

{$R *.dfm}

//Fängt das Spiel an; startet Möglichkeiten zur Balkensteuerung
procedure TForm1.btnSpielenClick(Sender: TObject);
begin
         beep;           //beep
         vBeginne := True; //Setzt die Spiel-Variable auf 1
         btnSpielen.Enabled := False;
         vX := 0;
         vY := 12;
end;

//Richtet den Zufallsgenerator ein -> Zufallszahlen werden nicht nach der Systemzeit ausgerichtet
procedure TForm1.FormCreate(Sender: TObject);
begin

  randomize;

end;

//Startet die zwei Timer, erlaubt es, den Spieler-Balken zu bewegen
procedure TForm1.OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin

  if (vBeginne) then //Wenn Spiel-Variable auf 1, dann beginnt das Spiel
   begin
    tmrBeweger.Enabled := True;
    tmrCPU.Enabled := True;
    tmrZaehler.Enabled := True;
    if (Key = VK_RIGHT) and (shpSP1.Left <= 500) then (shpSP1.Left := shpSP1.Left + 14);
    if (Key = VK_Left) and (shpSP1.Left >= 0) then (shpSP1.Left := shpSP1.Left - 14);
   end;

end;

//Sorgt für die Bewegung des Balls und achtet auf die Spielregeln
procedure TForm1.tmrBewegerTimer(Sender: TObject);
begin

   //Falls der Ball auf den unteren Balken trifft...
   if (shpBall.Top >= (shpSP1.Top - 20)) and (shpBall.Left >= shpSP1.Left) and (shpBall.Left <= (shpSP1.Left + 25)) then
    begin
      vX := -16;
      vY := (vY * (-1));
    end;

   if (shpBall.Top >= (shpSP1.Top - 20)) and (shpBall.Left > (shpSP1.Left + 25)) and (shpBall.Left <= (shpSP1.Left + 50)) then
    begin
      vX := -12;
      vY := (vY * (-1));
    end;

   if (shpBall.Top >= (shpSP1.Top - 20)) and (shpBall.Left > (shpSP1.Left + 50)) and (shpBall.Left <= (shpSP1.Left + 75)) then
    begin
      vX := 12;
      vY := (vY * (-1));
    end;

   if (shpBall.Top >= (shpSP1.Top - 29)) and (shpBall.Left > (shpSP1.Left + 75)) and (shpBall.Left <= (shpSP1.Left + 100)) then
    begin
      vX := 16;
      vY := (vY * (-1));
    end;

   //Falls der Ball auf den oberen Balken trifft...
   if (shpBall.Top <= (shpCPU.Top + 20)) and (shpBall.Left >= shpCPU.Left) and (shpBall.Left <= (shpCPU.Left + 25)) then
    begin
      vX := -16;
      vY := (vY * (-1));
    end;

   if (shpBall.Top <= (shpCPU.Top + 20)) and (shpBall.Left > (shpCPU.Left +25)) and (shpBall.Left <= (shpCPU.Left + 50)) then
    begin
      vX := -12;
      vY := (vY * (-1));
    end;

   if (shpBall.Top <= (shpCPU.Top + 20)) and (shpBall.Left > (shpCPU.Left +50)) and (shpBall.Left <= (shpCPU.Left + 75)) then
    begin
      vX := 12;
      vY := (vY * (-1));
    end;

   if (shpBall.Top <= (shpCPU.Top + 20)) and (shpBall.Left > (shpCPU.Left +75)) and (shpBall.Left <= (shpCPU.Left + 100)) then
    begin
      vX := 16;
      vY := (vY * (-1));
    end;

   //Abpraller von Wänden!
   if (shpBall.Left <= 0) or (shpBall.Left >= 590) then
    begin
      vX := (vX * (-1));
    end;

   //Bewegt den Ball einfach nur.
   shpBall.Top := (shpBall.Top + vY);    //Steuert vertikal!
   shpBall.Left := (shpBall.Left + vX);  //Steuert horizontal!

end;

//Bewegt den Balken des Computer-Gegners.
procedure TForm1.tmrCPUTimer(Sender: TObject);
begin

   if (shpBall.Left > shpCPU.Left) then
    begin
      shpCPU.Left := (shpCPU.Left + 14);
    end;

   if (shpBall.Left <= shpCPU.Left) then
    begin
      shpCPU.Left := (shpCPU.Left - 14);
    end;

end;

//Steuert den Zähler.
procedure TForm1.tmrZaehlerTimer(Sender: TObject);
var
vPSpieler, vPCPU: Integer;
begin

 if (StrToInt(lblPunkteCPU.Caption) >= 21) or (StrToInt(lblPunkteSpieler.Caption) >= 21) then
  begin

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

    shpBall.Left := 296;
    shpBall.Top := 200;

    shpSP1.Left := 250;
    shpCPU.Left := 250;

    vX := 0;
    vY := 12;

    if (StrToInt(lblPunkteCPU.Caption) >= 21) then
     begin
       ShowMessage('Leider verloren! CPU gewinnt');
       //tmrZaehler.Enabled := False;
     end;

    if (StrToInt(lblPunkteSpieler.Caption) >= 21) then
     begin
       ShowMessage('Herzlichen Glückwunsch! Gewonnen!');
       //tmrZaehler.Enabled := False;
     end;

     //tmrZaehler.Enabled := False;

    lblPunkteSpieler.Caption := IntToStr(0);
    lblPunkteCPU.Caption := IntToStr(0);
    vPSpieler := 0;
    vPCPU := 0;

    btnSpielen.Enabled := True;

  end;


 if (shpBall.Top <= 0) or (shpBall.Top >= 380) then
  begin

    if (shpBall.Top <= 0) then //Gibt Spieler einen Punkt.
     begin
       vPSpieler := StrToInt(lblPunkteSpieler.Caption);
       lblPunkteSpieler.Caption := IntToStr(vPSpieler +1);
     end;

    if (shpBall.Top >= 380) then //Gibt CPU einen Punkt.
     begin
       vPCPU := StrToInt(lblPunkteCPU.Caption);
       lblPunkteCPU.Caption := IntToStr(vPCPU +1);
     end;

    //Reset
    tmrBeweger.Enabled := False;

    shpBall.Left := 296;
    shpBall.Top := 200;

    shpSP1.Left := 250;
    shpCPU.Left := 250;

    vX := 0;
    vY := 12;

    tmrBeweger.Enabled := True;

    sleep(250);

  end;

end;

end.
Wenn jemand Sachen findet, die schlecht oder zumindest noch verbesserungswürdig sind, dann sagt bescheid. :) Will mich da stetig verbessern.

Gruß, und schon mal vielen Dank an alle die geholfen haben, besonders den Exil-Sauerländer. :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz