Crearea de două dimensiuni în rubin

Articolul următor face parte dintr-o serie. Pentru mai multe articole din această serie, consultați Clonarea jocului 2048 în Rubin. Pentru codul complet și final, consultați graficul.

Acum că știm cum va funcționa algoritmul, este timpul să ne gândim la datele la care va funcționa acest algoritm. Există două opțiuni principale aici: un apartament mulțime de un fel sau un tablou bidimensional. Fiecare are avantajele sale, dar înainte de a lua o decizie, trebuie să ținem cont de ceva.

Puzzle-uri uscate

O tehnică obișnuită în lucrul cu puzzle-uri bazate pe grilă unde trebuie să căutați modele de genul acesta este să scrieți unul versiune a algoritmului care funcționează pe puzzle de la stânga la dreapta și apoi rotiți întregul puzzle în jurul a patru ori. În acest fel, algoritmul trebuie scris doar o dată și trebuie să funcționeze doar de la stânga la dreapta. Acest reduce dramatic complexitatea și dimensiunea din partea cea mai grea a acestui proiect.

Deoarece vom lucra la puzzle de la stânga la dreapta, este logic să avem rândurile reprezentate de tablouri. Când faceți un tablou bidimensional în

instagram viewer
Rubin (sau, mai exact, cum doriți să fie abordate și ce înseamnă de fapt datele), trebuie să decideți dacă doriți o stivă de rânduri (unde fiecare rând al grilei este reprezentat de un tablou) sau o stivă de coloane (unde fiecare coloană este un tablou). Deoarece lucrăm cu rânduri, vom alege rânduri.

Cum este rotit acest tablou 2D, vom ajunge după ce vom construi efectiv un astfel de tablou.

Construirea arăturilor bidimensionale

Metoda Array.new poate lua un argument care definește dimensiunea tabletei pe care doriți. De exemplu, Array.new (5) va crea o serie de 5 obiecte nule. Al doilea argument vă oferă o valoare implicită, deci Array.new (5, 0) vă va oferi tabloul [0,0,0,0,0]. Deci cum creezi un tablou bidimensional?

Calea greșită și modul în care văd oamenii care încearcă des este să spun Array.new (4, Array.new (4, 0)). Cu alte cuvinte, un tablou de 4 rânduri, fiecare rând fiind un tablou de 4 zero. Și asta pare să funcționeze la început. Cu toate acestea, rulați următorul cod:

Pare simplu. Alcătuiți o gamă 4x4 de zero, setați elementul din stânga sus pe 1. Dar tipărește-l și primim ...

A setat întreaga primă coloană la 1, ce dă? Când am făcut matricile, cel mai mult apel interior la Array.new este apelat mai întâi, făcând un singur rând. O singură referință la acest rând este apoi dublată de 4 ori pentru a umple matricea din exterior. Fiecare rând se referă apoi la același tablou. Schimbă unul, schimbă-le pe toate.

În schimb, trebuie să folosim al treilea mod de a crea un tablou în Ruby. În loc să trecem o valoare la metoda Array.new, trecem un bloc. Blocul este executat de fiecare dată când metoda Array.new are nevoie de o nouă valoare. Deci, dacă ar fi să spui Array.new (5) {gets.chomp}, Ruby se va opri și va cere intrare de 5 ori. Deci, tot ce trebuie să facem este să creăm doar un nou tablou în acest bloc. Deci terminăm cu Array.new (4) {Array.new (4,0)}. Acum, să încercăm din nou cazul de testare.

Și face așa cum v-ați aștepta.

Deci, chiar dacă Ruby nu are suport pentru matricile bidimensionale, putem totuși face ceea ce avem nevoie. Amintiți-vă doar că păstrează nivelul de nivel superior referințe la sub-tablouri și fiecare sub-tablou ar trebui să se refere la o serie diferită de valori.

Ceea ce reprezintă acest tablou depinde de dvs. În cazul nostru, acest tablou este prezentat ca rânduri. Primul index este rândul pe care îl indexăm, de sus în jos. Pentru a indexa rândul de sus al puzzle-ului, folosim o [0], pentru a indexa următorul rând pe care îl folosim o [1]. Pentru a indexa o țiglă specifică din al doilea rând, folosim o [1] [n]. Totuși, dacă am fi hotărât despre coloane... ar fi același lucru. Ruby nu are nici o idee despre ce facem cu aceste date și, din moment ce nu suportă tehnic tablouri bidimensionale, ceea ce facem aici este un hack. Accesați-l doar prin convenție și totul va ține împreună. Uită ce se presupune că ar face datele de dedesubt și totul poate să se desprindă rapid.

instagram story viewer