Δημιουργία δύο διαστάσεων Arrays σε Ruby

Το ακόλουθο άρθρο είναι μέρος μιας σειράς. Για περισσότερα άρθρα αυτής της σειράς, ανατρέξτε στην ενότητα Κλωνοποίηση του παιχνιδιού 2048 στο Ruby. Για τον πλήρη και τελικό κώδικα, δείτε την ουσία.

Τώρα που ξέρουμε πώς θα λειτουργήσει ο αλγόριθμος, ήρθε η ώρα να σκεφτούμε τα δεδομένα που θα λειτουργήσει αυτός ο αλγόριθμος. Υπάρχουν δύο κύριες επιλογές εδώ: ένα επίπεδο πίνακας κάποιου είδους ή μια δισδιάστατη συστοιχία. Ο καθένας έχει τα πλεονεκτήματά του, αλλά πριν πάρουμε μια απόφαση, πρέπει να λάβουμε υπόψη κάτι.

ΞΥΡΕΣ ΠΑΙΧΝΙΔΙΑ

Μια κοινή τεχνική στην εργασία με πλέγματα με βάση το πλέγμα, όπου πρέπει να αναζητήσετε σχέδια όπως αυτό είναι να γράψετε ένα έκδοση του αλγορίθμου που λειτουργεί στο παζλ από αριστερά προς τα δεξιά και στη συνέχεια περιστρέψτε ολόκληρο το παζλ γύρω από τέσσερα φορές. Με αυτόν τον τρόπο, ο αλγόριθμος πρέπει να γράφεται μόνο μία φορά και πρέπει μόνο να λειτουργεί από αριστερά προς τα δεξιά. Αυτό μειώνει δραματικά την πολυπλοκότητα και το μέγεθος από το πιο δύσκολο μέρος αυτού του έργου.

instagram viewer

Δεδομένου ότι θα δουλεύουμε στο παζλ από αριστερά προς τα δεξιά, είναι λογικό να έχουμε τις σειρές που αντιπροσωπεύονται από πίνακες. Όταν δημιουργείτε μια δισδιάστατη διάταξη Ρουμπίνι (ή, με μεγαλύτερη ακρίβεια, πώς θέλετε να αντιμετωπιστεί και τι πραγματικά σημαίνει τα δεδομένα), πρέπει να αποφασίσετε αν θέλετε μια στοίβα γραμμών (όπου κάθε γραμμή του πλέγματος αντιπροσωπεύεται από μια συστοιχία) ή μια στοίβα από στήλες (όπου κάθε στήλη είναι ένας πίνακας). Εφόσον δουλεύουμε με γραμμές, θα επιλέξουμε γραμμές.

Με ποιον τρόπο περιστρέφεται αυτός ο 2D πίνακας, θα φτάσουμε στο σημείο που θα κατασκευάσουμε αυτόν τον πίνακα.

Κατασκευή διαγραμμάτων δύο διαστάσεων

Η μέθοδος Array.new μπορεί να πάρει ένα επιχείρημα που καθορίζει το μέγεθος του πίνακα που θέλετε. Για παράδειγμα, Array.new (5) θα δημιουργήσει μια σειρά από 5 μηδενικά αντικείμενα. Το δεύτερο επιχείρημα σας δίνει μια προκαθορισμένη τιμή, έτσι Array.new (5, 0) θα σας δώσει τη συστοιχία [0,0,0,0,0]. Πώς δημιουργείτε μια δισδιάστατη διάταξη;

Ο λάθος τρόπος και ο τρόπος που βλέπω ότι οι άνθρωποι προσπαθούν συχνά είναι να πούμε Array.new (4, Array.new (4, 0)). Με άλλα λόγια, μια σειρά από 4 σειρές, κάθε σειρά είναι μια σειρά από 4 μηδενικά. Και αυτό φαίνεται να λειτουργεί πρώτα. Ωστόσο, εκτελέστε τον ακόλουθο κώδικα:

Φαίνεται απλό. Δημιουργήστε μια συστοιχία 4x4 με μηδενικά, ορίστε το πάνω αριστερό στοιχείο στο 1. Αλλά εκτυπώστε το και παίρνουμε ...

Ρυθμίζει ολόκληρη την πρώτη στήλη στο 1, τι δίνει; Όταν δημιουργήσαμε τις συστοιχίες, καλείται πρώτα η εσωτερική κλήση προς το Array.new, κάνοντας μια μόνο σειρά. Μια απλή αναφορά σε αυτή τη σειρά αντιγράφεται έπειτα 4 φορές για να γεμίσει τον πιο εξωτερικό πίνακα. Στη συνέχεια, κάθε σειρά παραπέμπει στον ίδιο πίνακα. Αλλαγή ενός, αλλάξτε όλα.

Αντ 'αυτού, πρέπει να χρησιμοποιήσουμε το τρίτος τρόπο δημιουργίας ενός πίνακα σε Ruby. Αντί να περάσουμε μια τιμή στη μέθοδο Array.new, περάσαμε ένα μπλοκ. Το μπλοκ εκτελείται κάθε φορά που η μέθοδος Array.new χρειάζεται νέα τιμή. Έτσι, αν το λέγατε Array.new (5) {get.chomp}, Ο Ruby θα σταματήσει και θα ζητήσει εισροές 5 φορές. Επομένως, το μόνο που χρειάζεται να κάνουμε είναι να δημιουργήσουμε μια νέα συστοιχία μέσα σε αυτό το μπλοκ. Έτσι καταλήγουμε Array.new (4) {Array.new (4,0)}. Τώρα ας δοκιμάσουμε ξανά την υπόθεση.

Και το κάνει ακριβώς όπως θα περίμενε κανείς.

Έτσι, παρόλο που ο Ruby δεν υποστηρίζει δισδιάστατες συστοιχίες, μπορούμε ακόμα να κάνουμε αυτό που χρειαζόμαστε. Απλά θυμηθείτε ότι κατέχει τη διάταξη κορυφαίου επιπέδου βιβλιογραφικές αναφορές στις υπο-συστοιχίες και κάθε υπο-συστοιχία θα πρέπει να αναφέρεται σε διαφορετική σειρά τιμών.

Αυτό που αντιπροσωπεύει αυτός ο πίνακας εξαρτάται από εσάς. Στην περίπτωσή μας, αυτή η συστοιχία είναι γραμμένη ως σειρές. Ο πρώτος δείκτης είναι η σειρά που ευρετηριοποιούμε, από πάνω προς τα κάτω. Για να ευρετηριάσουμε την κορυφαία σειρά του παζλ, χρησιμοποιούμε a [0], για να ευρετηριάσουμε την επόμενη σειρά που χρησιμοποιούμε Α'1]. Για να δείξουμε ένα συγκεκριμένο κεραμίδι στη δεύτερη σειρά, χρησιμοποιούμε a [1] [n]. Ωστόσο, αν είχαμε αποφασίσει σε στήλες... θα ήταν το ίδιο πράγμα. Ο Ruby δεν έχει ιδέα τι κάνουμε με αυτά τα δεδομένα και αφού δεν υποστηρίζει τεχνικά δισδιάστατες συστοιχίες, αυτό που κάνουμε εδώ είναι ένα hack. Αποκτήστε πρόσβαση μόνο με σύμβαση και όλα θα κρατηθούν μαζί. Ξεχάστε τι υποτίθεται ότι πρέπει να κάνουν τα δεδομένα κάτω από αυτά και ότι όλα μπορούν να καταρρεύσουν πραγματικά γρήγορα.

instagram story viewer