Welche Datenstruktur sollte ich für ein Schlangenspiel verwenden?

7

Ich habe Hausaufgaben für meine Schule und ich muss in Delphi ein Schlangenspiel machen, wie das von Nokia. Ich frage mich, welche Lösung die beste ist. Ich möchte, dass meine Schlange eine Klasse ist und der Körper eine Reihe von Punkten (Elternklasse) oder eine verknüpfte Liste von Punkten ist. Was ist das Beste? Ein Array oder eine verknüpfte Liste?

    
bAN 22.12.2009, 09:58
quelle

7 Antworten

7

Eine verknüpfte Liste ist besser. (Jeder Knoten kann auf den vorherigen und nächsten Knoten zeigen.) Es ist einfacher, Knoten am Ende einer verknüpften Liste hinzuzufügen.

Wenn Sie ein Array verwenden, müssen Sie entweder die Größe ändern oder es auf die maximal mögliche Schlange Länge initialisieren, um damit zu beginnen, was im Speicher verschwenderisch sein kann.

UPDATE Dieser Artikel spricht über Zeiger in Delph und schlägt sogar eine einfache Knotendefinition Delphi-Artikel

vor     
Andrew 22.12.2009, 10:16
quelle
8

Eine einfache Lösung besteht darin, ein Array [horizontal] [vertikal] vom Typ zu erstellen, sodass für jede Koordinate auf dem Bildschirm ein Element vorhanden ist. Jeder Typ kann eine Schlangenrichtung, Nahrung, Gift, Wand oder leer sein. Das bedeutet, dass Sie sich nur die Kopf- und Schwanzposition der Schlange und die Anzahl der Nahrung und der Gifte merken müssen, und das Array beschreibt, wie der Bildschirm aussieht.

Dies beseitigt den Aufwand beim Umgang mit den Elementen der Schlange und macht es einfach, neue Nahrung oder Giftgegenstände auf dem Bildschirm zu positionieren, um sicherzustellen, dass Sie es nicht an einen bereits belegten Platz legen.

Wenn Sie das Schwanzelement der Schlange entfernen müssen, nehmen Sie die Richtung des Schwanzes mit der folgenden Anweisung: = array [tailx, taily]; und setze dann array [tailx, taily]: = leer. Danach aktualisieren Sie je nach Richtung tailx und taily. Das war's.

    
Lars D 22.12.2009 20:19
quelle
3

Ich habe etwas anderes für meine Snake-Implementierung verwendet. Die Idee ist, dass Sie

speichern
  1. die Lage des Schlangenkopfes
  2. die Länge der Schlange
  3. die Richtung des Schlangenkopfs
  4. ein Array von "Biege" -Objekten, wobei eine Biegung aus einer Richtung (links oder rechts) und einem Versatz (z. B. (links, 3) besteht, wenn an der dritten Position in der Schlange eine Biegung links ist)

Dies ist ziemlich effizient, keine dumme Lösung wie ein einfaches Array und kann leicht zum Zeichnen von "schickeren" Schlangen, z.B. mit abgerundeten Ecken.

    
ryyst 17.04.2011 11:32
quelle
2

Hier sind ein paar nette Startpunkte für dich ... da ich deine Hausaufgaben nicht machen will:

Pseudocode für Snake Game, um eine Idee zu bekommen

Thread mit einem deutschen Beispiel ... vielleicht hilft dir dieser Code

Wenn während des Programmiervorgangs Fehler auftreten, können Sie eine neue Frage öffnen.

    
bastianneu 22.12.2009 10:09
quelle
2

In Delphi würde ich eine TQueue verwenden, die in der Contnrs-Einheit definiert ist. Du kannst deine neue Koordinate hineinschieben (Schlangenkopf), und wenn deine maximale Schlangengröße erreicht ist, musst du einfach "Pop" rufen, um den Schlangenschwanz zu befreien.

%Vor%

Dann müssen Sie nur noch zeichnen, was in dieser TObjectQueue ist. Um auf die Liste der TQueue zuzugreifen, müssen Sie die Eigenschaft List offenlegen ... Um dies zu tun, definieren Sie einfach Ihre Schlangenkörper-Klasse wie folgt:

%Vor%     
Pmax 22.12.2009 15:20
quelle
0

Ich habe ein sehr altes turbopascal Schlangenprogramm. Es verwendet ein Array für den Körper.

%Vor%

und der Code, der die Schlange bewegt ...

%Vor%     
PA. 22.12.2009 16:23
quelle
0

Sie können einen Ringpuffer verwenden. Um zu erarbeiten:

Erhalte ein Array, das groß genug ist, um die maximale Schlange zu halten. Legen Sie zwei Zeiger fest, einen für den Kopf, einen für den Schwanz.

Am Anfang wäre der Schwanz in Zelle # 1, der Kopf in Zelle # 3. Bewegen Sie den Kopfzeiger während der Bewegung der Schlange nach rechts und schreiben Sie die neue Koordinate. Wenn keine Nahrung mehr gegessen wird, bewegen Sie den Schwanzzeiger ebenfalls nach rechts. Wenn einer der Zeiger versucht, über das äußerste rechte Ende des Arrays hinauszugehen, wickeln Sie sie an den Anfang.

    
zvolkov 19.01.2012 17:31
quelle

Tags und Links