Tweedimensionale arrays maken in Ruby

click fraud protection

Het volgende artikel maakt deel uit van een reeks. Zie Cloning the Game 2048 in Ruby voor meer artikelen in deze serie. Zie de kern voor de volledige en definitieve code.

Nu we weten hoe het algoritme zal werken, is het tijd om na te denken over de gegevens waarop dit algoritme zal werken. Er zijn hier twee hoofdkeuzes: een flat array van een soort, of een tweedimensionale reeks. Elk heeft zijn voordelen, maar voordat we een beslissing nemen, moeten we rekening houden met iets.

DROGE Puzzels

Een veel voorkomende techniek bij het werken met op raster gebaseerde puzzels waarbij je naar patronen zoals deze moet zoeken, is om er een te schrijven versie van het algoritme dat op de puzzel werkt van links naar rechts en roteer vervolgens de hele puzzel rond vier keer. Op deze manier hoeft het algoritme slechts eenmaal te worden geschreven en hoeft het alleen van links naar rechts te werken. Deze vermindert de complexiteit en omvang aanzienlijk van het moeilijkste deel van dit project.

Omdat we van links naar rechts aan de puzzel werken, is het logisch dat de rijen worden weergegeven door arrays. Bij het maken van een tweedimensionale array in

instagram viewer
Robijn (of, beter gezegd, hoe u wilt dat het wordt geadresseerd en wat de gegevens eigenlijk betekenen), moet u beslissen of u een stapel rijen (waarbij elke rij van het raster wordt voorgesteld door een array) of een stapel kolommen (waarbij elke kolom een ​​array is). Omdat we met rijen werken, zullen we rijen kiezen.

Hoe deze 2D-array wordt geroteerd, zullen we bespreken nadat we een dergelijke array hebben gebouwd.

Tweedimensionale arrays construeren

De methode Array.new kan een argument bevatten dat de grootte van de gewenste array definieert. Bijvoorbeeld, Array.new (5) maakt een array van 5 nulobjecten. Het tweede argument geeft je een standaardwaarde, dus Array.new (5, 0) zal je de array geven [0,0,0,0,0]. Dus hoe maak je een tweedimensionale array?

De verkeerde manier, en de manier waarop ik mensen vaak zie proberen is te zeggen Array.new (4, Array.new (4, 0)). Met andere woorden, een reeks van 4 rijen, waarbij elke rij een reeks van 4 nullen is. En dit lijkt eerst te werken. Voer echter de volgende code uit:

Het ziet er simpel uit. Maak een reeks 4x4-nullen, zet het element linksboven op 1. Maar print het en we krijgen ...

Het zet de hele eerste kolom op 1, wat geeft? Toen we de arrays maakten, wordt de binnenste aanroep naar Array.new eerst geroepen, waardoor een enkele rij wordt gemaakt. Een enkele verwijzing naar deze rij wordt vervolgens 4 keer gedupliceerd om de buitenste array te vullen. Elke rij verwijst dan naar dezelfde array. Verander er een, verander ze allemaal.

In plaats daarvan moeten we de derde manier om een ​​array in Ruby te maken. In plaats van een waarde door te geven aan de methode Array.new, geven we een blok door. Het blok wordt elke keer uitgevoerd als de methode Array.new een nieuwe waarde nodig heeft. Dus als je het zou zeggen Array.new (5) {gets.chomp}, Ruby stopt en vraagt ​​vijf keer om invoer. We hoeven dus alleen maar een nieuwe array in dit blok te maken. Dus we eindigen met Array.new (4) {Array.new (4,0)}. Laten we die test opnieuw proberen.

En het doet precies wat je zou verwachten.

Dus hoewel Ruby geen ondersteuning biedt voor tweedimensionale arrays, kunnen we nog steeds doen wat we nodig hebben. Vergeet niet dat de array op het hoogste niveau geldt referenties naar de subarrays, en elke subarray moet verwijzen naar een andere reeks waarden.

Wat deze array vertegenwoordigt, is aan jou. In ons geval is deze array als rijen ingedeeld. De eerste index is de rij die we indexeren, van boven naar beneden. Om de bovenste rij van de puzzel te indexeren, gebruiken we a [0], om de volgende rij naar beneden te indexeren een [1]. Om een ​​specifieke tegel in de tweede rij te indexeren, gebruiken we a [1] [n]. Als we echter hadden besloten tot kolommen... zou het hetzelfde zijn. Ruby heeft geen idee wat we met deze gegevens doen en aangezien het technisch gezien geen tweedimensionale arrays ondersteunt, is wat we hier doen een hack. Toegang alleen via conventie en alles zal bij elkaar houden. Vergeet wat de gegevens eronder zouden moeten doen en alles kan heel snel uit elkaar vallen.

instagram story viewer