![]() |
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:
/EDIT:
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; 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. |
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])); |
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-) |
AW: Snake - Ein Problem mit dynamischen Arrays
Wer High() sagt kann/sollte auch Low() sagen
|
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 |
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.
|
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.
|
AW: Snake - Ein Problem mit dynamischen Arrays
Zitat:
|
AW: Snake - Ein Problem mit dynamischen Arrays
Zitat:
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 |
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 08:29 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