Traceback (most recent call last):
File "nim.py", line 24, in
afficher_tas()
File "nim.py", line 6, in afficher_tas
for allumette in jeu:
NameError: name 'jeu' is not defined
Cette erreur est typique d'une variable locale ( jeu ) non initialisée dans la fonction afficher_tas.
En effet, cette fonction est destinée à l'affichage du tas d'allumettes, codé dans la variable globale tas dans le programme principal.
D'où deux solutions :
def afficher_tas(jeu):
for allumette in jeu:
print(allumette, end = '')
afficher_tas(tas) # ligne 24
Traceback (most recent call last):
File "nim.py", line 27, in
jouer(nombre)
File "nim.py", line 11, in jouer
N = N - nombre
UnboundLocalError: cannot access local variable 'N' where it is not associated with a value
Là, on cherche à modifier la variable globale N dans la fonction jouer, ce qui est bien entendu impossible.
La meilleure solution, comme on l'a vu, est de passer la variable N comme argument lors de l'appel de la fonction jouer, et de lui réaffecter le résultat
renvoyée par cette fonction :
def jouer(N, nombre):
if nombre < 4:
N = N - nombre
return N
N = jouer(N, nombre) # ligne 28
Il ne s'agit pas là d'une erreur, mais d'un problème à l’exécution : l'affichage du tas d'allumettes restantes ne change jamais, il y a toujours 20 allumettes affichées...
L'interprétation est moins évidente, ce qui fait que ce genre d'erreur est plus difficile à détecter : la fonction modifier_tas prend bien la variable globale tas
comme argument, mais dans cette fonction, c'est une autre variable locale, appelée aussi tas, qui est modifiée ( d'où
d'ailleurs cette maladresse d'avoir donné le même nom à ces deux variables...).
Donc, là aussi, la solution est de renvoyer la variable locale tas modifiée, et de réaffecter ce résultat à la variable globale tas :
def modifier_tas(tas):
tas = "|"*N
return tas
tas = modifier_tas(tas) # ligne 30
#################FONCTIONS###################
def creer_tas(N):
return "|"*N
def afficher_tas(jeu):
for allumette in jeu:
print(allumette, end = '')
def jouer(N, nombre):
if nombre < 4:
N = N - nombre
return N
def modifier_tas(tas):
tas = "|"*N
return tas
##########PROGRAMME PRINCIPAL################
N = 20
tas = creer_tas(N)
while N > 0:
print()
afficher_tas(tas)
print()
nombre = int(input("Nombre d'allumette(s) prise(s) (1, 2 ou 3 ) ? "))
N = jouer(N, nombre)
tas = modifier_tas(tas)
print("Gagné !")