Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Snake - Ein Problem mit dynamischen Arrays (https://www.delphipraxis.net/167525-snake-ein-problem-mit-dynamischen-arrays.html)

MrMooed 3. Apr 2012 18:11


Snake - Ein Problem mit dynamischen Arrays
 
Hallo DPler,

Da ich nun Schulferien habe, dachte ich mir, dass ich mal etwas größeres in Angriff nehmen könnte. Gesagt Getan :lol: die Idee war ein Snake Spiel zue porgrammieren (Ja ich komme gleich zu meinem Problem, will nur meinen Gedankengang klar machen :roll: ) Jedenfalls hatten wir gerade in der Schule Arrays. Da mir der Stoff in der Schule nie wirkliche Probleme bereitet, habe ich mich auch diesmal etwas intensiever mit dem Thema befasst und mir neben statischen Arrays nun auch dynamische angesehen.

Nun zu meinem eigentlichen Problem bei Snake:
Ich hatte mir gedacht, dass die Schlange (frei erfunden) aus 5 Stücken besteht. jedes dieser Stücke soll als ein Rechteck auf einer PainBox gezeichnet werden. D.h. in dem dyn. Array muss es an jeder Stelle 4 Integer Werte geben für Canvas.RectAngle(X1,Y1,X2,Y2). Soweit so gut. Zur Bewegung habe ich mir gedacht, dass das Array um eins nach hinten verschoben wird (der letzte Wert soll bewusst verloren gehen) so entsteht an der ersten Stelle ein Doppelter wert, in dem dann die neue Position des ersten Vierecks gespeichert werden soll. Dort möchte ich dann den doppelten wert nehmen, und dann z.B. in die X-Richtung (also nach Rechts) 10 Addieren. Somit würde das Viereck dann 10 Pixel neben dem zweiten liegen. Das ganze geschieht bei mir in dem OnTimer Event eines Timers.

Und Delphi (bzw. ich :oops:) kriege es nicht gebacken. Warum auch immer ändert er Array[0] UND Array[1] So hat er natürlich spätestens nach 5 durchläufen überall die gleichen Koordinaten.

Wäre nett, wenn jemand meine Gedankengang nachvollziehen konnte und mir vllt. sagen kann wo mein Fehler im Kopf und/ oder der Programmierung liegt :)

Delphi-Quellcode:
procedure TForm1.Bewegen(Sender: TObject);
var
  i: integer;
begin
  // Array nach hinten verschieben, so dass die ersten beiden Werte gleich sind
  for i:=High(KO_Schlange) downto 1 do
    KO_Schlange[i] := KO_Schlange[i-1];
  // gucken in Welche Richtung sich die schlange bewegen soll, und dann dementsprechend
  // die Koordinaten des ersten Vierecks ändern (KO_Schlange[0,XXX])
  Case Richtung of
    0: begin
         KO_Schlange[0,0] := KO_Schlange[0,0] -22;
         KO_Schlange[0,2] := KO_Schlange[0,2] -22;
       end;
    1: begin
         KO_Schlange[0,1] := KO_Schlange[0,1] -22;
         KO_Schlange[0,3] := KO_Schlange[0,3] -22;
       end;
    2: begin
         KO_Schlange[0,0] := KO_Schlange[0,0] +22;
         KO_Schlange[0,2] := KO_Schlange[0,2] +22;
       end;
    3: begin
         KO_Schlange[0,1] := KO_Schlange[0,1] +22;
         KO_Schlange[0,3] := KO_Schlange[0,3] +22;
       end;
    end;
  ZeichneSchlange;
end;
/EDIT:
Kann es sein, dass dyn. Arrays nicht die Werte enthalten sondern nur Zeiger ? (sorry wenn es tatsächlich so ist, aber von Zeigern/ etc. hat noch nie ein Infolehrer geredet..) das würde erklären warum immer die Teile vom Array geändert werden, die die selben Werte/ Zeiger besitzen. Denn am Ende würden dann alle auf den einen Wert im Speicher zeigen mit dem dann gerechnet wird.
War nur eine Idee die mir gerade noch gekommen ist.

Aphton 3. Apr 2012 20:00

AW: Snake - Ein Problem mit dynamischen Arrays
 
Ist ne interessante Vermutung. Bei soetwas weiß ich auch nie auf Anhieb, obs der Fall ist - einfach testen.

Sicherheitshalber kannste ja den Inhalt des Arrays "manuell" rüberkopieren
Delphi-Quellcode:
  for i:=High(KO_Schlange) downto 1 do
    Move(KO_Schlange[i-1,0], KO_Schlange[i,0], Length(KO_Schlange[i]) * sizeof(KO_Schlange[i,0]));

MrMooed 3. Apr 2012 21:05

AW: Snake - Ein Problem mit dynamischen Arrays
 
Jau so funktioniert das ganze :D

Danke dir Aphton. Schade, dass einem sowas in der Schule nicht vermittelt/ erklärt wird. Das einzige mal das ich von so einer Unterscheidung gehört habe war hier bzw. in anderen Delphi-Foren. Aber das Thema Schulbildung etc. ist ein gänzlich anderes Thema :roll:

Vielen Dank nocheinmal. Bei Interesse würde ich den Programmcode noch etwas aufhübschen und dann hier hochladen 8-)

mkinzler 3. Apr 2012 21:34

AW: Snake - Ein Problem mit dynamischen Arrays
 
Wer High() sagt kann/sollte auch Low() sagen

MrMooed 3. Apr 2012 21:52

AW: Snake - Ein Problem mit dynamischen Arrays
 
'Nabend

Ist das nicht letztendlich Jacke wie Hose ob ich nun downto Low(Array)+1 oder einfach nur downto 1 schreibe ? Oder verbirgt sich da ein Vorteil den ich bloß nicht sehe ?
Wenn dem so ist werde ich mir diese Schreibweise mal eineignen. Wobei Komplizierter = cooler ist :lol:

MfG

mkinzler 3. Apr 2012 21:57

AW: Snake - Ein Problem mit dynamischen Arrays
 
Bei einem dynamischen Array ist es Strump wie Socke, da hast du recht. Wenn es sich aber um eine statischenn Array handeln würde, würde der Code mit High()/Low() funktionieren, der mit einer festen Grenze aber nicht.

Popov 3. Apr 2012 22:46

AW: Snake - Ein Problem mit dynamischen Arrays
 
Wobei sich die Frage stellt warum überhaupt ein Array für Snake? Ich habe vor einiger Zeit mal just4fun Snake geprogt, nur um zu sehen wie schnell ich so ein Game hinkriege, und dabei ist es mir aufgefallen, dass es Quatsch ist ein Array für Snake zu nehmen. Ich schätze man nimmt es weil es im ersten Moment logisch erscheint. Aber wenn man genau drüber nachdenkt, dann ist ein Array für Snake doppeltgemoppelt.

Coffeecoder 4. Apr 2012 07:35

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von Popov (Beitrag 1160069)
Wobei sich die Frage stellt warum überhaupt ein Array für Snake? Ich habe vor einiger Zeit mal just4fun Snake geprogt, nur um zu sehen wie schnell ich so ein Game hinkriege, und dabei ist es mir aufgefallen, dass es Quatsch ist ein Array für Snake zu nehmen. Ich schätze man nimmt es weil es im ersten Moment logisch erscheint. Aber wenn man genau drüber nachdenkt, dann ist ein Array für Snake doppeltgemoppelt.

In der Tat. Ich bin gerade selbst dabei ein Snake zu proggen (zwar in Java). Da ist mein "Snake" selbst das "Array", in dem Point als Koordinaten (Körper der Schlange) beinhaltet.

MrMooed 4. Apr 2012 09:11

AW: Snake - Ein Problem mit dynamischen Arrays
 
Zitat:

Zitat von Coffeecoder (Beitrag 1160085)
In der Tat. Ich bin gerade selbst dabei ein Snake zu proggen (zwar in Java). Da ist mein "Snake" selbst das "Array", in dem Point als Koordinaten (Körper der Schlange) beinhaltet.

Also würdest du alle Koordinaten (sei es nun die der Schlange als auch die der Äpfel/ Münzen) in einem Array Speichern ? Hmm eigentlich wäre das wirklich sinnvoller :x Werde das ganze dann wohl nochmal überarbeiten. Trotzdem vielen Dank für die Anregungen :thumb:

Zu allem Überfluss ist mein Laptop mit nem Bluescreen sbgeschmiert und hat das komplette Delphi Projekt zerschossen. Exakt in dem Moment, in dem ich auf Speichern geklickt habe :evil: auf ein neues

Coffeecoder 4. Apr 2012 09:36

AW: Snake - Ein Problem mit dynamischen Arrays
 
Wenn ich zuhause bei meinem Rechner sitze kann ich vielleicht einen kleinen Einblick geben ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.
Seite 1 von 4  1 23     Letzte »    

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