2016-12-23 4 views
1

Ich möchte ein kleines Snake-Spiel in C++ programmieren und ich möchte wissen, wie man die Spielmatrix am besten darstellt.Schlange Darstellung des Gitters

ich einen 2DArray (so etwas wie Vektor < Vektor < int>>) verwenden könnte, die einige Werte, die verschiedene Objekte enthalten (zum Beispiel: 0 nichts, 1 Schlange, 2 Wand, 3 Lebensmittel, ...) On andererseits könnte ich kein Array für das Gitter verwenden und multiple Arrays für die verschiedenen Spielobjekte verwenden (zum Beispiel: Vektor < Wand>, Vektor < SnakeTile>, Vektor < Essen>, ...).

Sollte ich auch std :: deque verwenden, um meine Schlange darzustellen?

Vielen Dank für Ihre Hilfe.

+1

Ich denke, dass beide Darstellungen korrekt sind. Die gitterartige Darstellung nimmt mehr Platz im Speicher ein, ist aber schneller. Die "Spielobjekt" -Darstellung ist langsamer, kann aber weniger Platz im Speicher einnehmen und kann logischer sein. Es hängt davon ab, was Sie wollen, von Ihrer grafischen Bibliothek und der Komplexität des Spiels. Ich persönlich bevorzuge die Gitterdarstellung für ein einfaches Arcade-Spiel wie Snake, Pac-Man, etc ... – Hugal31

+1

@ Hugal31 Das "Game-Objekt" könnte schneller sein. Ein Grill von 20x20 nimmt O (400) + O (n), n ist die Anzahl der Objekte. Auf der anderen Seite haben Sie mit 42 Objekt O (42). Meiner Meinung nach ist eine Hash-Karte eine gute Option, um beide Vorteile zu haben. Sie müssen nicht auf Ihrem Raster Schleife und wenn Sie auf einen bestimmten Fall zugreifen möchten. Sie werden etwas zwischen O (1) und O (log n) haben. – Stargateur

Antwort

1

Ich glaube, Sie mit dem Schreiben einen Wrapper um std Vektor zu starten shold die col, Zeile basierten Zugriff bietet:

template<typename T> 
class Matrix 
{ 
private: 
    std::vector<T> grid; 
    size_t _cols, _rows; 

public: 
    Matrix(const size_t& cols, const size_t& rows) : 
     _cols(cols), _rows(rows), grid(cols*rows); 
    { 
    } 

    T& at(const size_t& col, const size_t& row) 
    { 
     return grid[col + row * _cols]; 
    } 
} 

und das Gitter wird vertreten Sie. Typ T (oder Klasse) kann Cell-Objekt darstellen, das alle Informationen über Zelle enthält. Auf diese Weise werden Ihre Grid-Daten eng gepackt und leicht zugänglich gemacht.

Sie sollten auch gründlich darüber nachdenken, wie Ihr Scake mit Ihrem Grid interagiert, und was werden die Ursachen dafür sein (Sie können keine Früchte dort platzieren, wo die Schlange richtig ist?). Dann kannst du diese Unausgeglichenheiten in deinem Code durchsetzen und das wird bestimmen, wie dein Gitter und deine Schlange Informationen austauschen (und welche von ihnen).

0

Denken Sie über Kollision - Sie möchten überprüfen, ob die Schlange mit sich selbst kollidiert. Der Zugriff auf ein Gitter an der Position, an die sich der Kopf bewegt, ist konstant, das Durchsuchen des ganzen Körpers der Schlange ist nicht möglich. Wenn ein Spieler etwas gut ist, wird die Schlange irgendwann den größten Teil des Gitters füllen, was bedeutet, dass nicht wirklich Speicher gespart wird.

Allerdings: Sie haben zwei andere Aufgaben zur Hand: Löschen des Schwanzes, wenn sich die Schlange bewegt und die Schlange malt. Um es zu malen, gehe ich davon aus, dass der Spieler in der Lage sein soll zu sehen, wie er wackelt, also braucht man eine Reihenfolge, in der die Schlange die Felder durchquert. Dies klingt wie eine Warteschlange für die Positionen der Schlange.

Wir haben über Speicher gesprochen, aber ... ist Speicher relevant hier? 400 Fliesen oder so ist nichts für eine moderne Maschine. Die Sache mit der Suche nach dem ganzen Körper ist immer noch relevant, weil das weniger lesbar ist als der Zugriff auf eine Gitterkachel.

Deshalb, wie ich es tun würde: Haben Sie einen 2D-Vektor, der das Gitter für Kollisionen UND eine Warteschlange für die Schlange darstellt. Alles außer der Schlange kann im 2D-Vektor gespeichert werden, wenn wir über Nahrung und Wände sprechen. Gehen Sie vorerst damit um, implementieren Sie es und sehen Sie, wenn Probleme auftauchen, im schlimmsten Fall werden Sie Erfahrung sammeln, wie?

Verwandte Themen