Der folgende Artikel ist Teil einer Serie. 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 funktioniert, ist es an der Zeit, über die Daten nachzudenken, mit denen dieser Algorithmus arbeitet. Hier gibt es zwei Hauptoptionen: eine flache Anordnung oder eine zweidimensionale Anordnung. Jeder hat seine Vorteile, aber bevor wir eine Entscheidung treffen, müssen wir etwas berücksichtigen.
Eine übliche Technik bei der Arbeit mit gitterbasierten Rätseln, bei denen Sie nach Mustern wie diesem suchen müssen, besteht darin, eine Version des Algorithmus zu schreiben, der das Puzzle von links nach rechts bearbeitet, und dann das gesamte Puzzle viermal zu drehen. Auf diese Weise muss der Algorithmus nur einmal geschrieben werden und es muss nur von links nach rechts gearbeitet werden. Dies reduziert die Komplexität und Größe des schwierigsten Teils dieses Projekts erheblich.
Da wir das Puzzle von links nach rechts bearbeiten, ist es sinnvoll, die Zeilen durch Arrays darstellen zu lassen. Wenn Sie ein zweidimensionales Array in Ruby erstellen (oder genauer gesagt, wie es adressiert werden soll und was die Daten tatsächlich bedeuten), müssen Sie entscheiden, ob Sie einen Stapel von Zeilen (wobei jede Zeile des Rasters durch dargestellt wird) möchten ein Array) oder einen Stapel von Spalten (wobei jede Spalte ein Array ist). Da wir mit Zeilen arbeiten, werden wir Zeilen auswählen.
Wie dieses 2D-Array gedreht wird, erfahren Sie, nachdem Sie ein solches Array erstellt haben.
Die Array.new-Methode kann ein Argument annehmen, das die Größe des gewünschten Arrays definiert. Beispielsweise, Array.neu (5) erstellt ein Array von 5 Null-Objekten. Das zweite Argument gibt Ihnen einen Standardwert Array.new (5, 0) wird Ihnen das Array geben [0,0,0,0,0]. Wie erstellt man ein zweidimensionales Array??
Der falsche Weg und die Art, wie ich Menschen sehe, die es oft versuchen, ist zu sagen Array.neu (4, Array.neu (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. Machen Sie ein 4x4-Array von Nullen, setzen Sie das obere linke Element auf 1. Aber drucken Sie es und wir erhalten ...
Es setzt die gesamte erste Spalte auf 1, was gibt? Wenn wir die Arrays erstellt haben, wird der innerste Aufruf von Array.new zuerst aufgerufen und bildet eine einzelne Zeile. 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. Ändere eins, ändere sie alle.
Stattdessen müssen wir die verwenden dritte Art und Weise der Erstellung eines Arrays in Ruby. 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 du sagen würdest 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 es jetzt 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 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 angelegt. 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, machen wir hier einen Hack. Greifen Sie nur nach Vereinbarung darauf zu und alles wird zusammenhalten. Vergessen Sie, was die Daten darunter tun sollen, und alles kann sehr schnell auseinanderfallen.