Les tables et las boucles for avec love2d

Les tables sont basiquement des listes dans lesquelles nous pouvons stocker des valeurs.

Vous créez des tables avec des accolades ({ }) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function love.load()
  fruits = {}
end

function love.update()

end

function love.draw()

end

Nous venons juste de créer une table nommée fruits. Maintenant, nous avons besoin de stocker des valeurs à l’intérieur. Il y a plusieurs façons de faire.

La première possibilité est de mettre des valeurs entre les parenthèses :

1
2
3
4
function love.load()
  -- Chaque valeur est séparée par une virgule, comme avec les paramètres et les arguments
  fruits = {"apple", "banana"}
end

Nous pouvons aussi utiliser la fonction table.insert. Le premier argument de la fonction est la table et le second argument, la valeur que nous souhaitons enregistrer à l’intérieur de celle-ci :

1
2
3
4
5
function love.draw()
  -- Chaque valeur est séparée par une virgule, comme pour les paramètres et les arguments
  fruits = {"apple", "banana"}
  table.insert(fruits, "pear")
end

Alors maintenant, après avoir exécuté love.load, notre table contient :

  • « apple »
  • « banana »
  • « pear » Pour le prouver, affichons les données à l’écran. Pour ça, nous allons utiliser love.graphics.print :
1
2
3
4
function love.draw()
  -- Arguments: (string, x-position, y-position)
  love.graphics.print("Test", 100, 100)
end

Quand vous lancez le jeu, vous devriez voir le texte “test” d’écrit. Nous pouvons accéder aux valeurs de notre table en écrivant le nom de la table suivi de crochets ([ ]) (Pas des accolades ni des parenthèses mais bien des crochets). Dans ces crochets, nous écrivons le chiffre que nous voulons. Il indique la position dans le tableau et à quoi il correspond

Représentation d’une table en lua
Représentation d’une table en lua

Comme je l’ai dit, les tables sont une liste de valeurs. Nous avons mis “apple” puis “banana” donc ils sont en première et seconde position dans la liste. Ensuite nous avons ajouté “pear”. Il est donc placé à la 3ème position dans la liste. En position 4, il n’y a pas de valeur (pas encore) puisque nous n’avons que 3 valeurs. Donc si nous voulons afficher “apple”, nous devons donner la 3ème position de la liste :

1
2
3
function love.draw()
  love.graphics.print(fruits[3], 100, 100)
end

Maintenant nous voulons dessiner les 3 fruits. Nous pouvons utiliser love.graphics.print 3 fois avec une entrée différente de la table … :

1
2
3
4
5
function love.draw()
  love.graphics.print(fruits[1], 100, 100)
  love.graphics.print(fruits[2], 100, 200)
  love.graphics.print(fruits[3], 100, 300)
end

… mais imaginons si nous avons 100 valeurs de la table à afficher. Heureusement nous avons une solution pour ça : la boucle for !

La boucle for

La boucle for est une solution pour répéter une partie de code un certain nombre de fois. On crée une boucle for comme ceci :

1
2
3
4
5
6
7
8
function love.load()
  fruits = {"apple", "banana"}
  table.insert(fruits, "pear")

  for i=1, 10 do
    print("hello", i)
  end
end

Si vous exécutez le jeu vous devriez voir s’afficher hello 1, hello 2, hello 3 … jusqu’à 10.

Pour créer une boucle for, il faut écrire for en premier. Ensuite, vous devez écrire une variable et donner une valeur numérique. C’est là que la boucle for commence. La variable peut avoir n’importe quel nom mais il est commun de l’appeler i. La variable ne peut être utilisé qu’à l’intérieur de la boucle for (comme les fonctions et leurs paramètres). Ensuite, vous écrivez le nombre de fin de boucle.
Donc par exemple for i=6, 18 do commencera à 6 et bouclera jusqu’à ce que i ait la valeur 18.

Il y a aussi une 3ème valeur qui est un nombre facultatif. C’est la valeur d’incrémentation entre chaque boucle. for i=6, 18, 4 do donnera comme valeur de i : 6, 10, 14, 18. Avec ça, vous pouvez faire une boucle qui décrémente avec -1.

Notre tables commence à 1 et à 3 valeurs donc elle s’écrit :

1
2
3
4
5
6
7
8
function love.load()
  fruits = {"apple", "banana"}
  table.instert(fruits, "pear")

  for i=1, 3 do
    print(fruits[i])
  end
end

Quand vous exécutez le jeu, vous allez voir s’afficher les 3 fruits. Dans la première boucle, le programme affiche fruits[1], puis dans la seconde fruits[2] et pour finir fruits[3].

Édition de table

Mais que faire si nous voulons ajouter ou supprimer une valeur de la table ?
Nous devrions changer le 3 par un autre nombre. Pour ça, nous allons utiliser #fruits. Avec le signe #, nous obtenons la taille de la table :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fonction love.load()
  fruits = {"apple", "banana"}
  table.insert(fruits, "pear")

  print(#fruits)
  -- Output: 3

  for i=1, #fruits do
    print(fruits[i])
  end
end

Utilisons cette connaissance pour dessiner les 3 fruits non plus en console mais dans la fenêtre de jeu :

1
2
3
4
5
function love.draw()
  for i=1, #fruits do
    love.graphics.print(fruits[i], 100, 100)
  end
end

Si vous lancez le jeu, vous devriez voir les 3 noms dessinés, sauf qu’ils sont tous sur la même position! Nous pouvons résoudre ça en les affichant sur différentes hauteurs :

1
2
3
4
5
function love.draw()
  for i=1, #fruits do
    love.graphics.print(fruits[i], 100, 100 + 50 * i)
  end
end

Maintenant, « apple » sera dessiné sur la position y $100+50×1=150$. Ensuite “banana” sera en 200 et “pear” en 250.

Si nous ajoutons un autre fruit, nous n’aurons rien besoin de changer. Le décalage vers le bas se fera automatiquement. Ajoutons « pineapple » pour essayer :

1
2
3
4
5
function love.load()
  fruits = {"apple", "banana"}
  table.insert(fruits, "pear")
  table.insert(fruits, "pineapple")
end

Maintenant que nous savons ajouter des éléments dans une table, il serait bon de pouvoir supprimer des valeurs de celle-ci. Pour cela, nous utilisons table.remove. Le premier argument est la table dans laquelle nous voulons enlever quelque chose et le second argument, la position de l’élément à supprimer donc, si nous voulons supprimer banana nous ferons comme suit :

1
2
3
4
5
6
function love.load()
  fruits = {"apple", "banana"}
  table.insert(fruits, "pear")
  table.insert(fruits, "pineapple")
  table.remove(fruits, 2)
end

Lorsque nous lancerons le jeu, nous verrons que banana n’est plus dessiné et que pear et pineapple ont été déplacés vers le haut.

Représentation de la table modifiée
Représentation de la table modifiée

Quand vous supprimer une valeur dans une table avec table.remove, tous les éléments de la table sont remontés donc ce qui était en position 3 sera en position 2 et se qui était en position 4 sera en 3 … .

Vous pouvez aussi ajouter ou changer des valeurs directement dans la table. Par exemple, nous pouvons changer “apple” en “tomato” :

1
2
3
4
5
6
7
8
function love.load()
  fruits = {"apple", "banana"}
  table.insert(fruits, "pear")
  table.insert(fruits, "pineapple")
  table.remove(fruits, 2)
  -- La valeur en position 1 de la table va devenir "tomato"
  fruits[1] = "tomato"
end

ipairs

Revenons à la boucle for. Il y a une autre façon et un moyen plus simple de parcourir la table en utilisant ipairs :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
function love.load()
  fruits = {"apple", "banana"}
  table.insert(fruits, "pear")
  table.insert(fruits, "pineapple")
  table.remove(fruits, 2)
  fruits[1] = "tomato"

  for i, v in ipairs(fruits) do
    print(i, v)
  end

  -- Output:
  -- 1, "tomato"
  -- 2, "pear"
  -- 3, "pineapple"
end

Cette boucle for est ce que nous appelons une itération et elle se fait sur toute la table. La variables i nous donne la position et v la valeur à cette position. C’est essentiellement un raccourci au lieu de mettre fruits[i]. Par exemple, dans la première itération, les valeurs des variables i seraient 1 et v serait « apple ». Dans la deuxième itération, i et v seraient respectivement 2 et « pear ».

Mais comment ça fonctionne ?
Pourquoi la fonction ipairs permet-elle cela ?
C’est pour une autre fois. Pour l’instant, tout ce que vous devez savoir, c’est que ipairs est essentiellement un raccourci pour les éléments suivants :

1
2
3
for i=1, #fruits do
    v = fruits[i]
end

Utilisons ipairs pour dessiner notre table :

1
2
3
4
5
6
function love.draw()
  -- i et v sont des variables et nous pouvons les nommer comme nous le voulons
  for i, frt in ipairs(fruits) do
    love.graphics.print(frt, 100, 100 + 50 * i)
  end
end

Résumé

Les tables sont des listes dans lesquelles nous pouvons stocker des valeurs. Nous les stockons à la création, avec table.insert ou avec table_name[1] = “une valeur”. Nous pouvons obtenir la taille de la table avec le symbole # comme ceci : #table_name.
Avec des boucles for, nous pouvons répéter des morceaux de code un certain nombre de fois. Nous pouvons aussi utiliser une boucle for pour itérer (parcourir) une table.