Tworzenie dwuwymiarowych tablic w Rubim

Poniższy artykuł jest częścią serii. Więcej artykułów z tej serii znajduje się w Cloning the Game 2048 in Ruby. Pełny i końcowy kod znajduje się w istocie.

Teraz, gdy wiemy, jak działa algorytm, czas pomyśleć o danych, na których będzie działał algorytm. Istnieją tutaj dwie główne opcje: mieszkanie szyk jakiegoś rodzaju lub dwuwymiarowej tablicy. Każdy ma swoje zalety, ale zanim podejmiemy decyzję, musimy coś wziąć pod uwagę.

SUCHE Puzzle

Częstą techniką pracy z łamigłówkami opartymi na siatce, w której musisz szukać takich wzorów, jest napisanie jednego wersja algorytmu, która działa na układankę od lewej do prawej, a następnie obróć całą układankę wokół czterech czasy. W ten sposób algorytm musi zostać napisany tylko raz i musi działać tylko od lewej do prawej. To radykalnie zmniejsza złożoność i rozmiar najtrudniejszej części tego projektu.

Ponieważ będziemy pracować nad układanką od lewej do prawej, sensowne jest, aby wiersze były reprezentowane przez tablice. Podczas tworzenia dwuwymiarowej tablicy w

instagram viewer
Rubin (lub, dokładniej, w jaki sposób chcesz się nim zająć i co tak naprawdę oznaczają dane), musisz zdecydować, czy chcesz stos wierszy (gdzie każdy wiersz siatki jest reprezentowany przez tablicę) lub stos kolumn (gdzie każda kolumna jest tablicą). Ponieważ pracujemy z wierszami, wybierzemy wiersze.

Jak ta tablica 2D jest obracana, przejdziemy do niej po tym, jak faktycznie zbudujemy taką tablicę.

Konstruowanie tablic dwuwymiarowych

Metoda Array.new może przyjmować argument określający rozmiar żądanej tablicy. Na przykład, Array.new (5) utworzy tablicę 5 zerowych obiektów. Drugi argument podaje wartość domyślną, więc Array.new (5, 0) da ci tablicę [0,0,0,0,0]. Jak więc stworzyć tablicę dwuwymiarową?

Zły sposób i sposób, w jaki często próbuję, to powiedzieć Array.new (4, Array.new (4, 0)). Innymi słowy, tablica 4 wierszy, przy czym każdy wiersz jest tablicą 4 zer. I to wydaje się działać na początku. Uruchom jednak następujący kod:

To wygląda prosto. Zrób tablicę zer 4x4, ustaw lewy górny element na 1. Ale wydrukuj i otrzymamy…

Ustawia całą pierwszą kolumnę na 1, co daje? Kiedy wykonujemy tablice, najpierw wywoływane jest wewnętrzne wywołanie Array.new, tworząc pojedynczy wiersz. Pojedyncze odniesienie do tego wiersza jest następnie duplikowane 4 razy, aby wypełnić najbardziej zewnętrzną tablicę. Każdy wiersz odnosi się do tej samej tablicy. Zmień jeden, zmień je wszystkie.

Zamiast tego musimy użyć trzeci sposób tworzenia tablicy w Ruby. Zamiast przekazywać wartość do metody Array.new, przekazujemy blok. Blok jest wykonywany za każdym razem, gdy metoda Array.new potrzebuje nowej wartości. Więc gdybyś powiedział Array.new (5) {gets.chomp}Ruby zatrzyma się i poprosi o dane wejściowe 5 razy. Więc wszystko, co musimy zrobić, to po prostu utworzyć nową tablicę w tym bloku. Tak więc kończymy Array.new (4) {Array.new (4,0)}. Teraz spróbujmy ponownie ten przypadek testowy.

I robi to tak, jak można się spodziewać.

Dlatego nawet jeśli Ruby nie obsługuje tablic dwuwymiarowych, nadal możemy robić to, czego potrzebujemy. Pamiętaj tylko, że tablica najwyższego poziomu trzyma Bibliografia do pod-tablic, a każda pod-tablica powinna odnosić się do innej tablicy wartości.

To, co reprezentuje ta tablica, zależy od Ciebie. W naszym przypadku tablica ta jest ułożona jako rzędy. Pierwszy indeks to wiersz, który indeksujemy, od góry do dołu. Do indeksowania górnego rzędu układanki używamy a [0], aby zindeksować następny wiersz, którego używamy a [1]. Aby zindeksować konkretną płytkę w drugim rzędzie, używamy a [1] [n]. Gdybyśmy jednak zdecydowali się na kolumny… to byłoby to samo. Ruby nie ma pojęcia, co robimy z tymi danymi, a ponieważ technicznie nie obsługuje tablic dwuwymiarowych, tutaj robimy hack. Dostęp do niego jest tylko konwencja, a wszystko będzie się trzymać razem. Zapomnij, co mają robić dane poniżej, a wszystko może się naprawdę szybko rozpaść.