Kahe dimensioonilise massiivi loomine rubiinis

Järgmine artikkel on sarja osa. Selle sarja rohkem artikleid leiate rubriigist Mängu 2048 kloonimine. Täieliku ja lõpliku koodi leiate sisukorrast.

Nüüd, kui me teame, kuidas algoritm töötab, on aeg mõelda andmete peale, millel see algoritm töötab. Siin on kaks peamist valikut: korter massiiv mingisugust või kahemõõtmelist massiivi. Igal neist on oma eelised, kuid enne otsuse tegemist peame millegagi arvestama.

KUIVAD mõistatused

Võrgupõhiste mõistatustega töötamisel on tavaline tehnika, kus peate otsima sarnaseid mustreid, see on kirjutada algoritmi versioon, mis töötab mõistatusega vasakult paremale ja pöörab kogu mõistatuse nelja ümber korda. Nii tuleb algoritm kirjutada ainult üks kord ja see peab töötama ainult vasakult paremale. See vähendab dramaatiliselt keerukust ja suurust selle projekti kõige raskemast osast.

Kuna me tegeleme mõistatusega vasakult paremale, on mõistlik, kui read on esindatud massiividega. Kahemõõtmelise massiivi tegemisel sisse Rubiin (või õigemini, kuidas soovite, et sellele adresseeritaks ja mida andmed tegelikult tähendavad), peate otsustama, kas soovite ridade virna (kus iga ruudustiku rida tähistab massiiv) või veergude virna (kus iga veerg on massiiv). Kuna töötame ridadega, valime read.

instagram viewer

Kuidas seda 2D massiivi pööratakse, saame teada pärast sellise massiivi konstrueerimist.

Kahemõõtmelise massiivi ehitamine

Array.new meetod võib võtta argumendi, määrates soovitud massiivi suuruse. Näiteks, Array.new (5) loob 5 nullist objektist koosneva massiivi. Teine argument annab teile vaikimisi väärtuse, nii Array.new (5, 0) annab teile massiivi [0,0,0,0,0]. Niisiis, kuidas luua kahemõõtmeline massiiv?

Vale viis ja viis, kuidas ma näen inimesi sageli proovimas, on öelda Array.new (4, Array.new (4, 0)). Teisisõnu - 4-ridaline massiiv, igas reas on 4-nulline massiiv. Ja see näib alguses toimivat. Käitage siiski järgmist koodi:

See tundub lihtne. Tehke 4x4 nullide massiiv, seadke vasak ülaosa väärtuseks 1. Kuid printige see välja ja saame ...

See seadis kogu esimese veeru väärtuseks 1, mis annab? Kui massiive tegime, kutsutakse kõigepealt sisemine kõne Array.new-sse, moodustades ühe rea. Seejärel kopeeritakse selle rea ühtne viide neli korda, et täita välimine massiiv. Seejärel viitab iga rida samale massiivile. Muutke üks, muutke neid kõiki.

Selle asemel peame kasutama kolmas massiivi loomise viis ruby'is. Väärtuse Array.new meetodile üleandmise asemel edastame ploki. Plokki täidetakse iga kord, kui meetod Array.new vajab uut väärtust. Nii et kui sa peaksid ütlema Array.new (5) {gets.chomp}, Ruby peatub ja küsib sisestamist viis korda. Nii et peame tegema lihtsalt uue massiivi sellesse blokki. Nii et lõpetame sellega Array.new (4) {Array.new (4,0)}. Proovime nüüd seda proovijuhtumit uuesti.

Ja see toimub täpselt nii, nagu võiks arvata.

Ehkki Rubyl pole kahemõõtmeliste massiivide tuge, saame siiski teha seda, mida vajame. Pidage ainult meeles, et tipptasemel massiiv kuulub viited alammassiividesse ja iga alammassiiv peaks viitama erinevale väärtuste massiivile.

See, mida see massiiv tähistab, on teie enda otsustada. Meie puhul on see massiiv paigutatud ridadena. Esimene indeks on rida, mida me indekseerime, ülalt alla. Pusle ülemise rea indekseerimiseks kasutame a [0], järgmise rea indekseerimiseks, mida me kasutame a [1]. Konkreetse plaadi indekseerimiseks teises reas kasutame a [1] [n]. Kui me oleksime otsustanud veergude järele..., oleks see sama. Rubiinil pole aimugi, mida me nende andmetega teeme, ja kuna see ei toeta tehniliselt kahemõõtmelisi massiive, on see, mida me siin teeme, häkkimine. Juurdepääs sellele on ainult tavapärane ja kõik hoiab kokku. Unustage, mida all olevad andmed väidetavalt teevad, ja kõik võib kiirelt laguneda.