Tworzenie dwuwymiarowych tablic w Ruby

Zrzut ekranu 2048 autorstwa Gabriele Cirulli gry na Androida

Gabriele Cirulli





Poniższy artykuł jest częścią serii. Aby uzyskać więcej artykułów z tej serii, zobacz Cloning the Game 2048 w Ruby. Aby zapoznać się z kompletnym i ostatecznym kodem, zobacz sedno.

Teraz, gdy wiemy, jak ten algorytm będzie działał, nadszedł czas, aby pomyśleć o danych, na których ten algorytm będzie działał. Do wyboru są dwie główne opcje: mieszkanie szyk jakiegoś rodzaju lub dwuwymiarową tablicę. Każda ma swoje zalety, ale zanim podejmiemy decyzję, musimy wziąć coś pod uwagę.



Suche puzzle

Powszechną techniką pracy z łamigłówkami opartymi na siatce, w której musisz szukać takich wzorców, jest napisanie jednej wersji algorytmu, który działa na łamigłówce od lewej do prawej, a następnie czterokrotne obrócenie całej łamigłówki. W ten sposób algorytm musi być napisany tylko raz i musi działać tylko od lewej do prawej. Ten radykalnie zmniejsza złożoność i rozmiar najtrudniejszej części tego projektu.

Ponieważ będziemy pracować nad łamigłówką od lewej do prawej, sensowne jest, aby wiersze były reprezentowane przez tablice. Tworząc dwuwymiarową tablicę w Rubin (a dokładniej, w jaki sposób chcesz się tym zająć i co faktycznie oznaczają dane), musisz zdecydować, czy chcesz stos wierszy (gdzie każdy wiersz siatki jest reprezentowany przez tablicę), czy stos kolumn (gdzie każda kolumna jest tablicą). Ponieważ pracujemy z rzędami, wybierzemy rzędy.



Jak ta tablica 2D jest obracana, dowiemy się po tym, jak faktycznie zbudujemy taką tablicę.

Konstruowanie dwuwymiarowych tablic

Metoda Array.new może przyjmować argument definiujący rozmiar żądanej tablicy. Na przykład, Tablica.nowy(5) utworzy tablicę z 5 zerowymi obiektami. Drugi argument podaje wartość domyślną, więc Tablica.nowy(5, 0) da ci tablicę [0,0,0,0,0,0] . Jak więc stworzyć dwuwymiarową tablicę?

Niewłaściwy sposób, a sposób, w jaki widzę, jak ludzie często próbują, to powiedzenie Tablica.nowa( 4, Tablica.nowa(4, 0) ) . Innymi słowy, tablica 4 wierszy, przy czym każdy wiersz jest tablicą 4 zer. I na początku wydaje się, że to działa. Uruchom jednak następujący kod:

Wygląda prosto. Utwórz tablicę zer 4x4, ustaw lewy górny element na 1. Ale wydrukuj to i otrzymamy…



Ustawił całą pierwszą kolumnę na 1, co daje? Kiedy tworzymy tablice, najbardziej wewnętrzne wywołanie Array.new jest wywoływane jako pierwsze, tworząc pojedynczy wiersz. Pojedyncze odwołanie do tego wiersza jest następnie duplikowane 4 razy, aby wypełnić najbardziej zewnętrzną tablicę. Każdy wiersz odwołuje się do tej samej tablicy. Zmień jedną, 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 wymaga nowej wartości. Więc jeśli miałbyś powiedzieć Array.new(5) { gets.chomp } , Ruby zatrzyma się i poprosi o wprowadzenie danych 5 razy. Więc wszystko, co musimy zrobić, to po prostu utworzyć nową tablicę wewnątrz tego bloku. Więc kończymy z Tablica.nowa(4) { Tablica.nowa(4,0) } . Teraz spróbujmy jeszcze raz ten przypadek testowy.



I działa tak, jak można by się spodziewać.

Więc chociaż Ruby nie obsługuje tablic dwuwymiarowych, nadal możemy robić to, czego potrzebujemy. Pamiętaj tylko, że tablica najwyższego poziomu zawiera Bibliografia do podtablic, a każda podtablica powinna odwoływać się do innej tablicy wartości.



To, co reprezentuje ta tablica, zależy od Ciebie. W naszym przypadku ta tablica jest ułożona jako wiersze. Pierwszy indeks to wiersz, który indeksujemy, od góry do dołu. Aby zindeksować górny wiersz układanki, używamy a[0] , aby zindeksować następny wiersz w dół, używamy [1] . Aby zindeksować określoną 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 dwuwymiarowych tablic, robimy tutaj tylko włamanie. Uzyskaj dostęp tylko na podstawie konwencji, a wszystko się utrzyma. Zapomnij o tym, co mają robić dane znajdujące się pod spodem, a wszystko może się bardzo szybko rozpaść.