AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)
Thema durchsuchen
Ansicht
Themen-Optionen

Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)

Ein Thema von TrevorFromGta · begonnen am 14. Jan 2014 · letzter Beitrag vom 14. Jan 2014
Antwort Antwort
TrevorFromGta

Registriert seit: 14. Jan 2014
2 Beiträge
 
#1

Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)

  Alt 14. Jan 2014, 12:49
Hallo Ich bin noch sehr unerfahren im Umgang mit Delphi und wollte hier einmal um Hilfe fragen (hoffentlich habe ich das richtige Unterforum erwischt). Es geht um ein Pong-Spiel, Label 3 ist der Ball und Label 1 und 2 die Schläger. Dummerweise reagiert der 1. Schläger (Label 1) nicht und der Ball geht einfach hindurch, wodurch Spieler 2 einen Punkt bekommt. Ich habe mal die Stellen fett markiert, bei denen ich vermute wo der Fehler liegt. SEltsamerweise reagiert der Ball entsprechend normal auf den 2. Schläger, also LAbel 2...weiß jemand, wo der Fehler liegt und könnte mir dabei helfen? Das wäre verdammt nett!

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Shape1: TShape;
    Shape2: TShape;
    Shape3: TShape;
    Timer2: TTimer;
    court: TShape;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    NewGame1: TMenuItem;
    Player1name1: TMenuItem;
    Player2name1: TMenuItem;
    HighScores1: TMenuItem;
    Game1: TMenuItem;
    Start1: TMenuItem;
    Stop1: TMenuItem;
    Pause1: TMenuItem;
    Exit1: TMenuItem;
    Shape4: TShape;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Details1: TMenuItem;
    Author1: TMenuItem;
    Howtoplay1: TMenuItem;
    Shape5: TShape;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Start1Click(Sender: TObject);
    procedure Stop1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure Player1name1Click(Sender: TObject);
    procedure Player2name1Click(Sender: TObject);
    procedure Pause1Click(Sender: TObject);
    procedure NewGame1Click(Sender: TObject);
    procedure HighScores1Click(Sender: TObject);
    procedure Author1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Howtoplay1Click(Sender: TObject);

  private
    { Private declarations }
  public
    horiz : integer;
    horiz2 : integer;
    direction : integer;
    vert : integer;
    player1 : integer;
    player2 : integer;
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Unit3, Unit4, Unit5, Unit6;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (player2 = 5) then begin
timer1.Enabled:= false;
timer2.Enabled:= false;
        messagedlg('Player 2 has won', mtinformation , [mbok], 0); player1:= 0; player2:= 0;
         end;


timer1.Interval:= 10;
timer2.Interval:= 20;
timer2.Enabled:= false;
shape3.Left:= shape3.Left -horiz;
shape3.top := shape3.top + vert;

if (shape3.left < shape1.left)
      then
        begin
          player2:= player2 +1;
          timer1.Enabled := false;
          MessageDlg('Player 2 has scored' + chr(13) + 'Click to continue', MTInformation , [MBOK], 0);
          shape3.Left := 240;
          shape3.Top := 144;
          shape1.Top := 152;
          shape2.Top := 152;
          horiz:= 4;
          vert:= 0;
          timer1.Enabled := true;

           end;

            if (shape3.Top >= shape1.Top) and (shape3.top <= (shape1.top + shape1.Height)) and (vert = 0)
         then vert:= 2;



          if (shape3.Top <= court.top)
        then
          vert := + 2;
          if ((shape3.Top + shape3.Height) = 497)
        then
          vert := - 2;

if ((shape3.Left <= shape1.Left + shape1.width ) and (shape3.Top >= shape1.Top - 10) and (shape3.Top <= shape1.Top + shape1.Height))
then
direction:= 5;
if direction = 1 then
timer1.Enabled:= false;
timer2.Enabled:= true;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
if (player1 = 15) then begin
timer1.Enabled:= false;
timer2.Enabled:= false;
        messagedlg('Player 1 has won', mtinformation , [mbok], 0); player1:= 0; player2:= 0;
         end;
timer1.Interval:= 20;
timer2.Interval:= 10;
shape3.left:= shape3.Left +horiz2;
shape3.top := shape3.top + vert;
timer1.Enabled:= false;

[B]if (shape3.left > shape2.left)
      then
        begin
          player1:= player1 +1;
          timer2.Enabled := false;
          MessageDlg('Player 1 has scored' + chr(13) + 'Click to continue', MTInformation , [MBOK], 0);
          shape3.Left := 240;
          shape3.Top := 144;
          shape1.Top := 152;
          shape2.Top := 152;
          horiz := 4;
          vert := 0;
          timer2.Enabled := true;
        end;



         if (shape3.Top >= shape1.Top) and (shape3.top <= (shape1.top + shape1.Height)) and (vert= 0)
         then vert:= -2;

        if (shape3.Top <= court.top)
        then
          vert := + 2;
          if ((shape3.Top + shape3.Height) = 497)
        then
          vert := - 2;[/B]
[B]
if ((shape3.Left + shape3.width >= shape2.Left) and (shape3.Top >= shape2.Top - 10) and (shape3.Top <= shape2.Top + shape2.Height)) then
direction:= 2;
if direction= 2 then
timer2.enabled:= false;
timer1.Enabled:= true;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = vk_up
  then
    shape1.Top := shape1.Top - 15
  else if Key = vk_down
    then
      shape1.Top := shape1.top + 15;

if key = vk_left
  then
  shape1.left:= shape1.Left -15
  else if key = vk_right
  then
  shape1.Left := shape1.left +15;[/B]

end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = 's'
    then
      shape2.Top := shape2.Top - 15
  else if Key = 'x'
    then
      shape2.Top := shape2.Top + 15;
  if key = 'a'
  then
  shape2.Left:= shape2.Left -15
  else if
  key = 'd'
  then
  shape2.Left:= shape2.Left +15;
end;

procedure TForm1.Start1Click(Sender: TObject);
begin
 with form1 do
horiz:= 4;
horiz2:= 4;
vert:= -2;
timer1.Enabled:= true;
timer2.Enabled:= false;
end;

procedure TForm1.Stop1Click(Sender: TObject);
begin
timer1.Enabled:= false;
timer2.Enabled:= false;
player1:= 0;
player2:= 0;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
form1.Close;
end;

procedure TForm1.Player1name1Click(Sender: TObject);
begin
form2.visible:= true;
end;

procedure TForm1.Player2name1Click(Sender: TObject);
begin
form3.visible:= true;
end;

procedure TForm1.Pause1Click(Sender: TObject);
begin
timer1.Enabled:= false;
timer2.Enabled:= false;

end;

procedure TForm1.NewGame1Click(Sender: TObject);
begin
player1:= 0;
player2:= 0;
shape3.Left:= 216;
shape3.Top:= 120;
messagedlg('Get ready to play', mtinformation,[mbok], 0);
timer1timer(self);
end;

procedure TForm1.HighScores1Click(Sender: TObject);
begin
form4.visible:= true;
end;

procedure TForm1.Author1Click(Sender: TObject);
begin
form5.visible:= true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
messagedlg('Get redy to play Martins Ping Pong Verion 1.0', mtinformation ,[mbok] , 0);
messagedlg('Remember it is first to 5 wins', mtinformation ,[mbok] , 0);
end;

procedure TForm1.Howtoplay1Click(Sender: TObject);
begin
form6.Visible:= true;
end;

end.

Geändert von TrevorFromGta (14. Jan 2014 um 17:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)

  Alt 14. Jan 2014, 15:04
Bitte ersetze doch
Code:
[SPOILER][/SPOILER]
durch
Code:
[DELPHI][/DELPHI]
dann ist der Code auch lesbar(er)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
TrevorFromGta

Registriert seit: 14. Jan 2014
2 Beiträge
 
#3

AW: Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)

  Alt 14. Jan 2014, 17:52
Ich habe es einmal durch ersetzt, danke!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)

  Alt 14. Jan 2014, 17:57
Wenn es jetzt noch formatiert wäre ...

z.B. so (bitte herauskopieren und in den ersten Beitrag setzen)

Delphi-Quellcode:
unit Unit1;

interface

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

  type
    TForm1 = class( TForm )
      Timer1 : TTimer;
      Shape1 : TShape;
      Shape2 : TShape;
      Shape3 : TShape;
      Timer2 : TTimer;
      court : TShape;
      MainMenu1 : TMainMenu;
      File1 : TMenuItem;
      NewGame1 : TMenuItem;
      Player1name1 : TMenuItem;
      Player2name1 : TMenuItem;
      HighScores1 : TMenuItem;
      Game1 : TMenuItem;
      Start1 : TMenuItem;
      Stop1 : TMenuItem;
      Pause1 : TMenuItem;
      Exit1 : TMenuItem;
      Shape4 : TShape;
      Label1 : TLabel;
      Label2 : TLabel;
      Label3 : TLabel;
      Label4 : TLabel;
      Details1 : TMenuItem;
      Author1 : TMenuItem;
      Howtoplay1 : TMenuItem;
      Shape5 : TShape;
      procedure Timer1Timer( Sender : TObject );
      procedure Timer2Timer( Sender : TObject );
      procedure FormKeyDown( Sender : TObject; var Key : Word; Shift : TShiftState );
      procedure FormKeyPress( Sender : TObject; var Key : Char );
      procedure Start1Click( Sender : TObject );
      procedure Stop1Click( Sender : TObject );
      procedure Exit1Click( Sender : TObject );
      procedure Player1name1Click( Sender : TObject );
      procedure Player2name1Click( Sender : TObject );
      procedure Pause1Click( Sender : TObject );
      procedure NewGame1Click( Sender : TObject );
      procedure HighScores1Click( Sender : TObject );
      procedure Author1Click( Sender : TObject );
      procedure FormCreate( Sender : TObject );
      procedure Howtoplay1Click( Sender : TObject );

    private
      { Private declarations }
    public
      horiz : integer;
      horiz2 : integer;
      direction : integer;
      vert : integer;
      player1 : integer;
      player2 : integer;
    end;

  var
    Form1 : TForm1;

implementation

  uses
    Unit2, Unit3, Unit4, Unit5, Unit6;

{$R *.dfm}

  procedure TForm1.Timer1Timer( Sender : TObject );
    begin
      if ( player2 = 5 )
      then
        begin
          Timer1.Enabled := false;
          Timer2.Enabled := false;
          messagedlg( 'Player 2 has won', mtinformation, [mbok], 0 ); player1 := 0; player2 := 0;
        end;

      Timer1.Interval := 10;
      Timer2.Interval := 20;
      Timer2.Enabled := false;
      Shape3.Left := Shape3.Left - horiz;
      Shape3.top := Shape3.top + vert;

      if ( Shape3.Left < Shape1.Left )
      then
        begin
          player2 := player2 + 1;
          Timer1.Enabled := false;
          messagedlg( 'Player 2 has scored' + chr( 13 ) + 'Click to continue', mtinformation, [mbok], 0 );
          Shape3.Left := 240;
          Shape3.top := 144;
          Shape1.top := 152;
          Shape2.top := 152;
          horiz := 4;
          vert := 0;
          Timer1.Enabled := true;

        end;

      if ( Shape3.top >= Shape1.top ) and ( Shape3.top <= ( Shape1.top + Shape1.Height ) ) and ( vert = 0 )
      then
        vert := 2;

      if ( Shape3.top <= court.top )
      then
        vert := +2;
      if ( ( Shape3.top + Shape3.Height ) = 497 )
      then
        vert := -2;

      if ( ( Shape3.Left <= Shape1.Left + Shape1.width ) and ( Shape3.top >= Shape1.top - 10 ) and ( Shape3.top <= Shape1.top + Shape1.Height ) )
      then
        direction := 5;
      if direction = 1
      then
        Timer1.Enabled := false;
      Timer2.Enabled := true;
    end;

  procedure TForm1.Timer2Timer( Sender : TObject );
    begin
      if ( player1 = 15 )
      then
        begin
          Timer1.Enabled := false;
          Timer2.Enabled := false;
          messagedlg( 'Player 1 has won', mtinformation, [mbok], 0 ); player1 := 0; player2 := 0;
        end;
      Timer1.Interval := 20;
      Timer2.Interval := 10;
      Shape3.Left := Shape3.Left + horiz2;
      Shape3.top := Shape3.top + vert;
      Timer1.Enabled := false;

      if ( Shape3.Left > Shape2.Left )
      then
        begin
          player1 := player1 + 1;
          Timer2.Enabled := false;
          messagedlg( 'Player 1 has scored' + chr( 13 ) + 'Click to continue', mtinformation, [mbok], 0 );
          Shape3.Left := 240;
          Shape3.top := 144;
          Shape1.top := 152;
          Shape2.top := 152;
          horiz := 4;
          vert := 0;
          Timer2.Enabled := true;
        end;

      if ( Shape3.top >= Shape1.top ) and ( Shape3.top <= ( Shape1.top + Shape1.Height ) ) and ( vert = 0 )
      then
        vert := -2;

      if ( Shape3.top <= court.top )
      then
        vert := +2;
      if ( ( Shape3.top + Shape3.Height ) = 497 )
      then
        vert := -2;

      if ( ( Shape3.Left + Shape3.width >= Shape2.Left ) and ( Shape3.top >= Shape2.top - 10 ) and ( Shape3.top <= Shape2.top + Shape2.Height ) )
      then
        direction := 2;
      if direction = 2
      then
        Timer2.Enabled := false;
      Timer1.Enabled := true;

    end;

  procedure TForm1.FormKeyDown( Sender : TObject; var Key : Word; Shift : TShiftState );
    begin
      if Key = vk_up
      then
        Shape1.top := Shape1.top - 15
      else if Key = vk_down
      then
        Shape1.top := Shape1.top + 15;

      if Key = vk_left
      then
        Shape1.Left := Shape1.Left - 15
      else if Key = vk_right
      then
        Shape1.Left := Shape1.Left + 15;
    end;

  procedure TForm1.FormKeyPress( Sender : TObject; var Key : Char );
    begin
      if Key = 's'
      then
        Shape2.top := Shape2.top - 15
      else if Key = 'x'
      then
        Shape2.top := Shape2.top + 15;
      if Key = 'a'
      then
        Shape2.Left := Shape2.Left - 15
      else if Key = 'd'
      then
        Shape2.Left := Shape2.Left + 15;
    end;

  procedure TForm1.Start1Click( Sender : TObject );
    begin
      with Form1 do
        horiz := 4;
      horiz2 := 4;
      vert := -2;
      Timer1.Enabled := true;
      Timer2.Enabled := false;
    end;

  procedure TForm1.Stop1Click( Sender : TObject );
    begin
      Timer1.Enabled := false;
      Timer2.Enabled := false;
      player1 := 0;
      player2 := 0;
    end;

  procedure TForm1.Exit1Click( Sender : TObject );
    begin
      Form1.Close;
    end;

  procedure TForm1.Player1name1Click( Sender : TObject );
    begin
      form2.visible := true;
    end;

  procedure TForm1.Player2name1Click( Sender : TObject );
    begin
      form3.visible := true;
    end;

  procedure TForm1.Pause1Click( Sender : TObject );
    begin
      Timer1.Enabled := false;
      Timer2.Enabled := false;

    end;

  procedure TForm1.NewGame1Click( Sender : TObject );
    begin
      player1 := 0;
      player2 := 0;
      Shape3.Left := 216;
      Shape3.top := 120;
      messagedlg( 'Get ready to play', mtinformation, [mbok], 0 );
      Timer1Timer( self );
    end;

  procedure TForm1.HighScores1Click( Sender : TObject );
    begin
      form4.visible := true;
    end;

  procedure TForm1.Author1Click( Sender : TObject );
    begin
      form5.visible := true;
    end;

  procedure TForm1.FormCreate( Sender : TObject );
    begin
      messagedlg( 'Get redy to play Martins Ping Pong Verion 1.0', mtinformation, [mbok], 0 );
      messagedlg( 'Remember it is first to 5 wins', mtinformation, [mbok], 0 );
    end;

  procedure TForm1.Howtoplay1Click( Sender : TObject );
    begin
      form6.visible := true;
    end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)

  Alt 14. Jan 2014, 18:35
Hallo-

Ich würde gerne helfen, aber um schonungslos ehrlich zu sein wird das etwas sehr schwierig: Das ist in der jetzigen Form nichts, was man bei sich auf die Schnelle nachstellen kann ohne ordentlich Zeit in die Hand zu nehmen: Was ist Unit2, Unit3, Unit4, ...? Die haben wir nicht.

Du arbeitest mit absoluten Werten, irgendwelche Shapes und Labels werden beispielsweise genau auf "216 Pixel neben dem linken Rand" gesetzt. Selbst wenn ich jetzt das Formular in Handarbeit nachbauen würde, kann ich mir nicht sicher sein, ob das überhaupt lauffähig ist.

Im Quelltext ist nichts kommentiert, niemand kann auf die Schnelle erkennen, wozu ein Shape1 oder Label3 gedacht ist.


1) Hast du versucht, mit dem Debugger einmal nachzuvollziehen, welche Werte du beim "Abprallen" erwartest und welche sie tatsächlich haben?
2) Kannst du einmal das Projekt zusammenstellen und als Archiv hochladen, sodass jeder es nachstellen kann wenn der Quelltext schon so... schwer nachzuvollziehen ist?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Bitte um Hilfe bei Programm (Pong-Spiel, funktioniert nicht korrekt)

  Alt 14. Jan 2014, 18:48
Um es mit anderen Worten zu sagen:

- eine halbwegs "ordentliche" Codeformatierung hilft enorm beim Verstehen von Code, vorallem was wie zusammengehört.
- und "sprechende" Namen für Komponenten helfen noch viel mehr, weil man dann weiß wofür die Komponente ist

Mit dem Debugger sollte man in Grundlegenden Dingen schon zurecht kommen und ihn vorallem vauch verwenden.
- was soll gemacht werden (das weiß man ja selber)
- was macht das Programm wirklich (das sieht man im Debugger)
- - Haltepunkte setzen
- - mit F7/F8 Schritt für Schritt den Code durchgehn
- - sich Werte von Variablen ansehen
Und mit dem Wissen kann man nun die gefundenen Fehler beheben.

Zitat:
Delphi-Quellcode:
procedure TForm1.Start1Click(Sender: TObject);
begin
 with form1 do
horiz:= 4;
horiz2:= 4;
vert:= -2;
timer1.Enabled:= true;
timer2.Enabled:= false;
end;
Delphi-Quellcode:
procedure TForm1.Start1Click(Sender: TObject);
begin
  with form1 do
    horiz:= 4;
  horiz2:= 4;
  vert:= -2;
  timer1.Enabled:= true;
  timer2.Enabled:= false;
end;
Das WITH gehört also nur zur ersten Variable.

Außerdem: Warum greifst du innerhalb von TForm1 auf die Form1?
Du bist ja schon da drin und mußt dir nicht nochmal die (eventuell sogar falsche) Referenz besorgen.
(vorallem wenn die TForm mehrfach erstellt wurde, steht in Form1 nicht unbedingt das, was man möchte)

Zitat:
Delphi-Quellcode:
if ((shape3.Left <= shape1.Left + shape1.width ) and (shape3.Top >= shape1.Top - 10) and (shape3.Top <= shape1.Top + shape1.Height))
then
direction:= 5;
if direction = 1 then
timer1.Enabled:= false;
timer2.Enabled:= true;
end;
Oder das aus Timer1Timer
Delphi-Quellcode:
  if ((shape3.Left <= shape1.Left + shape1.width ) and (shape3.Top >= shape1.Top - 10) and (shape3.Top <= shape1.Top + shape1.Height)) then
    direction:= 5;
  if direction = 1 then
    timer1.Enabled:= false;
  timer2.Enabled:= true;
end;
$2B or not $2B

Geändert von himitsu (14. Jan 2014 um 18:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.
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