demineur92300
-
1 avril 2013 à 13:51
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 2022
-
1 avril 2013 à 18:01
Bonjour
Je suis sensé faire un jeu de démineur en langage python pour la spécialité d'informatique et science du numérique en Terminale S
Mon programme est en deux partie, chacune peux tourner de façon indépendant.
Il rencontre l'erreur suivante:
Traceback (most recent call last):
File "C:\Users\Jean-Paul\Desktop\2-copie.py", line 201, in <module>
Initiale()
File "C:\Users\Jean-Paul\Desktop\2-copie.py", line 199, in Initiale
Comparaison_en_chaine(colonne,ligne,mines,Liste_mines_xy)
File "C:\Users\Jean-Paul\Desktop\2-copie.py", line 162, in Comparaison_en_chaine
erreur=Comparaison_entre_utilisateur_et_mines(erreur,colonne,ligne,Liste_mines_xy)
File "C:\Users\Jean-Paul\Desktop\2-copie.py", line 148, in Comparaison_entre_utilisateur_et_mines
for i in range(len(Liste_Transitoire)):
TypeError: object of type 'NoneType' has no len()
Voici mes lignes de codes (les deux parties)
Importation des bibliothéque nécéssaire
from turtle import *
from random import randrange
# On définie la grille du démineur
def ligne_de_carre(largeur_du_carre,colonne,ligne):
# On trace une grille c'est à des traits verticaux et horizontaux
# Initialisation
angle=90
distance_Nombre=10
distance_X=(-largeur_du_carre*ligne*colonne)/(2*(ligne))
distance_Y=colonne*largeur_du_carre/4
# On trace les lignes horizontales
for i in range(ligne+1):
up()
# On écrit le niméro de la ligne
if i<ligne:
goto(distance_X-distance_Nombre,
-i*largeur_du_carre+distance_Y-2*distance_Nombre)
write(i+1)
# On se place au points origines
goto(distance_X,-i*largeur_du_carre+distance_Y)
down()
# La longueur est tracé ici
forward(largeur_du_carre*colonne)
right(angle)
# On trace les traits verticaux
for i in range(colonne+1):
up()
# On écrit le numéro de la colonne
if i<colonne:
goto(distance_X+largeur_du_carre*i+distance_Nombre,distance_Y)
backward(distance_Nombre)
write(i+1)
# On se place au points origines
goto(distance_X+largeur_du_carre*i,distance_Y)
down()
# La longueur est tracé ici
forward(largeur_du_carre*ligne)
# On définie la position des mines
def creation_des_mines_x(mines,colonne):
# On définie l'emplacement des mines
Liste_mines_x = []
compteur_mines=0
while compteur_mines<mines+1:
# On enregistre dans une liste les différentes abscisse de x
abcisse_x=randrange(1,colonne+1)
Liste_mines_x.append(abcisse_x)
compteur_mines=compteur_mines+1
return Liste_mines_x
def creation_des_mines_y(ligne,mines):
# On définie l'emplacement des mines
Liste_mines_y = []
compteur_mines=0
while compteur_mines<mines+1:
# On enregistre dans une liste les différentes ordonnées de y
ordonnee_y=randrange(ligne+1)
Liste_mines_y.append(ordonnee_y)
compteur_mines=compteur_mines+1
return Liste_mines_y
def maximun(l):
maxi = l[0]# Initialisation
for i in range(len(l)):# i prend chaque valeur de la liste
if l[i] > maxi:# tant que i est infériéur au chiffre maximun de la liste
maxi=l[i]
return maxi
def tri_selection(l):
k=[]
for i in range(len(l)):
# On trie la liste
maxi=maximun(l)
l.remove(maxi)
k.append(maxi)
k.reverse()
return k
def vérification(colonne,ligne,Liste_mines_xy):
for i in range(colonne*ligne):
# On compte le nombre de fois qu'il y a l'élément i
nombre=Liste_mines_xy.count(i)
# On crée un nombre si on le trouve i en double
if nombre>1:
nombre_de_remplacement=randrange(colonne*ligne)
Liste_mines_xy.remove(i)
Liste_mines_xy.append(nombre_de_remplacement)
tri_selection(Liste_mines_xy)
# On vérifie à nouveau
vérification(colonne,ligne,Liste_mines_xy)
return Liste_mines_xy
def melange_des_listes_mines(mines,colonne,ligne):
# On crée une liste contenant une liste contenant absisse et ordonnée
Liste_mines_x=creation_des_mines_x(mines,colonne)
Liste_mines_y=creation_des_mines_y(ligne,mines)
# On mélange les mines de des listes Liste_mines_x Liste_mines_y
Liste_mines_xy=[]
for i in range(mines):
x=Liste_mines_x.pop(1)
y=Liste_mines_y.pop(1)
xy=x*10+y
Liste_mines_xy.append(xy)
# On tri la liste
Liste_mines_xy=tri_selection(Liste_mines_xy)
# On vérifie qu'il n'y a pas deux mines au même emplacement
Liste_mines_xy=vérification(colonne,ligne,Liste_mines_xy)
return Liste_mines_xy
def Nombre_donnee_par_l_utilisateur(colonne,ligne):
print("Pour indiquer le choix de votre case,"
"veuillez utilisez la méthode suivante:\n"
"Vous allez mettre en premier le numéro de la colonne,\n"
" puis le numéro de la ligne:"
" comme ceci 49"
" cela implique la colone 4 et la ligne 9")
# L'utilisateur donne un nombre
comparaison=int(input())
if comparaison>((colonne*10)+ligne):
print("Vous ne pouvez faire cela.")
Nombre_donnee_par_l_utilisateur()
else:
return comparaison
def couleur(erreur):
if erreur==1:
x=int(comparaison/10)
y=comparaison-x*10
up()
goto(x,y)
angle=90
couleur='red'
down()
for i in range(4):
forward(largeur_du_carre)
left(angle)
fill(couleur)
def Comparaison_entre_utilisateur_et_mines(erreur,colonne,ligne,Liste_mines_xy):
# On récupére la valeur donné par l'utilisateur
comparaison=Nombre_donnee_par_l_utilisateur(colonne,ligne)
Liste_Transitoire=Liste_mines_xy
# On compare entre l'utilisateur et la position des mines
for i in range(len(Liste_Transitoire)):
if comparaison==i:
print("Vous avez fait une erreur")
erreur=1+erreur
else:
erreur=0+erreur
couleur(erreur)
return erreur
def Comparaison_en_chaine(colonne,ligne,mines,Liste_mines_xy):
Aire=(colonne*ligne)-mines
compteur=0
erreur=0
while compteur<Aire:
erreur=Comparaison_entre_utilisateur_et_mines(erreur,colonne,ligne,Liste_mines_xy)
compteur=compteur+1
if erreur==1:
break
def Initiale():# On lance cette fonction au début.
# Variable utilisé de façon général
largeur_du_carre=30
print("Quelle niveau de démineur voulez vous?\n"
"Pour le nieau facile c'est 1,\n"
"alors que le niveau intermédiaire c'est 2,\n"
"et le niveau difficile c'est 3.")
# Choix de l'utilisateur pour un degré de difficulté
niveau_de_difficultee=int(input())
if niveau_de_difficultee 1 or niveau_de_difficultee 2 or niveau_de_difficultee ==3:
# On fait correspondre le programme et le choix de l'uilisateur.
if niveau_de_difficultee==1:# Difficulté facile
# Paramétrage de début
ligne=9
colonne=9
mines=10
elif niveau_de_difficultee==2:# Difficulté moyen
# Paramétrage de début
ligne=16
colonne=16
mines=40
elif niveau_de_difficultee==3:# Difficulté difficile
# Paramétrage de début
ligne=16
colonne=30
mines=99
else:# Cas ou l'utlisateur se trompe
print("Reliser l'énoncé")
# On lance l'exécution de la grille
ligne_de_carre(largeur_du_carre,colonne,ligne)
# On vérifie qu'il n'y a pas d'erreur dans ce que dit l'utilisateur
Comparaison_en_chaine(colonne,ligne,mines)
Initiale()
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 202274 1 avril 2013 à 18:01
Bonjour,
[i]for i in range(len(Liste_Transitoire)):
TypeError: object of type 'NoneType' has no len() /i
Il semblerait que "Liste_Transitoire" qui est censé être un objet de type LIST a changé de type en cours de route et est devenu un objet NoneType.
Un objet NoneType n'a pas de méthodes ni d'attribut.
Pourquoi "Liste_Transitoire" aurait changé de type?
3 pistes:
1-)ligne 199 vous appelez la fonction "Comparaison_en_chaine(colonne,ligne,mines)" avec 3 paramètres, mais la définition de la fonction (ligne 157) est prévue pour en recevoir 4.
2-)Si vous rajoutez le paramètre absent "Liste_mines_xy" dans la fonction appelante il y aura plantage car la variable "Liste_mines_xy" n'est pas visible depuis la fonction appelée.
> Toute variable définie dans une fonction a une portée locale, pour lui donner une portée globale il faudra utiliser l'instruction GLOBAL.
3-)Ligne 146 ( Liste_Transitoire=Liste_mines_xy) vous recopiez une liste dans une autre en pensant obtenir 2 objets différents, c'est une erreur!
Python utilise les références aux objets voici un bout de code qui vous permettra de comprendre:
lst_A = ["a", "b","c","d"]
#2 contenants pour un mème objet/valeur
lst_B = lst_A
print("lst_A :",type(lst_A), id(lst_A))
print("lst_B :",type(lst_B), id(lst_B))
#2 contenants pour un 2 objets/valeur différents
lst_B = list(lst_A)
print()
print("lst_A :",type(lst_A), id(lst_A))
print("lst_B :",type(lst_B), id(lst_B))