Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Snake Spiel (https://www.delphipraxis.net/152558-snake-spiel.html)

Cueppi 27. Jun 2010 10:29


Snake Spiel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DelphiPraxis,

ich muss zum Abschluss dieses Schuljahres das Spiel Snake programmieren.
Jedoch habe ich noch einige Fragen!!


Ich weiß nicht ob ich die Klassen auslagern muss, wenn ja, könne mir da jemand helfen, da ich da erst am ende dran gedacht hab :(
und wie ihr merken werdet habe ich einen Sound eingefügt.
Ich möchte, das dieser Sound nur abgespielt wird, wenn man auf den "BtnStart" klickt, jedoch wird er jetzt abgespielt, wenn sich das Spiel öffnet.
Wenn ich den befehl zum abspielen in die procedure von "BtnStart" lege, wird der Sound zwar beim klicken auf den Button abgespielt, jedoch auch wenn ich die anderen Buttons anklicke.
Ich möchte aber das der Sound nur abgespielt wird, wenn der StartButton angeklickt wird!

Ich bitte um dringende Hilfe ! :)

Mfg.

Cueppi

P.S: Datei ist im Anhang :)
Danke für die super Hilfe hier!!!!

haentschman 27. Jun 2010 10:37

AW: Snake Spiel
 
Hallo und willkommen in der DP... :dp:

sei doch bitte so nett und hänge die PAS und einen Screenshot an deinen Beitrag an. Bei so einem Download weiß man nie was man bekommt :zwinker:

...dann wirst du hier geholfen. :zwinker:

DeddyH 27. Jun 2010 10:38

AW: Snake Spiel
 
Hallo und Willkommen in der DP :dp:,

Du kannst Dateien an Deinen Beitrag anhängen, dann bleiben Sie uns auch erhalten, was bei externen Links nicht immer der Fall ist. Und ich verstehe Dein Problem nicht ganz: pack den Befehl zum Sound abspielen doch einfach ins OnClick des Buttons.

Cueppi 27. Jun 2010 10:42

AW: Snake Spiel
 
Datei ist im anhang ! :)

danke!!!!

ja habe ich versucht, dann spielt der trotzdem immer ab.
Moment:
Delphi-Quellcode:
procedure TForm1.BtnStartClick(Sender: TObject);
 var
  X, Y: Integer;
  begin
     BtnStart.Enabled := False;
     PunkteZaehler:= 0;
     for X:=0 to BSB do
     for Y:=0 to HSB do
     map[X, Y] := 0;
     kopf := Point(1, 1);
     laengesnake := 3;
     richtung := Point(0, 1);
     map[kopf.X, kopf.Y] := laengesnake;
     neuesfressen;
     bewegungSchlange;
     AktiviereButtons(True);
     ende := False;
     Timer1.Enabled := True;
     Startbild.Visible:=false;
     ZPunkte.Visible:=true;
     APunkte.Visible:=true;
     BtnHoch.Visible:=True;
     BtnLinks.Visible:=True;
     BtnRechts.Visible:=True;
     BtnUnten.Visible:=True;
PlaySOUND(PChar('.\Rattlesnakerattle.wav'),hInstance,snd_ASync );
  end;
sonst wüsste ich leider nicht was ihr jetzt meint :(

DeddyH 27. Jun 2010 10:44

AW: Snake Spiel
 
Wie ich schon sagte: nimm das PlaySound aus dem OnCreate raus und pack es ins OnClick des Startbuttons.

Cueppi 27. Jun 2010 10:48

AW: Snake Spiel
 
bleib trotzdem so :(
ich hab es aus dem Oncreate in den OnBtnStart getan, jetzt spielt der das immer ab :(

DeddyH 27. Jun 2010 10:50

AW: Snake Spiel
 
:?: Häng doch mal die aktuelle *.pas an.

Cueppi 27. Jun 2010 10:53

AW: Snake Spiel
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier ;)

DeddyH 27. Jun 2010 10:57

AW: Snake Spiel
 
Bei mir wird der Sound nur einmal abgespielt, wenn ich den Button betätige, also wie gewollt.

haentschman 27. Jun 2010 11:04

AW: Snake Spiel
 
der Sound wird abgespielt beim Start und beim Beenden, weil du in der BtnBeendenClick BtnStart.Click aufrufst. Ich gehe davon aus, daß du damit wieder neu initialisieren möchtest. Lagere die Initialisierung in eine eigene Prozedure aus und rufe diese explizit auf. Dann ist auch der Sound aus dem Beenden weg.

PS: ich glaube, daß in der
Delphi-Quellcode:
procedure TForm1.BtnBeendenClick(Sender: TObject);
begin
  if (BtnStart.Enabled =false)
    then timer1.Enabled:=false
  else if (MessageBox(0,'Schon fertig gezockt ?!?! // Good Bye :-)' ,'Spielende' ,
  MB_YESNO + MB_ICONQUESTION )=IDYES)then close; BtnStart.click;
   if (BtnStart.Enabled =false)
    then timer1.Enabled:=false;
  IF (MessageBox(0, 'Wiederholen ??', 'Spielende', MB_YESNO + MB_ICONQUESTION )=IDNO)
then BtnStart.Click;
   if (BtnStart.Enabled =false)
    then timer1.Enabled:=false;
    //showMessage ('Schon fertig gezockt ?!?! // Good Bye :-)');
  if (BtnStart.Enabled =false)
  then timer1.Enabled:=false;
if (BtnStart.Enabled =true)
then close;
    BtnStart.Enabled:=true;
...ein paar begin / end fehlen oder zumindest durch die Formatierung nicht zu erkennen ist, wie der Ablauf wirklich sein soll.

Cueppi 27. Jun 2010 11:08

AW: Snake Spiel
 
ich guck mal mit den begin und end ;)

können sie mir dann einen kleinen tipp geben, wie ich das asulager `?

DeddyH 27. Jun 2010 11:11

AW: Snake Spiel
 
Was auslagern?

[edit] BTW: Deine Codeformatierung ist sagen wir mal "kreativ", da müsste etwas mehr Ordnung rein. [/edit]

haentschman 27. Jun 2010 11:11

AW: Snake Spiel
 
Delphi-Quellcode:
procedure TForm1.Initialisierung;
 var
  X, Y: Integer;
  begin
     BtnStart.Enabled := False;
     PunkteZaehler:= 0;
     for X:=0 to BSB do
     for Y:=0 to HSB do
     map[X, Y] := 0;
     kopf := Point(1, 1);
     laengesnake := 3;
     richtung := Point(0, 1);
     map[kopf.X, kopf.Y] := laengesnake;
     neuesfressen;
     bewegungSchlange;
     AktiviereButtons(True);
     ende := False;
     Timer1.Enabled := True;
     Startbild.Visible:=false;
     ZPunkte.Visible:=true;
     APunkte.Visible:=true;
     BtnHoch.Visible:=True;
     BtnLinks.Visible:=True;
     BtnRechts.Visible:=True;
     BtnUnten.Visible:=True;
  end;
Delphi-Quellcode:
procedure TForm1.BtnStartClick(Sender: TObject);
  begin
    Initialisierung;
    PlaySOUND(PChar('.\Rattlesnakerattle.wav'),hInstance,snd_ASync );
  end;
Delphi-Quellcode:
procedure TForm1.BtnBeendenClick(Sender: TObject);
begin
  if (BtnStart.Enabled =false)
    then timer1.Enabled:=false
  else if (MessageBox(0,'Schon fertig gezockt ?!?! // Good Bye :-)' ,'Spielende' ,
  MB_YESNO + MB_ICONQUESTION )=IDYES)then close; Initialisierung;
   if (BtnStart.Enabled =false)
    then timer1.Enabled:=false;
  IF (MessageBox(0, 'Wiederholen ??', 'Spielende', MB_YESNO + MB_ICONQUESTION )=IDNO)
then Initialisierung;
   if (BtnStart.Enabled =false)
    then timer1.Enabled:=false;
    //showMessage ('Schon fertig gezockt ?!?! // Good Bye :-)');
  if (BtnStart.Enabled =false)
  then timer1.Enabled:=false;
if (BtnStart.Enabled =true)
then close;
    BtnStart.Enabled:=true;

Cueppi 27. Jun 2010 11:13

AW: Snake Spiel
 
ja also :

"der Sound wird abgespielt beim Start und beim Beenden, weil du in der BtnBeendenClick BtnStart.Click aufrufst. Ich gehe davon aus, daß du damit wieder neu initialisieren möchtest. Lagere die Initialisierung in eine eigene Prozedure aus und rufe diese explizit auf. Dann ist auch der Sound aus dem Beenden weg. "

das :D

DeddyH 27. Jun 2010 11:13

AW: Snake Spiel
 
Achso, siehe Beitrag 13.

Cueppi 27. Jun 2010 11:17

AW: Snake Spiel
 
jetzt meckert das Programm:

Nicht deklarierter Begriff in zeile 237 - 257 :(

haentschman 27. Jun 2010 11:18

AW: Snake Spiel
 
du mußt natürlich die procedure noch unter private deklarieren... :zwinker:
Delphi-Quellcode:
private
    { Private-Deklarationen }
    map: Array [0..BSB] of Array [0..HSB] of Integer;
    kopf,
    richtung,
    fressen: TPoint;
    LaengeSnake: Integer;
    PunkteZaehler: Integer;
    ende: Boolean;


    procedure AktiviereButtons(status: Boolean);
    procedure FarbeSpielfeld;
    procedure BewegungSchlange;
    procedure NeuesFressen;
    procedure SpielEnde;
    procedure Initialisierung;

  public

DeddyH 27. Jun 2010 11:19

AW: Snake Spiel
 
Stimmt, das muss auch eine Methode sein. Schreib also mal
Delphi-Quellcode:
procedure Initialisierung;
in den private-Abschnitt des Formulars und im implementation-Teil dann
Delphi-Quellcode:
procedure TForm1.Initialisierung;
begin
  //hier der Code
end;

Cueppi 27. Jun 2010 11:33

AW: Snake Spiel
 
es läuft alles wie gewünscht!
super danke :):):)
aber noch zwei fragen:

wie würdet ihr das denn "aufräumen" also, weil eben ja gesagt wurde, das ich sehr kreativ programmiert hab :(

und, ich möchte die schlange mit den Pfeiltasten & "W,A,S,D" steuern können, was muss ich dafür programmieren ??

Cueppi 27. Jun 2010 11:36

AW: Snake Spiel
 
Liste der Anhänge anzeigen (Anzahl: 1)
die fertige Datei :)

DeddyH 27. Jun 2010 11:37

AW: Snake Spiel
 
Setz die KeyPreview-Eigenschaft des Forms auf true, dann kannst Du im OnKeyPress die entsprechende Taste abfragen und darauf reagieren. Und zur Formatierung: irgendwo hier im Forum ist der Styleguide verlinkt, an den sollte man sich weitestgehend halten.

[edit] Link gefunden: http://edn.embarcadero.com/article/10280 [/edit]

haentschman 27. Jun 2010 11:38

AW: Snake Spiel
 
gaaaanz laaaangsam... :zwinker:

Fang einfach mal damit an, den Quellcode vernünftig einzurücken und vor allem keine 2 Anweisungen in die gleiche Zeile.

Cueppi 27. Jun 2010 12:27

AW: Snake Spiel
 
so mal etwas aufgeräumt :)

ich hab das in der mainform auf true gesetzt, nur die frage ist, wie die procedure heißt und geschrieben wird :O

ich kenn mich damit garnicht aus :(
wie ihr merkt ich bin relativ neu in delphi :)

DeddyH 27. Jun 2010 12:35

AW: Snake Spiel
 
Klick auf das Form und setze im Objektinspektor KeyPreview auf true. Dann wechselst Du zu den Ereignissen und gehst zu "OnKeyPress". Im Code dazu könntest Du dann so etwas machen (ganz einfache Variante, schöner wären eigene Methoden):
Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    'a','A': BtnLinks.Click;
    'd','D': BtnRechts.Click;
    's','S': BtnUnten.Click;
    'w','W': BtnHoch.Click;
  end;
end;

Cueppi 27. Jun 2010 12:37

AW: Snake Spiel
 
mir fällt grade auf :(

Wenn man auf den beendenbutton klickt, wenn das spiel NICHT läuft, hat man die auswahlt zwischen weiter im programm bleiben und dem programm verlassen.
Wenn ich auf programm verlassen gehe, verlässt er das programm!
Jedoch wenn ich auf "nein im programm bleiben" klicke, kommt die "wiederholen ?" anfrage wieder :(
die muss da noch weg ...
die wiederholen anfrage soll nur kommen, wenn das spiel am laufen ist und ich es stoppen möchte..

hiillfe

haentschman 27. Jun 2010 12:37

AW: Snake Spiel
 
Zitat:

Zitat von Cueppi (Beitrag 1031855)
so mal etwas aufgeräumt :)

ich hab das in der mainform auf true gesetzt, nur die frage ist, wie die procedure heißt und geschrieben wird :O

ich kenn mich damit garnicht aus :(
wie ihr merkt ich bin relativ neu in delphi :)

:gruebel: dann stellt sich mir dann doch die Frage wie du den Quelltext des Programmes hinbekommen hast. Denn dieser beinhaltet noch schwierigere "Teile"

Cueppi 27. Jun 2010 12:44

AW: Snake Spiel
 
viiel viiel tüffteln.
ich glaub ich sitz 20 stunden an dem projekt.
ich hab mich vertan.
man muss ja nichts schreiben, hab das mit den ereignissen überlesen :-[

Cueppi 27. Jun 2010 14:24

AW: Snake Spiel
 
Nochmal kurz :D

Mir fiel auf, die Schlange startete immer oben Links, das habe ich geändert :)
(kopf := Point(Random(BSB), Random(HSB));)

Jedoch startet sie auch immer nur in Richtung unten!!
Das möchte ich auch unterschiedlich haben ...

vorschläge ?

Delphi-Quellcode:
procedure TForm1.Initialisierung;
 var
  X, Y: Integer;
  begin
     BtnStart.Enabled := False;
     PunkteZaehler:= 0;
     for X:=0 to BSB do
     for Y:=0 to HSB do
     map[X, Y] := 0;
     kopf := Point(Random(BSB), Random(HSB));
     laengesnake := 4;
     richtung := Point(0, 1);
     map[kopf.X, kopf.Y] := laengesnake;
     neuesfressen;
     bewegungSchlange;
     AktiviereButtons(True
     ende := False;
     Timer1.Enabled := True;
     Startbild.Visible:=false;
     ZPunkte.Visible:=true;
     APunkte.Visible:=true;
     BtnHoch.Visible:=True;
     BtnLinks.Visible:=True;
     BtnRechts.Visible:=True;
     BtnUnten.Visible:=True;
  end;

himitsu 27. Jun 2010 15:11

AW: Snake Spiel
 
Dann wirst du wohl auch "richtung" ändern müssen?

Cueppi 27. Jun 2010 17:00

AW: Snake Spiel
 
und wie ?

Matze 27. Jun 2010 17:05

AW: Snake Spiel
 
Zitat:

Zitat von Cueppi (Beitrag 1031890)
und wie ?

Zitat:

Zitat von Cueppi (Beitrag 1031868)
Delphi-Quellcode:
// ...

kopf := Point(Random(BSB), Random(HSB));

// ...

richtung := Point(0, 1);

Da hast du's doch ganz ähnlich gemacht bzw. irgendwo her kopiert.
Langsam zweifle ich, dass du da viel selbst gemacht, geschweige denn verstanden hast.

Cueppi 27. Jun 2010 17:20

AW: Snake Spiel
 
ja super clevere aussage!

Delphi-Quellcode:
begin
     BtnStart.Enabled := False;
     PunkteZaehler:= 0;
     for X:=0 to BSB do
     for Y:=0 to HSB do
     map[X, Y] := 0;
     Kopf:= Point(Random(BSB), Random(HSB));
     laengesnake := 4;
     richtung := Point( 0, 1);
     map[kopf.X, kopf.Y] := laengesnake;
     neuesfressen;
     bewegungSchlange;
     AktiviereButtons(True);
hab ich da stehen!
Wenn ich

Delphi-Quellcode:
begin
     BtnStart.Enabled := False;
     PunkteZaehler:= 0;
     for X:=0 to BSB do
     for Y:=0 to HSB do
     map[X, Y] := 0;
     Kopf:= Point(Random(BSB), Random(HSB));
     laengesnake := 4;
     richtung := Point(Random(BSB), Random(HSB));
     map[kopf.X, kopf.Y] := laengesnake;
     neuesfressen;
     bewegungSchlange;
     AktiviereButtons(True);
also bei richtung auch änder, dann flipt mir die schlange rum und das programm beendet sich!!!

Matze 27. Jun 2010 17:32

AW: Snake Spiel
 
Ich weiß nicht, was HSB und BSB sind. Du musst natürlich dafür sorgen, dass nur Werte zwischen 0 und 1 heraus kommen (evtl. auch negativ), falls das dein Problem sein sollte.

Cueppi 27. Jun 2010 17:44

AW: Snake Spiel
 
HSB = Höhe des Bereichs
BSB = Breite des Bereichs

also das Spielfeld ist gemeint

Matze 27. Jun 2010 17:45

AW: Snake Spiel
 
Eben.

DeddyH 27. Jun 2010 17:45

AW: Snake Spiel
 
Wenn Du wirklich so viel getüftelt hast, wirst Du Deinen eigenen Quelltext ja wohl am ehesten verstehen und wissen, was Du wieso gemacht hast. Für uns als Außenstehende ist das ungleich schwieriger.

Cueppi 27. Jun 2010 17:55

AW: Snake Spiel
 
also, HSB & BSB sind 35 Felder groß! ( 0 -34)
Das Raster ist in 10 eingeteilt.

Mein problem besteht nur darin, das die schlange immer nach unten startet.
Sie soll nur immer unterschiedlich starten(mal rechts, mal links...)

//Kopf:= Point(Random(BSB), Random(HSB));
Die Position des Kopf's auf der Map ist zufällig.

//richtung := Point( 0, 1);
Die Startrichtung der Schlange ist x(BSB) =0, da x=0 keine bewegung nach links, rechts!
Die Startrichtung der Schlange ist y(HSB) =1, also startet in richtung Y-Achse, also nach unten!!!

Das möchte ich nicht mehr haben.
Der zufallsbefehl ist "Random" aaaaaaaber wenn ich den einfüge, flippt mir die schalnge rum und das spiel wird beendet :(

ich weiß doch selber nicht weiter :(
Ich bin neu in Delphi, habe selber noch Probleme.
Ich habe es mit einem Tutorial eines Freundes gemacht..

DeddyH 27. Jun 2010 17:58

AW: Snake Spiel
 
Das ist nicht ganz so trivial. Wenn der Kopf zufällig irgendwo auf dem Spielfeld auftauchen darf, musst Du zunächst prüfen, ob sie in irgendeiner Richtung bereits so nah am Rand ist, dass ein Spiel gar nicht möglich ist und ggf. die Richtung korrigieren.

Cueppi 27. Jun 2010 18:02

AW: Snake Spiel
 
ja das weiß ich auch.

diese Prüfung habe ich versucht, nicht hinbekommen :(

Matze 27. Jun 2010 18:07

AW: Snake Spiel
 
Zeige uns doch mal deinen Versuch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.
Seite 1 von 2  1 2      

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