Démineur [Résolu]

- 1 avril 2013 à 13:51 - Dernière réponse :
Messages postés
96
Date d'inscription
lundi 9 octobre 2006
Dernière intervention
24 février 2018
- 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()
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
96
Date d'inscription
lundi 9 octobre 2006
Dernière intervention
24 février 2018
- 1 avril 2013 à 18:01
1
Merci
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

Merci lespinx 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de lespinx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.