Projet "Labyrinthe"

Hugo7700 Messages postés 9 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

J'espère que maintenant c'est bon ?

Bonjour à tous,

J'essaie de faire un petit programme en python où il y a un personnage (un point) qui se déplace dans un labyrinthe. J'essaie de déplacer mon personnage en dessinant à chaque fois un nouveau point dans la case de destination et en "repeignant" la case où il était précédemment.
Cependant, je rencontre quelques problèmes..

1) Quand j'exécute le code, plein de messages d'erreur s'affichent (que je ne comprends pas)
2) Je peux effectuer qu'une seule fois les déplacements.
3) Les déplacements hauts et bas se déroulent très bien (au niveau de l'affichage) mais les déplacements droites et gauches rencontrent un vrai problème.

Je vous joins les fichiers (mon code et le 'plan du chateau').

Mon code :
 

ZONE_PLAN_MINI = (-240, -240)  # Coin inférieur gauche de la zone d'affichage du plan
ZONE_PLAN_MAXI = (50, 200)  # Coin supérieur droit de la zone d'affichage du plan
POINT_AFFICHAGE_ANNONCES = (-240, 240)  # Point d'origine de l'affichage des annonces
POINT_AFFICHAGE_INVENTAIRE = (70, 210)  # Point d'origine de l'affichage de l'inventaire

# Les valeurs ci-dessous définissent les couleurs des cases du plan
COULEUR_CASES = 'white'
COULEUR_COULOIR = 'white'
COULEUR_MUR = 'grey'
COULEUR_OBJECTIF = 'yellow'
COULEUR_PORTE = 'orange'
COULEUR_OBJET = 'green'
COULEUR_VUE = 'wheat'
COULEURS = [COULEUR_COULOIR, COULEUR_MUR, COULEUR_OBJECTIF, COULEUR_PORTE, COULEUR_OBJET, COULEUR_VUE]
COULEUR_EXTERIEUR = 'white'

# Couleur et dimension du personnage
COULEUR_PERSONNAGE = 'red'
RATIO_PERSONNAGE = 0.9  # Rapport entre diamètre du personnage et dimension des cases
POSITION_DEPART = (0, 1)  # Porte d'entrée du château

# Désignation des fichiers de données à utiliser
fichier_plan = 'plan_chateau.txt'
fichier_questions = 'dico_portes.txt'
fichier_objets = 'dico_objets.txt'

# importation du module turtle

import turtle


# Definitions des fonctions utilisées


def lire_matrice(fichier):
    """Transforme un fichier texte sous sa forme matricielle"""
    matrice = []
    f = open(fichier)
    for i in f:
        matrice.append([int(x) for x in i.split()])
    return matrice


def calculer_pas(matrice):
    """Calcule la dimension à donner aux cases pour que le plan tienne dans le zone de la fenêtre turtle"""
    nbre_cases_y = 440 / len(matrice)  # hauteur du rectangle
    nbre_cases_x = 290 / len(matrice[0])  # largeur du rectangle
    if nbre_cases_y < nbre_cases_x:
        pas = nbre_cases_y
    else:
        pas = nbre_cases_x
    return pas


def coordonnees(case, pas):
    """Calcule les coordonées du coin inférieur gauche d'une case définie par ses coordonnées"""
    coo = (-240 + case[1] * pas, (200 - pas) - case[0] * pas)
    return coo


def tracer_carre(dimension):
    """Trace un carré de côté dimension"""
    turtle.setheading(0)
    turtle.down()
    turtle.forward(dimension)
    turtle.left(90)
    turtle.forward(dimension)
    turtle.left(90)
    turtle.forward(dimension)
    turtle.left(90)
    turtle.forward(dimension)
    turtle.left(90)


def tracer_case(case, couleur, pas):
    """Trace une case en fonction du couple de coordonnées d'une case, une couleur et un pas"""
    turtle.setheading(0)
    turtle.up()
    turtle.speed('fastest')
    turtle.tracer(0)
    turtle.goto(case)
    turtle.down()
    turtle.fillcolor(couleur)
    turtle.pencolor(couleur)
    turtle.begin_fill()
    tracer_carre(pas)
    turtle.end_fill()
    turtle.up()


def afficher_plan(matrice):
    """Affiche le plan du château"""
    for x in range(len(matrice)):
        for y in range(len(matrice[0])):
            pas = calculer_pas(matrice)
            case = (x, y)
            case = coordonnees(case, pas)
            j = matrice[x][y]
            if j == 0:
                couleur = 'white'
            elif j == 1:
                couleur = 'grey'
            elif j == 2:
                couleur = 'yellow'
            elif j == 3:
                couleur = 'orange'
            elif j == 4:
                couleur = 'green'
            else:
                couleur = 'white'
            tracer_case(case, couleur, pas)


def deplacer(matrice, position, mouvement):
    """Fonction qui donne la nouvelle coordonée d'une case après un certain mouvement."""
    nv_position = (position[0] + mouvement[0], position[1] + mouvement[1])
    if matrice[nv_position[0]][nv_position[1]] == 1:
        nv_position = position
    if matrice[nv_position[0]][nv_position[1]] < 0:
        nv_position = position
    return nv_position


def deplacer_gauche():
    """Fonction qui déplace le personnage vers la gauche"""
    global matrice, position, pas
    turtle.onkeypress(None, "Left")
    mouvement = (0, -1)
    nv_position = deplacer(matrice, position, mouvement)
    if position == nv_position:
        pass
    else:
        dessine_point(coordonnees(nv_position, pas))
        tracer_case(coordonnees(position, pas), couleur, pas)
        position = nv_position
        print(position)
    turtle.onkeypress(deplacer_gauche(), "Left")


def deplacer_droite():
    """Fonction qui déplace le personnage vers la droite"""
    global matrice, position, pas
    turtle.onkeypress(None, "Right")
    mouvement = (0, 1)
    nv_position = deplacer(matrice, position, mouvement)
    print(nv_position)
    if position == nv_position:
        pass
    else:
        tracer_case(coordonnees(position, pas), couleur, pas)
        position = nv_position
        dessine_point(coordonnees(nv_position, pas))
        print(coordonnees(nv_position, pas))
        position = nv_position
        print(position)
    turtle.onkeypress(deplacer_gauche(), "Right")


def deplacer_haut():
    """Fonction qui déplace le personnage vers le haut"""
    global matrice, position, pas
    turtle.onkeypress(None, "Up")
    mouvement = (-1, 0)
    nv_position = deplacer(matrice, position, mouvement)
    if position == nv_position:
        pass
    else:
        dessine_point(coordonnees(nv_position, pas))
        tracer_case(coordonnees(position, pas), couleur, pas)
        position = nv_position
        print(position)
    turtle.onkeypress(deplacer_gauche(), "Up")


def deplacer_bas():
    """Fonction qui déplace le personnage vers le bas"""
    global matrice, position, pas
    turtle.onkeypress(None, "Down")
    mouvement = (1, 0)
    nv_position = deplacer(matrice, position, mouvement)
    if position == nv_position:
        pass
    else:
        dessine_point(coordonnees(nv_position, pas))
        tracer_case(coordonnees(position, pas), couleur, pas)
        position = nv_position
        print(position)
    turtle.onkeypress(deplacer_gauche(), "Down")


def dessine_point(coo):
    """Fonction qui dessine le perssonage, ici un point."""
    global pas
    turtle.setheading(0)  # Tourne la tête de la tortue vers la droite
    turtle.up()
    turtle.goto(coo)
    turtle.forward(pas / 2)
    turtle.left(90)
    turtle.forward(pas / 2)
    turtle.down()
    turtle.dot(0.9 * pas, COULEUR_PERSONNAGE)


# Attribution des valeurs 'invariables'
matrice = lire_matrice('plan_chateau.txt')
pas = calculer_pas(matrice)
position = (0, 1)
couleur = 'white'

# Corps du programme
afficher_plan(lire_matrice('plan_chateau.txt'))  # Affiche le plan du chateau
dessine_point(coordonnees(position, pas))  # Affiche le personnage à sa position de départ.
turtle.listen()  # Déclenche l’écoute du clavier
turtle.onkeypress(deplacer_gauche, "Left")  # Associe à la touche Left une fonction appelée deplacer_gauche
turtle.onkeypress(deplacer_droite, "Right")
turtle.onkeypress(deplacer_haut, "Up")
turtle.onkeypress(deplacer_bas, "Down")
turtle.mainloop()  # Place le programme en position d’attente d’une action du joueur


plan_chateau.txt :

1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 4 0 0 1
1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1
1 0 0 0 3 0 1 0 0 0 1 0 1 0 0 0 0 0 1
1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 3 0 0 0 0 0 0 0 1
1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1
1 4 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1
1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 0 0 1 0 3 0 0 0 1
1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1
1 0 0 0 3 0 1 4 0 0 1 0 0 0 1 0 0 4 1
1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1
1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1
1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1
1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1
1 1 1 3 1 0 1 0 1 1 1 1 1 3 1 0 1 1 1
1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1
1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1
1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1
1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1
1 0 0 0 3 0 0 0 3 0 1 0 0 0 1 0 1 0 1
1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1
1 0 0 0 1 4 0 0 1 0 3 0 0 0 1 0 0 0 1
1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1
1 4 0 0 0 0 1 0 0 0 1 0 0 0 1 0 3 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1



Merci d'avance pour votre aide !

3 réponses

  1. Hugo7700 Messages postés 9 Statut Membre 2
     

    .

    2
    1. madmyke Messages postés 52304 Date d'inscription   Statut Modérateur Dernière intervention   12 485
       

      Bonjour

      Ceci ne serait-il pas un exercice provenant de l'ULB à Bruxelles ?
      Si oui je vous rappelle qu'il y a des restrictions de publication sur ces lignes de code.

      Bàv

      0
  2. Makhoul
     
    ya des parentheses que tu dois retirer et sa devrai marcher
    2
    1. Dev
       
      Pouvez-vous spécifier la ligne où les parenthèses doivent être retirées ?
      0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     

    Bonjour,

    Le principale problème est que tu fais des turtle.onkeypress() alors que le programme est en train de tourner. Il faut les faire une fois pour toute avant de lancer turtle.mainloop(). 

    Ensuite, ta fonction deplacer ne semble pas cohérente avec ta matrice.

    Voici à quoi ça pourrait ressembler :

    ZONE_PLAN_MINI = (-240, -240)  # Coin inférieur gauche de la zone d'affichage du plan
    ZONE_PLAN_MAXI = (50, 200)  # Coin supérieur droit de la zone d'affichage du plan
    POINT_AFFICHAGE_ANNONCES = (-240, 240)  # Point d'origine de l'affichage des annonces
    POINT_AFFICHAGE_INVENTAIRE = (70, 210)  # Point d'origine de l'affichage de l'inventaire
    
    # Les valeurs ci-dessous définissent les couleurs des cases du plan
    COULEUR_CASES = 'white'
    COULEUR_COULOIR = 'white'
    COULEUR_MUR = 'grey'
    COULEUR_OBJECTIF = 'yellow'
    COULEUR_PORTE = 'orange'
    COULEUR_OBJET = 'green'
    COULEUR_VUE = 'wheat'
    COULEURS = [COULEUR_COULOIR, COULEUR_MUR, COULEUR_OBJECTIF, COULEUR_PORTE, COULEUR_OBJET, COULEUR_VUE]
    COULEUR_EXTERIEUR = 'white'
    
    # Couleur et dimension du personnage
    COULEUR_PERSONNAGE = 'red'
    RATIO_PERSONNAGE = 0.9  # Rapport entre diamètre du personnage et dimension des cases
    POSITION_DEPART = (0, 1)  # Porte d'entrée du château
    
    # Désignation des fichiers de données à utiliser
    fichier_plan = 'plan_chateau.txt'
    fichier_questions = 'dico_portes.txt'
    fichier_objets = 'dico_objets.txt'
    
    # importation du module turtle
    
    import turtle
    
    
    # Definitions des fonctions utilisées
    
    
    def lire_matrice(fichier):
        """Transforme un fichier texte sous sa forme matricielle"""
        matrice = []
        f = open(fichier)
        for i in f:
            matrice.append([int(x) for x in i.split()])
        return matrice
    
    
    def calculer_pas(matrice):
        """Calcule la dimension à donner aux cases pour que le plan tienne dans le zone de la fenêtre turtle"""
        nbre_cases_y = 440 / len(matrice)  # hauteur du rectangle
        nbre_cases_x = 290 / len(matrice[0])  # largeur du rectangle
        if nbre_cases_y < nbre_cases_x:
            pas = nbre_cases_y
        else:
            pas = nbre_cases_x
        return pas
    
    
    def coordonnees(case, pas):
        """Calcule les coordonées du coin inférieur gauche d'une case définie par ses coordonnées"""
        coo = (-240 + case[1] * pas, (200 - pas) - case[0] * pas)
        return coo
    
    
    def tracer_carre(dimension):
        """Trace un carré de côté dimension"""
        turtle.setheading(0)
        turtle.down()
        turtle.forward(dimension)
        turtle.left(90)
        turtle.forward(dimension)
        turtle.left(90)
        turtle.forward(dimension)
        turtle.left(90)
        turtle.forward(dimension)
        turtle.left(90)
    
    
    def tracer_case(case, couleur, pas):
        """Trace une case en fonction du couple de coordonnées d'une case, une couleur et un pas"""
        turtle.setheading(0)
        turtle.up()
        turtle.speed('fastest')
        turtle.tracer(0)
        turtle.goto(case)
        turtle.down()
        turtle.fillcolor(couleur)
        turtle.pencolor(couleur)
        turtle.begin_fill()
        tracer_carre(pas)
        turtle.end_fill()
        turtle.up()
    
    
    def afficher_plan(matrice):
        """Affiche le plan du château"""
        for x in range(len(matrice)):
            for y in range(len(matrice[0])):
                pas = calculer_pas(matrice)
                case = (x, y)
                case = coordonnees(case, pas)
                j = matrice[x][y]
                if j == 0:
                    couleur = 'white'
                elif j == 1:
                    couleur = 'grey'
                elif j == 2:
                    couleur = 'yellow'
                elif j == 3:
                    couleur = 'orange'
                elif j == 4:
                    couleur = 'green'
                else:
                    couleur = 'white'
                tracer_case(case, couleur, pas)
    
    
    def deplacer(matrice, position, mouvement):
        """Fonction qui donne la nouvelle coordonée d'une case après un certain mouvement."""
        nv_position = (position[0] + mouvement[0], position[1] + mouvement[1])
        if matrice[nv_position[0]][nv_position[1]] != 0:
            print(f"!!", position, matrice[position[0]][position[1]], "-->",  nv_position, matrice[nv_position[0]][nv_position[1]])
            nv_position = position
        else:
            print("mv", position, "-->", nv_position)
        return nv_position
    
    
    def deplacer_gauche():
        """Fonction qui déplace le personnage vers la gauche"""
        global matrice, position, pas
        mouvement = (0, -1)
        nv_position = deplacer(matrice, position, mouvement)
        if position == nv_position:
            pass
        else:
            dessine_point(coordonnees(nv_position, pas))
            tracer_case(coordonnees(position, pas), couleur, pas)
            position = nv_position
    
    
    def deplacer_droite():
        """Fonction qui déplace le personnage vers la droite"""
        global matrice, position, pas
        mouvement = (0, 1)
        nv_position = deplacer(matrice, position, mouvement)
        if position == nv_position:
            pass
        else:
            tracer_case(coordonnees(position, pas), couleur, pas)
            position = nv_position
            dessine_point(coordonnees(nv_position, pas))
            position = nv_position
    
    
    def deplacer_haut():
        """Fonction qui déplace le personnage vers le haut"""
        global matrice, position, pas
        mouvement = (-1, 0)
        nv_position = deplacer(matrice, position, mouvement)
        if position == nv_position:
            pass
        else:
            dessine_point(coordonnees(nv_position, pas))
            tracer_case(coordonnees(position, pas), couleur, pas)
            position = nv_position
    
    
    def deplacer_bas():
        """Fonction qui déplace le personnage vers le bas"""
        global matrice, position, pas
        mouvement = (1, 0)
        nv_position = deplacer(matrice, position, mouvement)
        if position == nv_position:
            pass
        else:
            dessine_point(coordonnees(nv_position, pas))
            tracer_case(coordonnees(position, pas), couleur, pas)
            position = nv_position
    
    
    def dessine_point(coo):
        """Fonction qui dessine le perssonage, ici un point."""
        global pas
        turtle.setheading(0)  # Tourne la tête de la tortue vers la droite
        turtle.up()
        turtle.goto(coo)
        turtle.forward(pas / 2)
        turtle.left(90)
        turtle.forward(pas / 2)
        turtle.down()
        turtle.dot(0.9 * pas, COULEUR_PERSONNAGE)
    
    
    # Attribution des valeurs 'invariables'
    matrice = lire_matrice('plan_chateau.txt')
    pas = calculer_pas(matrice)
    position = (0, 1)
    couleur = 'white'
    
    # Corps du programme
    afficher_plan(lire_matrice('plan_chateau.txt'))  # Affiche le plan du chateau
    dessine_point(coordonnees(position, pas))  # Affiche le personnage à sa position de départ.
    turtle.listen()  # Déclenche l’écoute du clavier
    turtle.onkeypress(deplacer_gauche, "Left")  # Associe à la touche Left une fonction appelée deplacer_gauche
    turtle.onkeypress(deplacer_droite, "Right")
    turtle.onkeypress(deplacer_haut, "Up")
    turtle.onkeypress(deplacer_bas, "Down")
    turtle.mainloop()  # Place le programme en position d’attente d’une action du joueur
    

    Bonne chance

    0