Einzelnen Beitrag anzeigen

Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#1

Snake - Ein Problem mit dynamischen Arrays

  Alt 3. Apr 2012, 19:11
Hallo DPler,

Da ich nun Schulferien habe, dachte ich mir, dass ich mal etwas größeres in Angriff nehmen könnte. Gesagt Getan die Idee war ein Snake Spiel zue porgrammieren (Ja ich komme gleich zu meinem Problem, will nur meinen Gedankengang klar machen ) 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 ) 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.

Geändert von MrMooed ( 3. Apr 2012 um 19:20 Uhr)
  Mit Zitat antworten Zitat