AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Snake - Ein Problem mit dynamischen Arrays

Ein Thema von MrMooed · begonnen am 3. Apr 2012 · letzter Beitrag vom 11. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 3. Apr 2012, 21:00
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]));
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

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

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 3. Apr 2012, 22:05
Jau so funktioniert das ganze

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

Vielen Dank nocheinmal. Bei Interesse würde ich den Programmcode noch etwas aufhübschen und dann hier hochladen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.867 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 3. Apr 2012, 22:34
Wer High() sagt kann/sollte auch Low() sagen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

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

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 3. Apr 2012, 22:52
'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

MfG
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.867 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 3. Apr 2012, 22:57
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 17:40
Statt

KO_Schlange[0,0] := KO_Schlange[0,0] -22
würde ich dec(KO_Schlange[0,0],22) verwenden, zumindest ausprobieren, analog bei den anderen Arrayelementen. Ist kürzer und ein wenig "gehobener".

Deine Fehler sind für mich allein aus der Quelltextbetrachtung nicht nachvollziehbar. Ob dynamische Arrays intern "verzeigert" sind, ist mir nicht bekannt (zumindest gibt der Debugger keine Speicheradressen, sondern Variableninhalte aus), doch selbst wenn, daran können Deine Probleme m.E. nicht liegen. Ich würde an Deiner Stelle - rein aus Interesse - mit dem internen bzw. integrierten Debugger der Sache auf den Grund zu gehen versuchen.
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

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

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 18:01
[..] würde ich dec(KO_Schlange[0,0],22) verwenden, zumindest ausprobieren, analog bei den anderen Arrayelementen. Ist kürzer und ein wenig "gehobener".
Danke für den Tipp, doch ist es nicht so, dass Dec(X) den Wert um eins erniedrigt ? Wenn dem so ist, ist diese Funktion leider unbrauchbar für mich denn ich will die Schlange ja nicht nur um einen Pixel immer verschieben.

Und was den Debugger anbelangt: Kenne mich mit dem nicht so wirklich aus wenn es sich um dieses Schritt für Schritt ausführen handelt, das man mit F7 Startet, dann habe ich es schon getestet. Dabei habe ich festgestellt, dass das Array genau so verschoben wird, wie ich es haben will. Allerdings kommt dann bei der neuen Wertzuweisung der Fehler: beide werden verändert und nicht nur die Werte an Stelle [0] (so kam ich ja auf die Idee, dass es sich bei dyn. Arrays um Zeiger handelt, und er somit 2mal mit den selben Werten arbeitet. )

What ever. Da ich Notgedrungen (Bluescreen ) eh alles neu machen darf, werde ich mich mal um die Version mit einer "Karte" kümmern. Vllt kommt mir ja noch eine Idee
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 18:03

Danke für den Tipp, doch ist es nicht so, dass Dec(X) den Wert um eins erniedrigt ? Wenn dem so ist, ist diese Funktion leider unbrauchbar für mich denn ich will die Schlange ja nicht nur um einen Pixel immer verschieben.
Nein, du kannst auch den Schritt angeben, siehe hier.
Coffeecoder
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

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

AW: Snake - Ein Problem mit dynamischen Arrays

  Alt 4. Apr 2012, 18:26
Soso ständig lernt man mehr

Eine weitere Idee war zur Bewegung: Könnte man es mit einem Try .. exept Block lösen ? Wenn sich die Schlange nun aus dem Spielfeld beweg, also aus dem Bereich des Arrays, würde dies ja zu einer Zugriffsverletzung im Speicher führen. Wenn man ihm aber sagt, dass er dann (exept) ein Leben (oder was auch immer) abziehen soll und die Schlange neu positioniert, wäre doch alles in Ordnung oder ?

Hoffe ihr versteht, was ich meine
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 21:59 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 by Thomas Breitkreuz