Erstellen zweidimensionaler Arrays in Ruby

click fraud protection

Der folgende Artikel ist Teil einer Reihe. Weitere Artikel in dieser Reihe finden Sie unter Klonen des Spiels 2048 in Ruby. Den vollständigen und endgültigen Code finden Sie in der Übersicht.

Nachdem wir nun wissen, wie der Algorithmus funktionieren wird, ist es Zeit, über die Daten nachzudenken, mit denen dieser Algorithmus arbeiten wird. Hier gibt es zwei Hauptoptionen: eine Wohnung Array irgendeiner Art oder einer zweidimensionalen Anordnung. Jeder hat seine Vorteile, aber bevor wir eine Entscheidung treffen, müssen wir etwas berücksichtigen.

TROCKENE Rätsel

Eine übliche Technik bei der Arbeit mit gitterbasierten Rätseln, bei denen Sie nach solchen Mustern suchen müssen, ist das Schreiben eines solchen Version des Algorithmus, der das Puzzle von links nach rechts bearbeitet und dann das gesamte Puzzle um vier dreht mal. Auf diese Weise muss der Algorithmus nur einmal geschrieben werden und nur von links nach rechts funktionieren. Dies reduziert die Komplexität und Größe drastisch des schwierigsten Teils dieses Projekts.

instagram viewer

Da wir von links nach rechts an dem Puzzle arbeiten, ist es sinnvoll, die Zeilen durch Arrays darzustellen. Beim Erstellen eines zweidimensionalen Arrays in Rubin (oder genauer gesagt, wie Sie möchten, dass es adressiert wird und was die Daten tatsächlich bedeuten), müssen Sie entscheiden, ob Sie möchten ein Stapel von Zeilen (wobei jede Zeile des Gitters durch ein Array dargestellt wird) oder ein Stapel von Spalten (wobei jede Spalte ein Array ist). Da wir mit Zeilen arbeiten, wählen wir Zeilen aus.

Wie dieses 2D-Array gedreht wird, erfahren wir, nachdem wir ein solches Array tatsächlich erstellt haben.

Aufbau zweidimensionaler Arrays

Die Array.new-Methode kann ein Argument verwenden, das die Größe des gewünschten Arrays definiert. Beispielsweise, Array.new (5) erstellt ein Array von 5 Null-Objekten. Das zweite Argument gibt Ihnen also einen Standardwert Array.new (5, 0) gibt Ihnen das Array [0,0,0,0,0]. Wie erstellt man ein zweidimensionales Array?

Der falsche Weg und die Art, wie ich Leute sehe, die es oft versuchen, ist zu sagen Array.new (4, Array.new (4, 0)). Mit anderen Worten, ein Array von 4 Zeilen, wobei jede Zeile ein Array von 4 Nullen ist. Und das scheint zunächst zu funktionieren. Führen Sie jedoch den folgenden Code aus:

Es sieht einfach aus. Erstellen Sie ein 4x4-Array mit Nullen und setzen Sie das Element oben links auf 1. Aber drucken Sie es aus und wir bekommen ...

Es setzte die gesamte erste Spalte auf 1, was gibt es? Wenn wir die Arrays erstellt haben, wird der innerste Aufruf von Array.new zuerst aufgerufen und eine einzelne Zeile erstellt. Ein einzelner Verweis auf diese Zeile wird dann viermal dupliziert, um das äußerste Array zu füllen. Jede Zeile verweist dann auf dasselbe Array. Ändern Sie eine, ändern Sie sie alle.

Stattdessen müssen wir die verwenden dritte Möglichkeit, ein Array in Ruby zu erstellen. Anstatt einen Wert an die Array.new-Methode zu übergeben, übergeben wir einen Block. Der Block wird jedes Mal ausgeführt, wenn die Array.new-Methode einen neuen Wert benötigt. Also, wenn Sie sagen würden Array.new (5) {gets.chomp}Ruby stoppt und fragt fünfmal nach Eingaben. Wir müssen also nur ein neues Array in diesem Block erstellen. Also landen wir bei Array.new (4) {Array.new (4,0)}. Versuchen wir diesen Testfall noch einmal.

Und es funktioniert genau so, wie Sie es erwarten würden.

Auch wenn Ruby keine Unterstützung für zweidimensionale Arrays bietet, können wir dennoch das tun, was wir brauchen. Denken Sie daran, dass das Array der obersten Ebene gilt Verweise zu den Unterarrays, und jedes Unterarray sollte sich auf ein anderes Array von Werten beziehen.

Was dieses Array darstellt, liegt bei Ihnen. In unserem Fall ist dieses Array als Zeilen angeordnet. Der erste Index ist die Zeile, die wir indizieren, von oben nach unten. Um die oberste Reihe des Puzzles zu indizieren, verwenden wir a [0], um die nächste Zeile nach unten zu indizieren, verwenden wir a [1]. Um eine bestimmte Kachel in der zweiten Zeile zu indizieren, verwenden wir a [1] [n]. Wenn wir uns jedoch für Kolumnen entschieden hätten... wäre es dasselbe. Ruby hat keine Ahnung, was wir mit diesen Daten machen, und da es technisch keine zweidimensionalen Arrays unterstützt, ist das, was wir hier machen, ein Hack. Greifen Sie nur durch Konvention darauf zu und alles wird zusammenhalten. Vergessen Sie, was die Daten darunter tun sollen, und alles kann sehr schnell auseinanderfallen.

instagram story viewer