Démineur

Résolu
demineur92300 - 1 avril 2013 à 13:51
lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 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()

1 réponse

lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 novembre 2022 77
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))


Bonne continuation
1
Rejoignez-nous