Bewegungsalgorithmus für nen Snake-Klon

Daedalus

Midnight Stalker
Lang ists her als ich das letzte mal hier reingeschrieben habe... Naja, das ist nicht das Thema.
Ich mache mir momentan Gedanken darüber, wie ich einen einfachen Snake-Klon umsetzen soll. Ist an sich kein Problem, nur eine Stelle bringt mich ein wenig zum Nachdenken - Nämlich die Bewegung der Schlange. Meine Überlegung ist es, diese mit 3 Arrays zu realisieren. Einer für die x-Koordinaten jedes Schlangenfragments, eines für die y-Koordinaten, und das letzte ist einfach eine Liste, in der jede ausgeführte Bewegung (Oben, Unten, Rechts, Links) gespeichert ist. Natürlich werden nur so viele Bewegungen gespeichert wie die Schlange aus Teilen besteht.
Ich dachte mir das ich es wie folgt machen könnte... Die Schlange bewegt sich z.B. jede zweihundertstel Sekunde um eine Stelle weiter. Das heist wenn die aktuelle Richtung beispielweise nach Oben ist wird im Richtungs-Array zuerst alles um eine Stelle nach hinten verschoben und die aktuelle Bewegung (wie hier nach Oben) wird in die erste Position gespeichert. Jetzt wird die Bewegung abgewickelt... Dabei wird in einer Schleife in jedem Durchlauf ein Fragment genommen und je nach entsprechender Richtung verschoben. Das sieht dann beispielweise so aus: In der Schleife ist man momentan bei 3 angelangt, also wird erst mal nachgesehen welche Koordinaten dieses dritte Schlangenfragment hat und welches die dritte gespeicherte Bewegung ist. Dementsprechend wird das Stück der Schlange verschoben... Und so geschieht es halt mit jedem Teil der Schlange in der Schleife.
Sind alles flüchtige und theoretische Überlegungen, deshalb bin ich mir auch nicht sicher ob das so hinhauen wird. Die Durchführung ist ja wieder was ganz anderes... Also, wie würdet ihr es machen und was schlagt ihr mir vor?
 
Daedalus schrieb:
Lang ists her als ich das letzte mal hier reingeschrieben habe... Naja, das ist nicht das Thema.
Ich mache mir momentan Gedanken darüber, wie ich einen einfachen Snake-Klon umsetzen soll. Ist an sich kein Problem, nur eine Stelle bringt mich ein wenig zum Nachdenken - Nämlich die Bewegung der Schlange. Meine Überlegung ist es, diese mit 3 Arrays zu realisieren. Einer für die x-Koordinaten jedes Schlangenfragments, eines für die y-Koordinaten, und das letzte ist einfach eine Liste, in der jede ausgeführte Bewegung (Oben, Unten, Rechts, Links) gespeichert ist. Natürlich werden nur so viele Bewegungen gespeichert wie die Schlange aus Teilen besteht.
Ich dachte mir das ich es wie folgt machen könnte... Die Schlange bewegt sich z.B. jede zweihundertstel Sekunde um eine Stelle weiter. Das heist wenn die aktuelle Richtung beispielweise nach Oben ist wird im Richtungs-Array zuerst alles um eine Stelle nach hinten verschoben und die aktuelle Bewegung (wie hier nach Oben) wird in die erste Position gespeichert. Jetzt wird die Bewegung abgewickelt... Dabei wird in einer Schleife in jedem Durchlauf ein Fragment genommen und je nach entsprechender Richtung verschoben. Das sieht dann beispielweise so aus: In der Schleife ist man momentan bei 3 angelangt, also wird erst mal nachgesehen welche Koordinaten dieses dritte Schlangenfragment hat und welches die dritte gespeicherte Bewegung ist. Dementsprechend wird das Stück der Schlange verschoben... Und so geschieht es halt mit jedem Teil der Schlange in der Schleife.
Sind alles flüchtige und theoretische Überlegungen, deshalb bin ich mir auch nicht sicher ob das so hinhauen wird. Die Durchführung ist ja wieder was ganz anderes... Also, wie würdet ihr es machen und was schlagt ihr mir vor?

... sag doch erstmal, welche Programmiersprache du dafür verwenden möchtest. Da kann man sich besser "eindenken" ^_^
 
Ganz klar Delphi. Ist für mich momentan einfach am verständlichsten. Hab jetzt nen bissel mit dem Programmieren davon angefangen, allerdings kann ich schwer alles in meinem Kopf durchgehen, deshalb hab ich etwas Probleme was die Reihenfolge vom Code angeht... Und Konzepte anlegen - Bäh, mach ich nich, sollte ich mir bei sowas aber mal angewöhnen.
 
1. kA von delphi
aber: wenn du sowieso x und y speicherst brauchst du die richtungsaenderungen ja nicht mehr zu speichern.
am besten waere natuerlich eine verlinkte liste, weil du dann immer das erste argument vergessen kannst und einfach eins anhaengen (ein struct mit pointer auf ein struct derselben art, mit x und y halt) aber eben, kA wie und ob das in delphi geht.
 
Ich weis jetzt nicht direkt was du damit meinst, hab' von sowas noch nie gehört.
Aber das ich das Richtungs-Array nicht brauche ist mir auch gerade eingeleuchtet... Ich könnte doch die Koordinaten des jeweils vorigen Fragmentes speichern und dann das darauffolgende Fragment an diese Koordinaten bewegen, oder?
 
> Ich weis jetzt nicht direkt was du damit meinst, hab' von sowas noch nie gehört.

also eine datenstruktur ist wie eine klasse, aber ohne funktionen.
du kannst auch eine klasse nehmen, in der dann ein pointer auf
das naechste element ist. so z.B. steht im 1. objekt der pointer
auf das 2., und so weiter. wenn man dann einfach den pointer
des ersten mit dem des 2. ueberschreibt ist das 2. das erste etc...

> Ich könnte doch die Koordinaten des jeweils vorigen Fragmentes
> speichern und dann das darauffolgende Fragment an
> diese Koordinaten bewegen, oder?

hm ja so etwa aber das gibt dann ne menge funktionen die
aufgerufen werden wenn du bei jedem zug die ganzen arrays
umsortierst.
 
Hermi schrieb:
> Ich weis jetzt nicht direkt was du damit meinst, hab' von sowas noch nie gehört.

also eine datenstruktur ist wie eine klasse, aber ohne funktionen.
du kannst auch eine klasse nehmen, in der dann ein pointer auf
das naechste element ist. so z.B. steht im 1. objekt der pointer
auf das 2., und so weiter. wenn man dann einfach den pointer
des ersten mit dem des 2. ueberschreibt ist das 2. das erste etc...

> Ich könnte doch die Koordinaten des jeweils vorigen Fragmentes
> speichern und dann das darauffolgende Fragment an
> diese Koordinaten bewegen, oder?

hm ja so etwa aber das gibt dann ne menge funktionen die
aufgerufen werden wenn du bei jedem zug die ganzen arrays
umsortierst.

Hermi, es geht darum, dass er in Delphi programmiert und erst Anfänger ist ... da musst du nicht sofort mit objektorientierten Klassen oder irgendwelchen Speichermanipulationen ankommen!
 
Daedalus schrieb:
Ganz klar Delphi. Ist für mich momentan einfach am verständlichsten. Hab jetzt nen bissel mit dem Programmieren davon angefangen, allerdings kann ich schwer alles in meinem Kopf durchgehen, deshalb hab ich etwas Probleme was die Reihenfolge vom Code angeht... Und Konzepte anlegen - Bäh, mach ich nich, sollte ich mir bei sowas aber mal angewöhnen.

Nimm besser BlitzBasic.
 
Karateka3 schrieb:
Hermi, es geht darum, dass er in Delphi programmiert und erst Anfänger ist ... da musst du nicht sofort mit objektorientierten Klassen oder irgendwelchen Speichermanipulationen ankommen!

Was er meint weis ich schon, die Begriffe sind mir bekannt. Allerdings haste recht, ich bin noch nicht erfahren genug um mit Speicheradressen, Referenzen u.a. umgehen zu können. Wieso sollte mans sich so schwer machen, gibt doch auch leichtere Wege.

Karateka3 schrieb:
Nimm besser BlitzBasic.
Das werde ich in Erwägung ziehen, aber erstmal probier ich noch was mit Delphi rum, StringGrids sind einfach unheimlich komfortabel (Wenn auch nicht so schön... Die Cellmarkierung sieht dumm aus).
 
> Hermi, es geht darum, dass er in Delphi programmiert und
> erst Anfänger ist ...
> da musst du nicht sofort mit objektorientierten
> Klassen oder irgendwelchen Speichermanipulationen
> ankommen!

ach komm wennschon dennschon das ist ja wirklich nicht so schwer und
viel zu lernen. besonders fuer spieleprogrammierung.
 
> Allerdings haste recht, ich bin noch nicht erfahren
> genug um mit Speicheradressen, Referenzen u.a. umgehen zu können.

total einfach. du hast ne variable x, die wird irgendwo im
speicher gespeichert. dieser platz sein bekannt durch die
adresse, nennen wir sie A.

nun kann man auf die variable zugreiffen ueber ihren namen (x)
oder ihre adresse (a). mit speichern zu schaffen ist v.a. fuer
nicht-global-variabeln wichtig, oder wenn man in arrays aufs naechste
element will etc..

in C ist es so:
*A = x
und
&x = A
(der &operator gibt also die adresse einer variable wieder,
der *operator den an einer adresse gespeicherten wert.)
 
Vielen Dank für die Erklärung :) Wie sehen die Speicheradressen eigentlich aus, bzw in welcher Form sind sie dargestellt (also sind sie hexadezimal oder sowas)? Hab mich damit noch nicht wirklich beschäftigt...
Leider weis ich die entsprechenden Operatoren für Delphi nicht... Aber das lässt sich ja herausfinden.
 
Nightfall wrote:
> Vielen Dank für die Erklärung :)

np =)

> Wie sehen die Speicheradressen eigentlich aus,
> bzw in welcher Form sind sie dargestellt
> (also sind sie hexadezimal oder sowas)?

versuch mal ein ganz einfaches proggie mit int a;
a=&a;
ich glaubs hex.
 
Öhm... Um mal Back to Topic zu kommen...

Code:
procedure MoveSnake(curdirection: String);
var loop: Byte;
var tmpX, tmpY: Byte;
var TargetX, TargetY: Byte;
begin
if CurDirection='UP' then begin TargetY:=SnakePositionsY[0]-1; TargetX:=SnakePositionsX[0]; end
else if CurDirection='DOWN' then begin TargetY:=SnakePositionsY[0]+1; TargetX:=SnakePositionsX[0]; end
else if CurDirection='LEFT' then begin TargetY:=SnakePositionsY[0]; TargetX:=SnakePositionsX[0]-1; end
else if CurDirection='RIGHT' then begin TargetY:=SnakePositionsY[0]; TargetX:=SnakePositionsX[0]+1; end;
for loop:=0 to snakelength do
begin
  tmpX:=SnakePositionsX[loop];
  tmpY:=SnakePositionsY[loop];
  SnakePositionsX[loop]:=TargetX;
  SnakePositionsY[loop]:=TargetY;
  Form1.StringGrid1.Cells[TargetX,TargetY]:='O';
  Form1.StringGrid1.Cells[tmpX,tmpY]:='';
  TargetX:=tmpX;
  TargetY:=tmpY;
  if loop=snakelength then
  begin
    if tmpX<TargetX then lastdirection:='RIGHT';
    if tmpX>TargetX then lastdirection:='LEFT';
    if tmpY<TargetY then lastdirection:='DOWN';
    if tmpY>TargetY then lastdirection:='UP';
  end;
end;
end;

Habs getestet, so funktionierts... Die anderen Procedures und Codeabschnitte sind kein Problem, die brauch ich ja nich zu posten.
 
also ich hab sowas schon mal programmiert ^^ habs allerdings nur in basic code vorliegen :) für die bewegung der schlange hab ich insgesamt glaub ich nur ein array gebraucht ^^, allerdings ein zweidimensionales ;) in der form array(1000,10) die erste "zeile" des arrays hab ich für die x waerte genommen, die zweite für die y-werte und die dritte für richtungsinfos.
schick mir mal em@il oder so per pn, dann kann ich dir code und co schicken, ist allerdings etwas schwieriger als es zu anfang aussieht ^^

cya v3g0
 
Ne brauchste nicht, hat sich ja alles geklärt und das Programm funktioniert. Mit den Arrays ists ja nur noch ne kleine Verschönerungsarbeit ^^
Was mich viel mehr nervt ist das StringGrid - Die Linien gehen ja problemlos weg, aber die Cellmarkierung bleibt. Tja, das sieht ziemlich ******** aus, aber was solls.
 
Ausserdem ist OOP "objektorientierte Programmierung) sehr wichtig und je eher man es lernt, desto besser. Ist ne gute Voraussetzung, wenn man programmieren will und gleich noch nebenbei eine neue Art des Programmierens mitlernt. Jeder kann es lernen...
nagut fast jeder --> :homer:
 
Zurück
Oben Unten