You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Je me suis rendue compte que la version de snake.py (avec les modifications du retour du serpent) que j'avais commité à la fin de la séance de mercredi ne fonctionnait pas. Je l'ai donc modifié et j'ai re commit tout à l'heure.
Mon souci, c'est que pour que cela fonctionne, j'ai dû ajouter "global snake", "global fruit", "global direction" au début de presque chaque fonction (ce qui est très moche j'imagine).
Les programmeurs Python n'aiment effectivement pas beaucoup utiliser le mot-clé global quand il est possible de faire autrement. Cela implique que leurs fonctions ont des effets de bords (🇺🇸 side-effects ; cf Wikipedia) sur le reste du programme et il peut être difficile de comprendre et de tester un tel code.
Comment puis-je faire autrement ? Est-ce que c'est parce que je n'initialise pas snake, fruit et direction au bon endroit dans le code ?
Non, ce n'est pas lié au lieu d'initialisation des variables a priori. Plusieurs variantes possibles :
ℹ️ Remarque. On modifie la valeur de la variable state dans move_snake, mais pas son identité. Il est donc inutile de déclarer state globale.
⚠️ Dans ce code, la fonction snake a toujours un effet de bord sur le contenu des variables globales (ici snake) ; il faut lire attentivement le code pour s'en rendre compte (d'autant que maintenant, il n'y a même plus le mot-clé global pour nous faciliter le repérage de l'effet de bord !!!).
Style de programmation fonctionnel
On peut choisir de stocker tout l'état du jeu dans une unique variable globale non (nécessairement) modifiable, par exemple un n-uplet, de le passer explicitement comme argument à la fonction move_snake et de récupérer la valeur mise à jour en sortie :
Dans ce code, la fonction move_snake n'a aucun effet de bord ; sa seule action est de calculer une nouvelle valeur de l'état qu'elle fournit comme valeur de retour.
Pour des raisons de lisibilité, il peut être intéressant de substituer un "n-uplet nommé" (namedtuple) au n-uplet qui décrit l'état, cf par exemple https://realpython.com/python-namedtuple/.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
@clemence64300 écrit
(cf. https://github.com/clemence64300/TP-AP/blob/6339cd32b549402c379db4a07014f060a965d3a6/snake.py)
Les programmeurs Python n'aiment effectivement pas beaucoup utiliser le mot-clé
global
quand il est possible de faire autrement. Cela implique que leurs fonctions ont des effets de bords (🇺🇸 side-effects ; cf Wikipedia) sur le reste du programme et il peut être difficile de comprendre et de tester un tel code.Non, ce n'est pas lié au lieu d'initialisation des variables a priori. Plusieurs variantes possibles :
Changement cosmétique
Sans rien changer d'autre, on peut réduire
en
Aggrégation
On peut choisir de stocker tout l'état du jeu dans une unique variable globale modifiable, par exemple un dictionnaire :
puis transformer
en
ℹ️ Remarque. On modifie la valeur de la variable
state
dansmove_snake
, mais pas son identité. Il est donc inutile de déclarerstate
globale.snake
a toujours un effet de bord sur le contenu des variables globales (icisnake
) ; il faut lire attentivement le code pour s'en rendre compte (d'autant que maintenant, il n'y a même plus le mot-cléglobal
pour nous faciliter le repérage de l'effet de bord !!!).Style de programmation fonctionnel
On peut choisir de stocker tout l'état du jeu dans une unique variable globale non (nécessairement) modifiable, par exemple un n-uplet, de le passer explicitement comme argument à la fonction
move_snake
et de récupérer la valeur mise à jour en sortie :La fonction
move_snake
devientet la boucle générale d'exécution quelque chose comme
ℹ️ Remarques
Dans ce code, la fonction
move_snake
n'a aucun effet de bord ; sa seule action est de calculer une nouvelle valeur de l'état qu'elle fournit comme valeur de retour.Pour des raisons de lisibilité, il peut être intéressant de substituer un "n-uplet nommé" (
namedtuple
) au n-uplet qui décrit l'état, cf par exemple https://realpython.com/python-namedtuple/.Beta Was this translation helpful? Give feedback.
All reactions