Kaksiulotteisten taulukkojen luominen Rubyyn

Seuraava artikkeli on osa sarjaa. Lisätietoja tämän sarjan artikkeleista on kohdassa Pelin kloonaaminen 2048, Ruby. Katso täydellinen ja lopullinen koodi luettelossa.

Nyt kun tiedämme kuinka algoritmi toimii, on aika miettiä tietoja, joita tämä algoritmi käyttää. Täällä on kaksi päävaihtoehtoa: asunto ryhmä jonkinlainen tai kaksiulotteinen ryhmä. Jokaisella on omat etunsa, mutta ennen päätöksen tekemistä meidän on otettava jotain huomioon.

KUIVAT Palapelit

Yleinen tekniikka ruudukkoon perustuvien palapelien kanssa työskentelemisessä, joissa on etsittävä tällaisia ​​kuvioita, on kirjoittaa yksi versio algoritmista, joka toimii palapelissä vasemmalta oikealle ja kiertää sitten koko palapelin noin neljään ajat. Tällä tavalla algoritmi on kirjoitettava vain kerran ja sen on toimittava vain vasemmalta oikealle. Tämä vähentää dramaattisesti monimutkaisuutta ja kokoa hankkeen vaikeimmasta osasta.

Koska työskentelemme palapelin suhteen vasemmalta oikealle, on järkevää, että rivit esitetään taulukkoina. Kun teet kaksiulotteisen taulukon sisään

instagram viewer
Rubiini (tai tarkemmin, miten haluat sen osoittavan ja mitä tiedot oikeastaan ​​tarkoittavat), sinun on päätettävä, haluatko rivipino (jossa jokaista ruudukon riviä edustaa taulukko) tai pino saraketta (jossa jokainen sarake on taulukko). Koska työskentelemme rivien kanssa, valitsemme rivit.

Kuinka tätä 2D-taulukkoa pyöritetään, pääset sen jälkeen, kun olemme tosiasiallisesti rakentaneet tällaisen taulukon.

Kaksiulotteisten ryhmien rakentaminen

Array.new-menetelmä voi ottaa argumentin, joka määrittelee haluamasi taulukon koon. Esimerkiksi, Array.new (5) luo joukon 5 nollaa objektia. Toinen argumentti antaa sinulle oletusarvon, joten Array.new (5, 0) antaa sinulle joukon [0,0,0,0,0]. Joten miten voit luoda kaksiulotteisen taulukon?

Väärä tapa ja tapa, jolla näen ihmisiä yrittävän usein, on sanoa Array.new (4, Array.new (4, 0)). Toisin sanoen 4 rivin ryhmä, jokaisen rivin ollessa 4 nollan taulukko. Ja tämä näyttää toimivan aluksi. Suorita seuraava koodi:

Se näyttää yksinkertaiselta. Tee 4x4-taulukko nollia, aseta vasen yläosa arvoon 1. Mutta tulosta se ja saat…

Se asetti koko ensimmäisen sarakkeen arvoon 1, mikä antaa? Kun teimme taulukkoja, sisimmän puhelun Array.new -soittoon soitetaan ensin, jolloin muodostuu yksi rivi. Yksinkertainen viittaus tähän riviin kopioidaan sitten 4 kertaa ulomman taulukon täyttämiseksi. Jokainen rivi viittaa sitten samaan taulukkoon. Vaihda yksi, vaihda ne kaikki.

Sen sijaan meidän on käytettävä kolmas tapa luoda taulukko Rubyan. Sen sijaan, että annettaisiin arvo Array.new-menetelmälle, lähetämme lohkon. Lohko suoritetaan aina, kun Array.new-menetelmä tarvitsee uuden arvon. Joten jos sanot Array.new (5) {gets.chomp}, Ruby pysähtyy ja pyytää syöttämistä 5 kertaa. Joten kaikki mitä meidän on tehtävä on vain luoda uusi taulukko tämän lohkon sisään. Joten päädymme Array.new (4) {Array.new (4,0)}. Yritämme nyt sitä testitapausta uudelleen.

Ja se toimii juuri niin kuin voit odottaa.

Joten vaikka Rubylla ei ole tukea kaksiulotteisille ryhmille, voimme silti tehdä mitä tarvitsemme. Muista vain, että ylimmän tason taulukko mahtuu viittaukset alijärjestelmiin, ja kunkin alaryhmän tulisi viitata eri arvoarvoon.

Sinun on päätettävä, mitä tämä taulukko edustaa. Meidän tapauksessamme tämä ryhmä on asetettu riveiksi. Ensimmäinen hakemisto on indeksoitava rivi ylhäältä alas. Indeksiin ylimmän rivin arvoitus, käytämme [0], indeksoidaksesi seuraava rivi alas A [1]. Indeksoidaksesi tietyn ruudun toisella rivillä käytämme A [1] [n]. Jos olisimme kuitenkin päättäneet sarakkeista…, se olisi sama asia. Rubylla ei ole aavistustakaan, mitä teemme näillä tiedoilla, ja koska se ei tue teknisesti kaksiulotteisia taulukkoja, mitä täällä teemme, on hakkerointi. Käytä sitä vain sopimuksella ja kaikki pysyy yhdessä. Unohda, mitä alla olevien tietojen on tarkoitus tehdä, ja kaikki voi hajota todella nopeasti.