Intéressant

Création de tableaux à deux dimensions en Ruby

Création de tableaux à deux dimensions en Ruby


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

L'article suivant fait partie d'une série. Pour plus d'articles de cette série, voir Cloner le jeu 2048 en Ruby. Pour le code complet et final, voir l'essentiel.

Maintenant que nous savons comment fonctionnera l'algorithme, il est temps de réfléchir aux données sur lesquelles cet algorithme travaillera. Il y a deux choix principaux ici: un tableau plat quelconque ou un tableau bidimensionnel. Chacun a ses avantages, mais avant de prendre une décision, nous devons prendre en compte quelque chose.

DRY Puzzles

Une technique courante dans les casse-têtes basés sur une grille, dans laquelle vous devez rechercher des modèles tels que celui-ci, consiste à écrire une version de l'algorithme qui fonctionne sur le puzzle de gauche à droite, puis à faire pivoter le puzzle entier environ quatre fois. De cette façon, l'algorithme n'a besoin d'être écrit qu'une seule fois et il ne doit fonctionner que de gauche à droite. Cela réduit considérablement la complexité et la taille de la partie la plus difficile de ce projet.

Puisque nous allons travailler sur le puzzle de gauche à droite, il est logique d’avoir les rangées représentées par des tableaux. Lorsque vous créez un tableau à deux dimensions en Ruby (ou, plus précisément, comment vous voulez qu’il soit traité et ce que les données signifient réellement), vous devez décider si vous souhaitez une pile de lignes (où chaque ligne de la grille est représentée par un tableau) ou une pile de colonnes (où chaque colonne est un tableau). Puisque nous travaillons avec des lignes, nous allons choisir des lignes.

La rotation de ce tableau 2D, nous y reviendrons après la construction d'un tel tableau.

Construire des tableaux à deux dimensions

La méthode Array.new peut prendre un argument définissant la taille du tableau souhaité. Par exemple, Array.new (5) créera un tableau de 5 objets nil. Le deuxième argument vous donne une valeur par défaut, donc Array.new (5, 0) va vous donner le tableau 0,0,0,0,0. Alors, comment créez-vous un tableau à deux dimensions?

La mauvaise façon, et la façon dont je vois les gens qui essaient est souvent de dire Array.new (4, Array.new (4, 0)). En d'autres termes, un tableau de 4 lignes, chaque ligne étant un tableau de 4 zéros. Et cela semble fonctionner au début. Cependant, exécutez le code suivant:

Ça a l'air simple. Faites un tableau 4x4 de zéros, réglez l'élément en haut à gauche sur 1. Mais imprimez-le et nous obtenons…

Il met toute la première colonne à 1, que donne-t-il? Lorsque nous avons créé les tableaux, l'appel le plus interne à Array.new est appelé en premier, créant ainsi une seule ligne. Une seule référence à cette ligne est ensuite dupliquée 4 fois pour remplir le tableau le plus externe. Chaque ligne fait ensuite référence au même tableau. Changez-en un, changez-les tous.

Au lieu de cela, nous devons utiliser le troisième manière de créer un tableau en Ruby. Au lieu de transmettre une valeur à la méthode Array.new, nous passons un bloc. Le bloc est exécuté chaque fois que la méthode Array.new nécessite une nouvelle valeur. Donc si vous deviez dire Array.new (5) {gets.chomp}, Ruby s’arrêtera et demandera une contribution 5 fois. Il suffit donc de créer un nouveau tableau à l'intérieur de ce bloc. Donc on se retrouve avec Array.new (4) {Array.new (4,0)}. Maintenant, essayons à nouveau ce cas de test.

Et cela se passe comme vous le souhaitiez.

Ainsi, même si Ruby ne prend pas en charge les tableaux à deux dimensions, nous pouvons toujours faire ce dont nous avons besoin. Rappelez-vous simplement que le tableau de premier niveau tient les références aux sous-tableaux, et chaque sous-tableau doit faire référence à un tableau différent de valeurs.

Ce que ce tableau représente est à vous. Dans notre cas, ce tableau est présenté sous forme de lignes. Le premier index est la ligne que nous indexons, de haut en bas. Pour indexer la rangée supérieure du puzzle, nous utilisons a0, pour indexer la rangée suivante, nous utilisons a1. Pour indexer une tuile spécifique dans la deuxième ligne, nous utilisons a1n. Cependant, si nous avions choisi les colonnes… ce serait la même chose. Ruby n'a aucune idée de ce que nous faisons avec ces données, et comme il ne supporte pas techniquement les tableaux à deux dimensions, nous faisons ici un bidouillage. N'y accédez que par convention et tout va tenir ensemble. Oubliez ce que les données en dessous sont supposées faire et tout peut s'effondrer très rapidement.


Video, Sitemap-Video, Sitemap-Videos