Vytvorenie dvojrozmerných polí v Ruby

Nasledujúci článok je súčasťou série. Ďalšie články v tejto sérii nájdete v dokumente Klonovanie hry 2048 v Ruby. Úplný a konečný kód nájdete v prehľade.

Teraz, keď vieme, ako bude algoritmus fungovať, je čas premýšľať o údajoch, na ktorých bude tento algoritmus pracovať. Tu sú dve hlavné možnosti: byt rad nejakého druhu alebo dvojrozmerného zoskupenia. Každá má svoje výhody, ale skôr ako sa rozhodneme, musíme niečo zohľadniť.

SUCHÉ hádanky

Bežnou technikou pri práci s hádankami založenými na mriežke, kde musíte hľadať podobné vzory, je napísať jednu verzia algoritmu, ktorý pracuje na puzzle zľava doprava a potom celú hádanku otočí okolo štyroch časy. Týmto spôsobom sa algoritmus musí zapísať iba raz a musí pracovať iba zľava doprava. toto dramaticky znižuje zložitosť a veľkosť najťažšej časti tohto projektu.

Pretože budeme pracovať na puzzle zľava doprava, má zmysel mať riadky reprezentované poliami. Pri vytváraní dvojrozmerného poľa v systéme Windows 7 rubín (alebo presnejšie povedané, ako chcete, aby boli adresované a čo údaje vlastne znamenajú), musíte sa rozhodnúť, či chcete stoh riadkov (kde každý riadok mriežky je reprezentovaný poľom) alebo stoh stĺpcov (kde každý stĺpec je pole). Pretože pracujeme s riadkami, vyberieme riadky.

instagram viewer

Ako sa toto 2D pole otáča, dostaneme sa po tom, ako skutočne vytvoríme také pole.

Zostavenie dvojrozmerných polí

Metóda Array.new môže vziať argument definujúci veľkosť poľa, ktoré chcete. Napríklad, Array.new (5) vytvorí pole 5 nulových objektov. Druhý argument vám dáva predvolenú hodnotu Array.new (5, 0) vám dá pole [0,0,0,0,0]. Ako teda vytvoríte dvojrozmerné pole?

Zlý spôsob a spôsob, akým vidím ľudí, ktorí sa často snažia, je povedať Array.new (4, Array.new (4, 0)). Inými slovami, pole 4 riadkov, z ktorých každý je radom 4 núl. Zdá sa, že to funguje najskôr. Spustite však nasledujúci kód:

Vyzerá to jednoducho. Vytvorte pole núl 4x4 a nastavte ľavý horný prvok na 1. Ale vytlačte ho a dostaneme ...

Celý prvý stĺpec sa nastavil na 1, čo dáva? Keď sme urobili polia, volanie sa do telefónu Array.new sa zvolalo ako prvé a vytvoril jediný riadok. Jediný odkaz na tento riadok sa potom duplikuje štyrikrát, aby vyplnil pole vonkajšej strany. Každý riadok potom odkazuje na rovnaké pole. Zmeňte jeden, zmeňte ich všetky.

Namiesto toho musíme použiť tretina spôsob vytvorenia poľa v Ruby. Namiesto odovzdávania hodnoty metóde Array.new odovzdávame blok. Blok sa vykoná vždy, keď metóda Array.new potrebuje novú hodnotu. Takže ak by ste mali povedať Array.new (5) {gets.chomp}, Ruby sa zastaví a požiada o vstup 5-krát. Všetko, čo musíme urobiť, je iba vytvoriť nové pole v tomto bloku. Takže skončíme Array.new (4) {Array.new (4,0)}. Teraz vyskúšajme tento testovací prípad znova.

A robí to presne tak, ako by ste očakávali.

Aj keď Ruby nemá podporu pre dvojrozmerné polia, stále môžeme robiť to, čo potrebujeme. Nezabudnite, že pole najvyššej úrovne platí referencie k čiastkovým poliam a každé podpole by malo odkazovať na iné pole hodnôt.

To, čo toto pole predstavuje, je len na vás. V našom prípade je toto pole usporiadané ako riadky. Prvý index je riadok, ktorý indexujeme, zhora nadol. Na indexovanie horného riadku puzzle používame A [0], na indexovanie ďalšieho riadku nadol, ktorý používame a [1]. Na indexovanie konkrétnej dlaždice v druhom riadku používame a [1] [n]. Keby sme sa však rozhodli pre stĺpce, bolo by to rovnaké. Ruby netuší, čo robíme s týmito údajmi, a keďže technicky nepodporuje dvojrozmerné polia, robíme tu hack. Prístup k nemu iba konvenciou a všetko sa bude držať pohromade. Zabudnite na to, čo majú údaje robiť a všetko sa môže rýchlo rozpadnúť.