Vytvoření dvourozměrných polí v Ruby

Následující článek je součástí série. Další články v této sérii naleznete v tématu Klonování hry 2048 v Ruby. Úplný a konečný kód naleznete v textu.

Nyní, když víme, jak bude algoritmus fungovat, je čas přemýšlet o datech, na kterých bude tento algoritmus fungovat. Jsou zde dvě hlavní možnosti: byt pole nějakého druhu, nebo dvourozměrné pole. Každý má své výhody, ale než se rozhodneme, musíme něco vzít v úvahu.

SUCHÉ hádanky

Běžnou technikou při práci s mřížkami založenými na mřížce, kde musíte hledat podobné vzory, je napsat jeden verze algoritmu, který pracuje na hádance zleva doprava a poté celou hádanku otočí kolem čtyř krát. Algoritmus tak musí být zapsán pouze jednou a musí pracovat zleva doprava. Tento dramaticky snižuje složitost a velikost nejtěžší části tohoto projektu.

Protože budeme na hádankách pracovat zleva doprava, má smysl, aby byly řádky reprezentovány poli. Při vytváření dvourozměrného pole v Rubín (nebo přesněji, jak to chcete řešit a co data ve skutečnosti znamenají), musíte se rozhodnout, zda chcete hromada řádků (kde každý řádek mřížky je reprezentován maticí) nebo hromada sloupců (kde každý sloupec je maticí). Protože pracujeme s řadami, vybereme si řádky.

instagram viewer

Jak se toto 2D pole točí, dostaneme se poté, co takové pole skutečně postavíme.

Sestavení dvourozměrných polí

Metoda Array.new může mít argument definující velikost pole, které chcete. Například, Array.new (5) vytvoří pole 5 nulových objektů. Druhý argument vám dává výchozí hodnotu Array.new (5, 0) vám dá pole [0,0,0,0,0]. Jak tedy vytvoříte dvojrozměrné pole?

Nesprávný způsob a způsob, jakým vidím lidi, kteří se často snaží, je říkat Array.new (4, Array.new (4, 0)). Jinými slovy, pole 4 řádků, přičemž každý řádek je maticí 4 nul. A zdá se, že to nejprve funguje. Spusťte však následující kód:

Vypadá to jednoduše. Vytvořte pole nula 4x4 a nastavte prvek vlevo nahoře na 1. Ale vytiskněte ji a my ...

Nastavil celý první sloupec na 1, co dává? Když jsme vytvořili pole, první volání do Array.new bylo nazváno jako první a vytvořilo jediný řádek. Jediný odkaz na tento řádek je pak čtyřikrát duplikován, aby vyplnil nejvzdálenější pole. Každý řádek pak odkazuje na stejné pole. Změňte jeden, změňte je všechny.

Místo toho musíme použít Třetí způsob vytvoření pole v Ruby. Místo předávání hodnoty metodě Array.new předáváme blok. Blok je spuštěn pokaždé, když metoda Array.new potřebuje novou hodnotu. Takže kdybys to měl říct Array.new (5) {gets.chomp}, Ruby se zastaví a 5krát požádá o zadání. Musíme tedy jen vytvořit nové pole uvnitř tohoto bloku. Takže skončíme Array.new (4) {Array.new (4,0)}. Nyní zkusme ten testovací případ znovu.

A dělá to přesně tak, jak byste čekali.

Takže i když Ruby nemá podporu pro dvourozměrná pole, stále můžeme dělat, co potřebujeme. Jen si pamatujte, že pole nejvyšší úrovně platí Reference k dílčím polím a každé dílčí pole by mělo odkazovat na jiné pole hodnot.

To, co toto pole představuje, je jen na vás. V našem případě je toto pole uspořádáno jako řádky. První index je řádek, který indexujeme, shora dolů. K indexování horní řady hádanky používáme a [0], k indexování dalšího řádku dolů, který používáme a [1]. K indexování konkrétní dlaždice ve druhém řádku používáme a [1] [n]. Kdybychom se však rozhodli pro sloupy… bylo by to stejné. Ruby netuší, co děláme s těmito daty, a protože technicky nepodporuje dvourozměrná pole, děláme zde hack. Přístup k němu pouze konvencí a vše bude držet pohromadě. Zapomeňte na to, co mají data pod nimi dělat, a všechno se může rychle rozpadnout.