![]() |
Ping Pong Programm - Punktescore, Game Over und Start/Stopp
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ich muss für meinen Info Lehrer ein ping Pong programm schreiben und bin relativ weit gekommen, hänge jetzt aber an 3 Punkten:
Delphi-Quellcode:
Anbei hänge ich noch n Bild von der Oberfläche an.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Timer1: TTimer; Panel: TPanel; Background: TImage; SPlayer: TImage; Infopanel: TPanel; PMenu: TPanel; LScore: TLabel; SBall: TShape; PStartStop: TPanel; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure PMenuClick(Sender: TObject); procedure PStartStopClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; PosX, PosY, X, Y, Punktescore: Integer; implementation uses Unit2, Unit4; {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Punktescore:=0; randomize; PosX:=200; PosY:=208; X:=2; Y:=3; end; procedure TForm1.Timer1Timer(Sender: TObject); Var Overlay: Trect; begin //Bewegung PosX:=PosX+X; PosY:=PosY+Y; //Seitenwände If PosX>Panel.width - SBall.width then X:=-X; If PosX< 0 then X:=-X; //Obere und Untere Wand If PosY>Panel.height - SBall.height then Y:=-Y; If PosY< 0 then Y:=-Y; SBall.left:=round(PosX); SBall.Top:=round(posY); //Ball trifft Schläger If intersectrect (Overlay, SPlayer.BoundsRect, SBall.BoundsRect) then begin X:=-X-random(2); Y:=-Y-random(2); end; If SBall.Top=SPlayer.Top-SBall.Top then begin LScore.caption:=IntToStr((Punktescore)+1); end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = VK_ESCAPE then halt; if key = VK_Left then SPlayer.left:= SPlayer.Left-13; if key = VK_Right then SPlayer.left:= SPlayer.left+13; end; procedure TForm1.PMenuClick(Sender: TObject); begin form1.close; form2.show end; procedure TForm1.PStartStopClick(Sender: TObject); begin Timer1.Enabled := not Timer1.Enabled; end; end. Anhang 41239 |
AW: Ping Pong Programm - Punktescore, Game Over und Start/Stopp
Wie soll da denn bitte etwas hochzähöen, wenn du den Wert von Punktescore nicht veränderst? :zwinker:
( immer wieder 0+1 ist und bleibt immer nur 1 ) Zitat:
und jetzt beantworte dir die Frage, ob hier sich hier etwas nur in Einerschritten bewegt. Und dann hab ich auch noch ein paar Fragen: Zitat:
Zitat:
Close der MainForm oder
Delphi-Quellcode:
.
Application.Terminate
Zitat:
Self verwenden, oder nichts angeben. (nichts = ein implizites Self) Zitat:
Es ist jetzt zwar bissl spät, aber ich versteh grade irgendwie nicht, was du da eigentlich prüfen willst. Hmmm, bissl die Gleichung umstellen ...
Delphi-Quellcode:
If SBall.Top = -SBall.Top + SPlayer.Top then
Delphi-Quellcode:
If SBall.Top * 2 = SPlayer.Top then
SPlayer.Top soll doppelt so groß sein, wie SBall.Top ? Und die Form1 ist doch die MainForm? (das die erste Form-Instanz, welche vom Delphi automatisch erstellt wird) Wenn ja, dann wird das so nicht funktionieren, denn siehe dem Punkt, wo es um das Beenden eines Programms geht. Was ein Debugger ist, das weißt du? Zitat:
Zitat:
Ach ja, ich sehe da mindestens noch ein 4. Problem. Tipp: Drücke mal ganz oft/lange auf die Pfeiltasten Links oder Rechts. |
AW: Ping Pong Programm - Punktescore, Game Over und Start/Stopp
Zum GameOver und Start/Stop:
Das ist doch Stati die das Programm einnehmen kann. Also erstelle dir eine Variable (bitte keine globale Variable, sondern erstelle die einfach im
Delphi-Quellcode:
Teil der Form-Klasse).
private
Möglichkeit 1:
Delphi-Quellcode:
Immer dann wenn du meinst du musst in einen anderen Status, dann trägst du das dort ein und dein Programm kann darauf reagieren.
const
GAME_START = 0; GAME_RUN = 1; GAME_OVER = 2; type TForm1 = class(TForm) ... private FGameState : integer; ... end; case FGameState of GAME_START : ; GAME_RUN : ; GAME_OVER : ; end; Möglichkeit 2:
Delphi-Quellcode:
Eigentlich gleiche Vorgehensweise wie in 1
type
TGameState = ( gsStart, gsRun, gsGameOver ); TForm1 = class(TForm) ... private FGameState : TGameState; ... end; case FGameState of gsStart : ; gsRun : ; gsGameOver : ; end; |
AW: Ping Pong Programm - Punktescore, Game Over und Start/Stopp
Was mir grade noch aufgefallen ist:
- Eigentlich heißt es hier "Eine Frage pro Thread". - Und wieso fragst du hier schonwieder nach dem "Punktescore", wo es dafür bereits einen Thread von dir gibt? Wenn es nicht funktioniert, dann hättest du dort nachfragen sollen, was du falsch machst. (vorallem da dort eigentlich schon eine Lösung steht) |
AW: Ping Pong Programm - Punktescore, Game Over und Start/Stopp
Paar Punkte die mir aufgefallen sind:
Du benutzt für Buttons TPanels. Ist nicht gut, aber ich glaube den Grund zu wissen - vermutlich geht es um den Fokus den TButton hält. Das Problem ist zwar lösbar, man kann aber auch TSpeedButtons nehmen (Register Zusätzlich). SpeedButtons haben kein Fokus, Problem gelöse, und es ist ein Button. Also ersetzten. So wie ich das erkenne ist Panel (Name) unter dem Image. Warum? Zumindest scheint das so zu sein. Ist es so?
Delphi-Quellcode:
Wieso nimmst du nicht das Image Background dafür? Hier eine Möglichkeit:
//Seitenwände
If PosX>Panel.width - SBall.width then X:=-X;
Delphi-Quellcode:
Ist es sinnvoll keine Reaktion auf fehlgeschlagenen Ball zu zeigen und nur Punkte zählen? Das wäre eine Möglichkeit - Ball startet von der Startposition (kann man auch weiter oben starten lassen):
//Seitenwände
//If PosX>Panel.width - SBall.width then if PosX>Background.Width - SBall.width then X:=-X; If PosX< 0 then X:=-X; //Obere und Untere Wand //If PosY>Panel.height - SBall.height then If PosY>Background.height - SBall.height then Y:=-Y;
Delphi-Quellcode:
Auf die glob. Variablen gehe ich nicht ein, aber wann stoppt das Spiel? Eine Möglichkeit:
//If SBall.Top=SPlayer.Top-SBall.Top then
If SBall.Top>SPlayer.Top then begin LScore.caption:=IntToStr((Punktescore)+1); PosX:=200; //Evtl. andere Werte PosY:=208; X:=2; Y:=3; end;
Delphi-Quellcode:
PosX, PosY, X, Y, Punktescore: Integer;
const MaxPunktescore = 5;
Delphi-Quellcode:
//If SBall.Top=SPlayer.Top-SBall.Top then
If SBall.Top>SPlayer.Top then begin Inc(Punktescore); LScore.caption:=IntToStr((Punktescore)+1); if Punktescore >= MaxPunktescore then begin PStartStopClick(nil); ShowMessage('GameOver'); Punktescore := 0; //oder Neustart end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz